toolpack-sdk 2.0.0 → 2.1.1

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
@@ -1,4 +1,4 @@
1
- var Xb=Object.defineProperty;var h=(r,e)=>()=>(r&&(e=r(r=0)),e);var le=(r,e)=>{for(var t in e)Xb(r,t,{get:e[t],enumerable:!0})};import Yb from"path";import{fileURLToPath as Zb}from"url";var ew,tw,d,l=h(()=>{"use strict";ew=()=>Zb(import.meta.url),tw=()=>Yb.dirname(ew()),d=tw()});function cC(r){return!r||typeof r!="object"?!1:["CONTEXT_WINDOW_EXCEEDED","INSUFFICIENT_CONTEXT","SUMMARIZATION_ERROR","CONTEXT_WINDOW_CONFIG_ERROR","CONVERSATION_NOT_FOUND"].includes(r.code)}function pC(r,e){return r instanceof Er?{shouldRetry:r.isRetryable(),shouldFallback:!0,action:r.isRetryable()?"prune":"fail",message:r.getSuggestedRecovery()}:r instanceof _r?{shouldRetry:!1,shouldFallback:!0,action:r.strategy==="fail"?"prune":"none",message:`Context window exceeded. Strategy: ${r.strategy}`}:r instanceof $r?{shouldRetry:!1,shouldFallback:!0,action:"fail",message:"Insufficient context after recovery attempts"}:{shouldRetry:!1,shouldFallback:!1,action:"none",message:"Unknown context window error"}}var A,we,Pe,j,W,Qe,Yi,Zi,_r,$r,Er,ea,ta,ce=h(()=>{"use strict";l();A=class extends Error{constructor(t,o,n,s){super(t);this.code=o;this.statusCode=n;this.cause=s;this.name="SDKError"}code;statusCode;cause},we=class extends A{constructor(e,t){super(e,"AUTHENTICATION_ERROR",401,t),this.name="AuthenticationError"}},Pe=class extends A{constructor(t,o,n){super(t,"RATE_LIMIT_ERROR",429,n);this.retryAfter=o;this.name="RateLimitError"}retryAfter},j=class extends A{constructor(e,t){super(e,"INVALID_REQUEST_ERROR",400,t),this.name="InvalidRequestError"}},W=class extends A{constructor(e,t="PROVIDER_ERROR",o=500,n){super(e,t,o,n),this.name="ProviderError"}},Qe=class extends A{constructor(e,t){super(e,"CONNECTION_ERROR",503,t),this.name="ConnectionError"}},Yi=class extends A{constructor(t,o,n){super(t,"PAGE_ERROR",502,n);this.pageUrl=o;this.name="PageError"}pageUrl},Zi=class extends A{constructor(t,o,n){super(t,"TIMEOUT_ERROR",504,n);this.phase=o;this.name="TimeoutError"}phase},_r=class extends A{constructor(t,o,n,s,i,a){super(t,"CONTEXT_WINDOW_EXCEEDED",400,a);this.conversationId=o;this.currentTokens=n;this.contextWindowLimit=s;this.strategy=i;this.name="ContextWindowExceededError"}conversationId;currentTokens;contextWindowLimit;strategy;getOverageTokens(){return Math.max(0,this.currentTokens-this.contextWindowLimit)}getUsagePercentage(){return Math.round(this.currentTokens/this.contextWindowLimit*100)}getDetailedReport(){return`
1
+ var Zb=Object.defineProperty;var h=(r,e)=>()=>(r&&(e=r(r=0)),e);var ue=(r,e)=>{for(var t in e)Zb(r,t,{get:e[t],enumerable:!0})};import ew from"path";import{fileURLToPath as tw}from"url";var ow,nw,d,c=h(()=>{"use strict";ow=()=>tw(import.meta.url),nw=()=>ew.dirname(ow()),d=nw()});function mC(r){return!r||typeof r!="object"?!1:["CONTEXT_WINDOW_EXCEEDED","INSUFFICIENT_CONTEXT","SUMMARIZATION_ERROR","CONTEXT_WINDOW_CONFIG_ERROR","CONVERSATION_NOT_FOUND"].includes(r.code)}function dC(r,e){return r instanceof Dr?{shouldRetry:r.isRetryable(),shouldFallback:!0,action:r.isRetryable()?"prune":"fail",message:r.getSuggestedRecovery()}:r instanceof $r?{shouldRetry:!1,shouldFallback:!0,action:r.strategy==="fail"?"prune":"none",message:`Context window exceeded. Strategy: ${r.strategy}`}:r instanceof Er?{shouldRetry:!1,shouldFallback:!0,action:"fail",message:"Insufficient context after recovery attempts"}:{shouldRetry:!1,shouldFallback:!1,action:"none",message:"Unknown context window error"}}var A,xe,fe,L,q,Ve,Zi,ea,$r,Er,Dr,ta,oa,ae=h(()=>{"use strict";c();A=class extends Error{constructor(t,o,n,s){super(t);this.code=o;this.statusCode=n;this.cause=s;this.name="SDKError"}code;statusCode;cause},xe=class extends A{constructor(e,t){super(e,"AUTHENTICATION_ERROR",401,t),this.name="AuthenticationError"}},fe=class extends A{constructor(t,o,n){super(t,"RATE_LIMIT_ERROR",429,n);this.retryAfter=o;this.name="RateLimitError"}retryAfter},L=class extends A{constructor(e,t){super(e,"INVALID_REQUEST_ERROR",400,t),this.name="InvalidRequestError"}},q=class extends A{constructor(e,t="PROVIDER_ERROR",o=500,n){super(e,t,o,n),this.name="ProviderError"}},Ve=class extends A{constructor(e,t){super(e,"CONNECTION_ERROR",503,t),this.name="ConnectionError"}},Zi=class extends A{constructor(t,o,n){super(t,"PAGE_ERROR",502,n);this.pageUrl=o;this.name="PageError"}pageUrl},ea=class extends A{constructor(t,o,n){super(t,"TIMEOUT_ERROR",504,n);this.phase=o;this.name="TimeoutError"}phase},$r=class extends A{constructor(t,o,n,s,i,a){super(t,"CONTEXT_WINDOW_EXCEEDED",400,a);this.conversationId=o;this.currentTokens=n;this.contextWindowLimit=s;this.strategy=i;this.name="ContextWindowExceededError"}conversationId;currentTokens;contextWindowLimit;strategy;getOverageTokens(){return Math.max(0,this.currentTokens-this.contextWindowLimit)}getUsagePercentage(){return Math.round(this.currentTokens/this.contextWindowLimit*100)}getDetailedReport(){return`
2
2
  Context Window Exceeded
3
3
  =======================
4
4
  Conversation ID: ${this.conversationId}
@@ -9,7 +9,7 @@ Usage: ${this.getUsagePercentage()}%
9
9
  Strategy: ${this.strategy}
10
10
 
11
11
  Message: ${this.message}
12
- `.trim()}},$r=class extends A{constructor(t,o,n,s,i,a){super(t,"INSUFFICIENT_CONTEXT",400,a);this.conversationId=o;this.requiredTokens=n;this.availableTokens=s;this.minimumRequiredTokens=i;this.name="InsufficientContextError"}conversationId;requiredTokens;availableTokens;minimumRequiredTokens;getDeficit(){return Math.max(0,this.requiredTokens-this.availableTokens)}isRecoverable(){return this.availableTokens>=this.minimumRequiredTokens*.5}getDetailedReport(){return`
12
+ `.trim()}},Er=class extends A{constructor(t,o,n,s,i,a){super(t,"INSUFFICIENT_CONTEXT",400,a);this.conversationId=o;this.requiredTokens=n;this.availableTokens=s;this.minimumRequiredTokens=i;this.name="InsufficientContextError"}conversationId;requiredTokens;availableTokens;minimumRequiredTokens;getDeficit(){return Math.max(0,this.requiredTokens-this.availableTokens)}isRecoverable(){return this.availableTokens>=this.minimumRequiredTokens*.5}getDetailedReport(){return`
13
13
  Insufficient Context
14
14
  ====================
15
15
  Conversation ID: ${this.conversationId}
@@ -20,7 +20,7 @@ Minimum Required: ${this.minimumRequiredTokens}
20
20
  Recoverable: ${this.isRecoverable()?"Yes":"No"}
21
21
 
22
22
  Message: ${this.message}
23
- `.trim()}},Er=class extends A{constructor(t,o,n,s,i,a){super(t,"SUMMARIZATION_ERROR",500,a);this.conversationId=o;this.messageCount=n;this.failureReason=s;this.summaryAttempt=i;this.name="SummarizationError"}conversationId;messageCount;failureReason;summaryAttempt;isRetryable(){return this.failureReason==="provider_error"||this.failureReason==="insufficient_tokens"}getSuggestedRecovery(){switch(this.failureReason){case"provider_error":return"Retry the summarization request or switch to a different summarizer model";case"invalid_response":return"Review the summarizer prompt or use a different model";case"insufficient_tokens":return"Reduce the number of messages to summarize or increase the summary token budget";case"invalid_quality":return"Adjust summarization parameters or use a more capable model";default:return"Manual intervention required"}}getDetailedReport(){let t=`
23
+ `.trim()}},Dr=class extends A{constructor(t,o,n,s,i,a){super(t,"SUMMARIZATION_ERROR",500,a);this.conversationId=o;this.messageCount=n;this.failureReason=s;this.summaryAttempt=i;this.name="SummarizationError"}conversationId;messageCount;failureReason;summaryAttempt;isRetryable(){return this.failureReason==="provider_error"||this.failureReason==="insufficient_tokens"}getSuggestedRecovery(){switch(this.failureReason){case"provider_error":return"Retry the summarization request or switch to a different summarizer model";case"invalid_response":return"Review the summarizer prompt or use a different model";case"insufficient_tokens":return"Reduce the number of messages to summarize or increase the summary token budget";case"invalid_quality":return"Adjust summarization parameters or use a more capable model";default:return"Manual intervention required"}}getDetailedReport(){let t=`
24
24
  Summarization Error
25
25
  ===================
26
26
  Conversation ID: ${this.conversationId}
@@ -32,7 +32,7 @@ Recovery Action: ${this.getSuggestedRecovery()}
32
32
  Message: ${this.message}`;return this.summaryAttempt?t+`
33
33
 
34
34
  Partial Summary:
35
- ${this.summaryAttempt.substring(0,500)}${this.summaryAttempt.length>500?"...":""}`:t.trim()}},ea=class extends A{constructor(t,o,n,s,i){super(t,"CONTEXT_WINDOW_CONFIG_ERROR",400,i);this.configField=o;this.providedValue=n;this.constraint=s;this.name="ContextWindowConfigError"}configField;providedValue;constraint;getDetailedReport(){return`
35
+ ${this.summaryAttempt.substring(0,500)}${this.summaryAttempt.length>500?"...":""}`:t.trim()}},ta=class extends A{constructor(t,o,n,s,i){super(t,"CONTEXT_WINDOW_CONFIG_ERROR",400,i);this.configField=o;this.providedValue=n;this.constraint=s;this.name="ContextWindowConfigError"}configField;providedValue;constraint;getDetailedReport(){return`
36
36
  Context Window Configuration Error
37
37
  ===================================
38
38
  Field: ${this.configField}
@@ -40,48 +40,48 @@ Provided Value: ${JSON.stringify(this.providedValue)}
40
40
  Constraint: ${this.constraint}
41
41
 
42
42
  Message: ${this.message}
43
- `.trim()}},ta=class extends A{constructor(t,o,n){super(t,"CONVERSATION_NOT_FOUND",404,n);this.conversationId=o;this.name="ConversationNotFoundError"}conversationId}});var dw,re,Lt=h(()=>{"use strict";l();dw={enabled:!1,alwaysLoadedTools:[],alwaysLoadedCategories:[],searchResultLimit:5,cacheDiscoveredTools:!0},re={enabled:!0,autoExecute:!0,maxToolRounds:5,toolChoicePolicy:"auto",resultMaxChars:2e4,enabledTools:[],enabledToolCategories:[],toolSearch:dw}});import{appendFileSync as da,mkdirSync as uw}from"fs";import{dirname as fw,isAbsolute as gw,join as hw,resolve as yw}from"path";function ma(r){if(!r)return;let e=r.toLowerCase();if(e in Lr)return e;console.warn(`[Toolpack Warning] Invalid log level "${r}". Falling back to "info".`)}function ua(r){if(r?.enabled!==void 0&&(ft=r.enabled),r?.filePath&&(Te=r.filePath),r?.level&&(jt=ma(r.level)||"info"),process.env.TOOLPACK_SDK_LOG_ENABLED!==void 0&&(ft=process.env.TOOLPACK_SDK_LOG_ENABLED==="true"),process.env.TOOLPACK_SDK_LOG_FILE&&(Te=process.env.TOOLPACK_SDK_LOG_FILE,ft=!0),process.env.TOOLPACK_SDK_LOG_LEVEL&&(jt=ma(process.env.TOOLPACK_SDK_LOG_LEVEL)||jt),process.env.TOOLPACK_SDK_LOG_CONSOLE!==void 0&&(jr=process.env.TOOLPACK_SDK_LOG_CONSOLE==="true"),r?.console!==void 0&&process.env.TOOLPACK_SDK_LOG_CONSOLE===void 0&&(jr=r.console),ft)try{Te=gw(Te)?Te:yw(process.cwd(),Te),uw(fw(Te),{recursive:!0}),da(Te,`[${new Date().toISOString()}] [INFO] [Logger] initialized level=${jt} file=${Te}
44
- `)}catch(e){console.warn(`[Toolpack Warning] Failed to initialize log file "${Te}": ${e.message}`),ft=!1}}function Ye(r){return ft?Lr[r]<=Lr[jt]:!1}function Ft(r,e){if(!Ye(r))return;let o=`[${new Date().toISOString()}] [${r.toUpperCase()}] ${fa(e)}`;da(Te,o+`
45
- `),jr&&(r==="error"?console.error:r==="warn"?console.warn:console.log)(o)}function pe(r){Ft("error",r)}function I(r){Ft("warn",r)}function P(r){Ft("info",r)}function y(r){Ft("debug",r)}function Ae(r){Ft("trace",r)}function fa(r){return r.replace(/\bsk-[A-Za-z0-9_-]{10,}\b/g,"[REDACTED]").replace(/\bsk-proj-[A-Za-z0-9_-]{10,}\b/g,"[REDACTED]").replace(/\bAIza[0-9A-Za-z_-]{10,}\b/g,"[REDACTED]").replace(/\bBearer\s+[A-Za-z0-9._-]{10,}\b/g,"Bearer [REDACTED]").replace(/\bghs_[A-Za-z0-9]{10,}\b/g,"ghs_[REDACTED]").replace(/\bghp_[A-Za-z0-9]{10,}\b/g,"ghp_[REDACTED]").replace(/\bghu_[A-Za-z0-9]{10,}\b/g,"ghu_[REDACTED]").replace(/\bghr_[A-Za-z0-9]{10,}\b/g,"ghr_[REDACTED]")}function O(r,e=200){try{let t=typeof r=="string"?r:JSON.stringify(r),o=fa(t);return o.length<=e?o:`${o.slice(0,e)}\u2026`}catch{return"[Unserializable]"}}function Y(r,e,t){Ye("debug")&&(y(`[${e}][${r}] Messages (${t.length}):`),t.forEach((o,n)=>{y(`[${e}][${r}] #${n} role=${o?.role} content=${O(o?.content,300)}`)}))}var Lr,ft,jt,Te,jr,k=h(()=>{"use strict";l();Lr={error:0,warn:1,info:2,debug:3,trace:4},ft=!1,jt="info",Te=hw(process.cwd(),"toolpack-sdk.log"),jr=!1});var qt={};le(qt,{fetchUrlAsBase64:()=>Pa,getMimeType:()=>xa,isDataUri:()=>va,normalizeImagePart:()=>xw,parseDataUri:()=>Ca,readFileAsBase64:()=>ka,toDataUri:()=>Tw});import*as wa from"fs/promises";import*as Ta from"path";function xa(r){let e=Ta.extname(r).toLowerCase();return ww[e]||"application/octet-stream"}function va(r){return r.startsWith("data:")}function Ca(r){let e=r.match(/^data:(.*?);base64,(.+)$/);return e?{mimeType:e[1],data:e[2]}:null}function Tw(r,e){return`data:${e};base64,${r}`}async function ka(r){try{return{data:(await wa.readFile(r)).toString("base64"),mimeType:xa(r)}}catch(e){throw new j(`Failed to read image file: ${r}`,e)}}async function Pa(r){try{let e=await fetch(r);if(!e.ok)throw new Error(`HTTP ${e.status} ${e.statusText}`);let t=await e.arrayBuffer(),o=Buffer.from(t),n=e.headers.get("content-type")||"application/octet-stream";return n=n.split(";")[0].trim(),{data:o.toString("base64"),mimeType:n}}catch(e){throw new W(`Failed to download image from URL: ${r}`,"FETCH_ERROR",500,e)}}async function xw(r){if(r.type==="image_data")return{data:r.image_data.data,mimeType:r.image_data.mimeType};if(r.type==="image_file")return await ka(r.image_file.path);if(r.type==="image_url"){let e=r.image_url.url;if(va(e)){let t=Ca(e);if(!t)throw new j(`Malformed data URI provided in image_url: ${e.substring(0,50)}...`);return t}return await Pa(e)}throw new j(`Unknown ImagePart type: ${r.type}`)}var ww,gt=h(()=>{"use strict";l();ce();ww={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".gif":"image/gif",".heic":"image/heic",".heif":"image/heif"}});var Ma,Oa,Na,Aa,Ia,La=h(()=>{"use strict";l();Ma="fs.read_file",Oa="Read File",Na="Read the contents of a file at the given path. Returns the file content as a string.",Aa="filesystem",Ia={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path to read"},encoding:{type:"string",description:"File encoding (default: utf-8)",default:"utf-8"}},required:["path"]}});import*as yt from"fs";async function Ew(r){let e=r.path,t=r.encoding||"utf-8";if(y(`[fs.read-file] execute path="${e}" encoding=${t}`),!e)throw new Error("path is required");if(!yt.existsSync(e))throw new Error(`File not found: ${e}`);if(yt.statSync(e).isDirectory())throw new Error(`Path is a directory, not a file: ${e}`);return yt.readFileSync(e,t)}var Bt,Br=h(()=>{"use strict";l();La();k();Bt={name:Ma,displayName:Oa,description:Na,parameters:Ia,category:Aa,execute:Ew}});var ja,Fa,qa,Wa,Ua,Ga=h(()=>{"use strict";l();ja="fs.write_file",Fa="Write File",qa="Write content to a file. Creates parent directories if they do not exist. Overwrites existing files. IMPORTANT: Do NOT use this to delete/remove files - use fs.delete_file for that.",Wa="filesystem",Ua={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path to write"},content:{type:"string",description:"Content to write to the file"},encoding:{type:"string",description:"File encoding (default: utf-8)",default:"utf-8"}},required:["path","content"]}});import*as bt from"fs";import*as Ba from"path";async function Dw(r){let e=r.path,t=r.content,o=r.encoding||"utf-8";if(y(`[fs.write-file] execute path="${e}" encoding=${o} content_len=${t?.length??0}`),!e)throw new Error("path is required");if(t==null)throw new Error("content is required");let n=Ba.dirname(e);return bt.existsSync(n)||bt.mkdirSync(n,{recursive:!0}),bt.writeFileSync(e,t,o),`File written successfully: ${e} (${Buffer.byteLength(t,o)} bytes)`}var zt,zr=h(()=>{"use strict";l();Ga();k();zt={name:ja,displayName:Fa,description:qa,parameters:Ua,category:Wa,execute:Dw,confirmation:{level:"high",reason:"This will overwrite the entire file contents.",showArgs:["path"]}}});var za,Ha,Ka,Ja,Va,Qa=h(()=>{"use strict";l();za="fs.append_file",Ha="Append File",Ka="Append content to the end of a file. Creates the file if it does not exist.",Ja="filesystem",Va={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path to append to"},content:{type:"string",description:"Content to append to the file"},encoding:{type:"string",description:"File encoding (default: utf-8)",default:"utf-8"}},required:["path","content"]}});import*as wt from"fs";import*as Xa from"path";async function Mw(r){let e=r.path,t=r.content,o=r.encoding||"utf-8";if(!e)throw new Error("path is required");if(t==null)throw new Error("content is required");let n=Xa.dirname(e);return wt.existsSync(n)||wt.mkdirSync(n,{recursive:!0}),wt.appendFileSync(e,t,o),`Content appended to: ${e} (${Buffer.byteLength(t,o)} bytes appended)`}var Ht,Hr=h(()=>{"use strict";l();Qa();Ht={name:za,displayName:Ha,description:Ka,parameters:Va,category:Ja,execute:Mw,confirmation:{level:"medium",reason:"This will modify the file by appending content.",showArgs:["path"]}}});var Ya,Za,el,tl,ol,nl=h(()=>{"use strict";l();Ya="fs.delete_file",Za="Delete File",el="Remove/delete a file from the filesystem. Does not delete directories.",tl="filesystem",ol={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path to delete"}},required:["path"]}});import*as Tt from"fs";async function Ow(r){let e=r.path;if(y(`[fs.delete-file] execute path="${e}"`),!e)throw new Error("path is required");if(!Tt.existsSync(e))throw new Error(`File not found: ${e}`);if(Tt.statSync(e).isDirectory())throw new Error(`Path is a directory, not a file: ${e}. Use a different tool to remove directories.`);return Tt.unlinkSync(e),`File deleted successfully: ${e}`}var Kt,Kr=h(()=>{"use strict";l();nl();k();Kt={name:Ya,displayName:Za,description:el,parameters:ol,category:tl,execute:Ow,confirmation:{level:"high",reason:"This will permanently delete the file. This action cannot be undone.",showArgs:["path"]}}});var rl,sl,il,al,ll,cl=h(()=>{"use strict";l();rl="fs.exists",sl="Exists",il="Check if a file or directory exists at the given path. Returns true or false.",al="filesystem",ll={type:"object",properties:{path:{type:"string",description:"Absolute or relative path to check"}},required:["path"]}});import*as pl from"fs";async function Nw(r){let e=r.path;if(!e)throw new Error("path is required");let t=pl.existsSync(e);return JSON.stringify({exists:t,path:e})}var Jt,Jr=h(()=>{"use strict";l();cl();Jt={name:rl,displayName:sl,description:il,parameters:ll,category:al,execute:Nw}});var ml,dl,ul,fl,gl,hl=h(()=>{"use strict";l();ml="fs.stat",dl="Stat",ul="Get file or directory information including size, type, and modification date.",fl="filesystem",gl={type:"object",properties:{path:{type:"string",description:"Absolute or relative path to get info for"}},required:["path"]}});import*as _n from"fs";async function Aw(r){let e=r.path;if(!e)throw new Error("path is required");if(!_n.existsSync(e))throw new Error(`Path not found: ${e}`);let t=_n.statSync(e);return JSON.stringify({path:e,type:t.isDirectory()?"directory":t.isFile()?"file":"other",size:t.size,created:t.birthtime.toISOString(),modified:t.mtime.toISOString(),accessed:t.atime.toISOString(),permissions:t.mode.toString(8)})}var Vt,Vr=h(()=>{"use strict";l();hl();Vt={name:ml,displayName:dl,description:ul,parameters:gl,category:fl,execute:Aw}});var yl,bl,wl,Tl,xl,vl=h(()=>{"use strict";l();yl="fs.list_dir",bl="List Directory",wl="List files and directories at the given path. Optionally recurse into subdirectories.",Tl="filesystem",xl={type:"object",properties:{path:{type:"string",description:"Absolute or relative directory path to list"},recursive:{type:"boolean",description:"Whether to list recursively (default: false)",default:!1}},required:["path"]}});import*as tt from"fs";import*as Cl from"path";function kl(r,e,t,o=""){let n=tt.readdirSync(r,{withFileTypes:!0});for(let s of n){let i=Cl.join(r,s.name),a=o?`${o}/${s.name}`:s.name;if(s.isDirectory())t.push({name:a,type:"directory",size:0}),e&&kl(i,!0,t,a);else if(s.isFile()){let c=tt.statSync(i);t.push({name:a,type:"file",size:c.size})}}}async function Iw(r){let e=r.path,t=r.recursive===!0;if(!e)throw new Error("path is required");if(!tt.existsSync(e))throw new Error(`Directory not found: ${e}`);if(!tt.statSync(e).isDirectory())throw new Error(`Path is not a directory: ${e}`);let n=[];return kl(e,t,n),JSON.stringify(n,null,2)}var Qt,Qr=h(()=>{"use strict";l();vl();Qt={name:yl,displayName:bl,description:wl,parameters:xl,category:Tl,execute:Iw}});var Pl,Sl,Rl,_l,$l,El=h(()=>{"use strict";l();Pl="fs.create_dir",Sl="Create Directory",Rl="Create a directory at the given path. Creates parent directories recursively if they do not exist.",_l="filesystem",$l={type:"object",properties:{path:{type:"string",description:"Absolute or relative directory path to create"},recursive:{type:"boolean",description:"Create parent directories if they do not exist (default: true)",default:!0}},required:["path"]}});import*as xt from"fs";async function Lw(r){let e=r.path,t=r.recursive!==!1;if(!e)throw new Error("path is required");if(xt.existsSync(e)){if(xt.statSync(e).isDirectory())return`Directory already exists: ${e}`;throw new Error(`Path exists but is not a directory: ${e}`)}return xt.mkdirSync(e,{recursive:t}),`Directory created: ${e}`}var Xt,Xr=h(()=>{"use strict";l();El();Xt={name:Pl,displayName:Sl,description:Rl,parameters:$l,category:_l,execute:Lw}});var Dl,Ml,Ol,Nl,Al,Il=h(()=>{"use strict";l();Dl="fs.move",Ml="Move",Ol="Move or rename a file or directory from one path to another.",Nl="filesystem",Al={type:"object",properties:{path:{type:"string",description:"Source path (file or directory)"},new_path:{type:"string",description:"Destination path"}},required:["path","new_path"]}});import*as ot from"fs";import*as Ll from"path";async function jw(r){let e=r.path,t=r.new_path;if(!e)throw new Error("path is required");if(!t)throw new Error("new_path is required");if(!ot.existsSync(e))throw new Error(`Source not found: ${e}`);let o=Ll.dirname(t);return ot.existsSync(o)||ot.mkdirSync(o,{recursive:!0}),ot.renameSync(e,t),`Moved: ${e} \u2192 ${t}`}var Yt,Yr=h(()=>{"use strict";l();Il();Yt={name:Dl,displayName:Ml,description:Ol,parameters:Al,category:Nl,execute:jw,confirmation:{level:"high",reason:"This will move/rename the file or directory, potentially overwriting the destination.",showArgs:["path","new_path"]}}});var jl,Fl,ql,Wl,Ul,Gl=h(()=>{"use strict";l();jl="fs.copy",Fl="Copy",ql="Copy a file or directory from one path to another. Recursively copies directories.",Wl="filesystem",Ul={type:"object",properties:{path:{type:"string",description:"Source path (file or directory)"},new_path:{type:"string",description:"Destination path"}},required:["path","new_path"]}});import*as se from"fs";import*as Zt from"path";function Bl(r,e){if(se.statSync(r).isDirectory()){se.existsSync(e)||se.mkdirSync(e,{recursive:!0});let o=se.readdirSync(r);for(let n of o)Bl(Zt.join(r,n),Zt.join(e,n))}else se.copyFileSync(r,e)}async function Fw(r){let e=r.path,t=r.new_path;if(!e)throw new Error("path is required");if(!t)throw new Error("new_path is required");if(!se.existsSync(e))throw new Error(`Source not found: ${e}`);let o=Zt.dirname(t);return se.existsSync(o)||se.mkdirSync(o,{recursive:!0}),Bl(e,t),`Copied ${se.statSync(e).isDirectory()?"directory":"file"}: ${e} \u2192 ${t}`}var eo,Zr=h(()=>{"use strict";l();Gl();eo={name:jl,displayName:Fl,description:ql,parameters:Ul,category:Wl,execute:Fw,confirmation:{level:"medium",reason:"This will copy files or directories, potentially overwriting the destination.",showArgs:["path","new_path"]}}});var zl,Hl,Kl,Jl,Vl,Ql=h(()=>{"use strict";l();zl="fs.read_file_range",Hl="Read File Range",Kl="Read a specific range of lines from a file. Useful for reading portions of large files without loading the entire content.",Jl="filesystem",Vl={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path to read"},start_line:{type:"integer",description:"Start line number (1-indexed)"},end_line:{type:"integer",description:"End line number (1-indexed, inclusive)"}},required:["path","start_line","end_line"]}});import*as vt from"fs";async function qw(r){let e=r.path,t=r.start_line,o=r.end_line;if(!e)throw new Error("path is required");if(t==null)throw new Error("start_line is required");if(o==null)throw new Error("end_line is required");if(t<1)throw new Error("start_line must be >= 1");if(o<t)throw new Error("end_line must be >= start_line");if(!vt.existsSync(e))throw new Error(`File not found: ${e}`);if(vt.statSync(e).isDirectory())throw new Error(`Path is a directory, not a file: ${e}`);let i=vt.readFileSync(e,"utf-8").split(`
46
- `),a=i.length,c=Math.min(t,a),p=Math.min(o,a),f=i.slice(c-1,p).map((g,w)=>`${c+w}: ${g}`).join(`
47
- `);return`Lines ${c}-${p} of ${a} total:
48
- ${f}`}var to,es=h(()=>{"use strict";l();Ql();to={name:zl,displayName:Hl,description:Kl,parameters:Vl,category:Jl,execute:qw}});var Xl,Yl,Zl,ec,tc,oc=h(()=>{"use strict";l();Xl="fs.search",Yl="Search",Zl="Search for text in files within a directory. Returns matching lines with file paths and line numbers.",ec="filesystem",tc={type:"object",properties:{path:{type:"string",description:"Directory path to search in"},query:{type:"string",description:"Text or pattern to search for"},recursive:{type:"boolean",description:"Search recursively in subdirectories (default: true)",default:!0},max_results:{type:"integer",description:"Maximum number of matching lines to return (default: 50)",default:50},regex:{type:"boolean",description:"Treat query as a regular expression (default: false)",default:!1},case_sensitive:{type:"boolean",description:"Perform case-sensitive search. If false, search is case-insensitive (default: false)",default:!1}},required:["path","query"]}});import*as Le from"fs";import*as nc from"path";function Ww(r,e,t,o){try{let s=Le.readFileSync(r,"utf-8").split(`
49
- `);for(let i=0;i<s.length&&t.length<o;i++){let a=s[i];(typeof e=="string"?a.includes(e):e.test(a))&&t.push({file:r,line:i+1,content:a.trim()})}}catch{}}function rc(r,e,t,o,n){let s=Le.readdirSync(r,{withFileTypes:!0});for(let i of s){if(o.length>=n)break;let a=nc.join(r,i.name);i.isDirectory()&&t?rc(a,e,!0,o,n):i.isFile()&&Ww(a,e,o,n)}}async function Uw(r){let e=r.path,t=r.query,o=r.recursive!==!1,n=r.max_results||50,s=!!r.regex,i=!!r.case_sensitive;if(y(`[fs.search] execute path="${e}" query="${t}" recursive=${o} regex=${s} caseSensitive=${i}`),!e)throw new Error("path is required");if(!t)throw new Error("query is required");let a=t;if(s||!i){let f=t;s||(f=f.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));let g=i?"":"i";a=new RegExp(f,g)}if(!Le.existsSync(e))throw new Error(`Directory not found: ${e}`);if(!Le.statSync(e).isDirectory())throw new Error(`Path is not a directory: ${e}`);let p=[];if(rc(e,a,o,p,n),p.length===0)return`No matches found for "${t}" in ${e}`;let m=p.length>=n?`
50
- (results capped at ${n})`:"";return JSON.stringify(p,null,2)+m}var oo,ts=h(()=>{"use strict";l();oc();k();oo={name:Xl,displayName:Yl,description:Zl,parameters:tc,category:ec,execute:Uw}});var sc,ic,ac,lc,cc,pc=h(()=>{"use strict";l();sc="fs.replace_in_file",ic="Replace In File",ac="Find and replace text in a file. Returns the number of replacements made.",lc="filesystem",cc={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path"},search:{type:"string",description:"Text to search for"},replace:{type:"string",description:"Text to replace with"}},required:["path","search","replace"]}});import*as je from"fs";async function Gw(r){let e=r.path,t=r.search,o=r.replace;if(!e)throw new Error("path is required");if(!t)throw new Error("search is required");if(o==null)throw new Error("replace is required");if(!je.existsSync(e))throw new Error(`File not found: ${e}`);if(je.statSync(e).isDirectory())throw new Error(`Path is a directory, not a file: ${e}`);let s=je.readFileSync(e,"utf-8"),i=0,a=0;for(;(a=s.indexOf(t,a))!==-1;)i++,a+=t.length;if(i===0)return`No occurrences of "${t}" found in ${e}`;let c=s.split(t).join(o);return je.writeFileSync(e,c,"utf-8"),`Replaced ${i} occurrence(s) in ${e}`}var no,os=h(()=>{"use strict";l();pc();no={name:sc,displayName:ic,description:ac,parameters:cc,category:lc,execute:Gw,confirmation:{level:"high",reason:"This will perform a global find-and-replace operation that may corrupt the file if the pattern is incorrect.",showArgs:["path","search","replace"]}}});var mc,dc,uc,fc,gc,hc=h(()=>{"use strict";l();mc="fs.tree",dc="Tree",uc="Get a tree representation of a directory structure. Useful for understanding project layout at a glance.",fc="filesystem",gc={type:"object",properties:{path:{type:"string",description:"Absolute or relative directory path"},depth:{type:"integer",description:"Maximum depth to traverse (default: 3)",default:3}},required:["path"]}});import*as Ct from"fs";import*as $n from"path";function yc(r,e,t,o,n){if(t>o)return;let i=Ct.readdirSync(r,{withFileTypes:!0}).sort((a,c)=>a.isDirectory()&&!c.isDirectory()?-1:!a.isDirectory()&&c.isDirectory()?1:a.name.localeCompare(c.name));for(let a=0;a<i.length;a++){let c=i[a],p=a===i.length-1,m=p?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",f=p?" ":"\u2502 ";c.isDirectory()?(n.push(`${e}${m}${c.name}/`),yc($n.join(r,c.name),e+f,t+1,o,n)):n.push(`${e}${m}${c.name}`)}}async function Bw(r){let e=r.path,t=r.depth||3;if(!e)throw new Error("path is required");if(!Ct.existsSync(e))throw new Error(`Directory not found: ${e}`);if(!Ct.statSync(e).isDirectory())throw new Error(`Path is not a directory: ${e}`);let s=[`${$n.basename(e)}/`];return yc(e,"",1,t,s),s.join(`
51
- `)}var ro,ns=h(()=>{"use strict";l();hc();ro={name:mc,displayName:dc,description:uc,parameters:gc,category:fc,execute:Bw}});var bc,wc,Tc,xc,vc,Cc=h(()=>{"use strict";l();bc="fs.glob",wc="Glob Pattern Match",Tc='Find files matching glob patterns (e.g., "**/*.ts", "src/**/*.test.js")',xc="filesystem",vc={type:"object",properties:{pattern:{type:"string",description:'Glob pattern to match files (e.g., "**/*.ts", "src/**/*.json")'},cwd:{type:"string",description:"Root directory to search from (defaults to current working directory)"},ignore:{type:"array",items:{type:"string"},description:'Patterns to ignore (e.g., ["node_modules/**", "dist/**"])'},onlyFiles:{type:"boolean",description:"Return only files, not directories (default: true)"},onlyDirectories:{type:"boolean",description:"Return only directories, not files (default: false)"},absolute:{type:"boolean",description:"Return absolute paths instead of relative (default: false)"}},required:["pattern"]}});import zw from"fast-glob";async function Hw(r){let e=r.pattern,t=r.cwd,o=r.ignore,n=r.onlyFiles!==!1,s=r.onlyDirectories===!0,i=r.absolute===!0;if(!e)throw new Error("pattern is required");let a=e.replace(/\\/g,"/");try{let c=await zw(a,{cwd:t||process.cwd(),ignore:o||["node_modules/**",".git/**"],onlyFiles:n,onlyDirectories:s,absolute:i,dot:!0});return JSON.stringify({pattern:e,files:c,count:c.length},null,2)}catch(c){throw new Error(`Failed to glob pattern "${e}": ${c.message}`)}}var so,rs=h(()=>{"use strict";l();Cc();so={name:bc,displayName:wc,description:Tc,parameters:vc,category:xc,execute:Hw}});var kc,Pc,Sc,Rc,_c,$c=h(()=>{"use strict";l();kc="fs.delete_dir",Pc="Delete Directory",Sc="Delete a directory and all its contents recursively",Rc="filesystem",_c={type:"object",properties:{path:{type:"string",description:"Absolute or relative path to the directory to delete"},force:{type:"boolean",description:"Force deletion even if directory is not empty (default: true)"}},required:["path"]}});import{rm as Kw}from"fs/promises";import{existsSync as Jw,statSync as Vw}from"fs";async function Qw(r){let e=r.path,t=r.force!==!1;if(!e)throw new Error("path is required");if(!Jw(e))throw new Error(`Directory does not exist: ${e}`);if(!Vw(e).isDirectory())throw new Error(`Path is not a directory: ${e}`);try{return await Kw(e,{recursive:!0,force:t}),`Directory deleted successfully: ${e}`}catch(n){throw new Error(`Failed to delete directory "${e}": ${n.message}`)}}var io,ss=h(()=>{"use strict";l();$c();io={name:kc,displayName:Pc,description:Sc,parameters:_c,category:Rc,execute:Qw,confirmation:{level:"high",reason:"This will recursively delete the directory and all its contents. This action cannot be undone.",showArgs:["path"]}}});var Ec,Dc,Mc,Oc,Nc,Ac=h(()=>{"use strict";l();Ec="fs.batch_read",Dc="Batch Read Files",Mc="Read multiple files efficiently in one operation. Returns content for each file or error if read fails.",Oc="filesystem",Nc={type:"object",properties:{paths:{type:"array",items:{type:"string"},description:"Array of file paths to read"},encoding:{type:"string",description:"File encoding (default: utf-8)"},continueOnError:{type:"boolean",description:"Continue reading other files if one fails (default: true)"}},required:["paths"]}});import{readFile as Xw}from"fs/promises";async function Yw(r){let e=r.paths,t=r.encoding||"utf-8",o=r.continueOnError!==!1;if(!e||!Array.isArray(e)||e.length===0)throw new Error("paths array is required and must not be empty");let n=[],s=0,i=0;for(let a of e)try{let c=await Xw(a,t);n.push({path:a,content:c,success:!0}),s++}catch(c){let p=c.message;if(n.push({path:a,error:p,success:!1}),i++,!o)throw new Error(`Failed to read file "${a}": ${p}`)}return JSON.stringify({total:e.length,success:s,failed:i,results:n},null,2)}var ao,is=h(()=>{"use strict";l();Ac();ao={name:Ec,displayName:Dc,description:Mc,parameters:Nc,category:Oc,execute:Yw}});var Ic,Lc,jc,Fc,qc,Wc=h(()=>{"use strict";l();Ic="fs.batch_write",Lc="Batch Write Files",jc="Write multiple files atomically in one operation. If atomic mode is enabled, all writes succeed or all are rolled back on failure.",Fc="filesystem",qc={type:"object",properties:{files:{type:"array",items:{type:"object",properties:{path:{type:"string"},content:{type:"string"}}},description:"Array of files to write, each with path and content"},encoding:{type:"string",description:"File encoding (default: utf-8)"},atomic:{type:"boolean",description:"Atomic mode: rollback all writes if any fails (default: true)"},createDirs:{type:"boolean",description:"Create parent directories if they don't exist (default: true)"}},required:["files"]}});import{writeFile as Uc,mkdir as Zw,readFile as eT,unlink as tT}from"fs/promises";import{dirname as oT,resolve as nT}from"path";import{existsSync as Gc}from"fs";async function rT(r){let e=r.files,t=r.encoding||"utf-8",o=r.atomic!==!1,n=r.createDirs!==!1;if(!e||!Array.isArray(e)||e.length===0)throw new Error("files array is required and must not be empty");for(let a of e)if(!a.path||a.content===void 0)throw new Error("Each file must have path and content properties");let s=[],i=[];try{for(let a of e){let c=nT(a.path);if(o){let p=Gc(c),m={path:c,existed:p};p&&(m.originalContent=await eT(c,t)),s.push(m)}if(n){let p=oT(c);await Zw(p,{recursive:!0})}await Uc(c,a.content,t),i.push(c)}return JSON.stringify({success:!0,written:i.length,files:i},null,2)}catch(a){if(o&&s.length>0){for(let c of s)try{c.existed&&c.originalContent!==void 0?await Uc(c.path,c.originalContent,t):!c.existed&&Gc(c.path)&&await tT(c.path)}catch{}throw new Error(`Batch write failed and rolled back: ${a.message}`)}throw new Error(`Batch write failed: ${a.message}`)}}var lo,as=h(()=>{"use strict";l();Wc();lo={name:Ic,displayName:Lc,description:jc,parameters:qc,category:Fc,execute:rT,confirmation:{level:"high",reason:"This will overwrite multiple files at once.",showArgs:["files"]}}});var zc={};le(zc,{fsAppendFileTool:()=>Ht,fsBatchReadTool:()=>ao,fsBatchWriteTool:()=>lo,fsCopyTool:()=>eo,fsCreateDirTool:()=>Xt,fsDeleteDirTool:()=>io,fsDeleteFileTool:()=>Kt,fsExistsTool:()=>Jt,fsGlobTool:()=>so,fsListDirTool:()=>Qt,fsMoveTool:()=>Yt,fsReadFileRangeTool:()=>to,fsReadFileTool:()=>Bt,fsReplaceInFileTool:()=>no,fsSearchTool:()=>oo,fsStatTool:()=>Vt,fsToolsProject:()=>Bc,fsTreeTool:()=>ro,fsWriteFileTool:()=>zt});var Bc,ls=h(()=>{"use strict";l();Br();zr();Hr();Kr();Jr();Vr();Qr();Xr();Yr();Zr();es();ts();os();ns();rs();ss();is();as();Br();zr();Hr();Kr();Jr();Vr();Qr();Xr();Yr();Zr();es();ts();os();ns();rs();ss();is();as();Bc={manifest:{key:"fs",name:"fs-tools",displayName:"File System",version:"1.0.0",description:"File system tools for reading, writing, searching, and managing files and directories.",author:"Sajeer",tools:["fs.read_file","fs.write_file","fs.append_file","fs.delete_file","fs.exists","fs.stat","fs.list_dir","fs.create_dir","fs.move","fs.copy","fs.read_file_range","fs.search","fs.replace_in_file","fs.tree","fs.glob","fs.delete_dir","fs.batch_read","fs.batch_write"],category:"filesystem"},tools:[Bt,zt,Ht,Kt,Jt,Vt,Qt,Xt,Yt,eo,to,oo,no,ro,so,io,ao,lo],dependencies:{"fast-glob":"^3.3.2"}}});var Hc,Kc,Jc,Vc,Qc,Xc=h(()=>{"use strict";l();Hc="exec.run",Kc="Run",Jc="Execute a command directly (without shell) and return its output. Use exec.run_shell for pipes, redirects, or shell features.",Vc="execution",Qc={type:"object",properties:{command:{type:"string",description:"The command to execute"},cwd:{type:"string",description:"Working directory for the command (optional)"},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["command"]}});import{execSync as sT}from"child_process";async function iT(r){let e=r.command,t=r.cwd,o=r.timeout||3e4;if(!e)throw new Error("command is required");y(`[exec.run] execute command="${e.substring(0,100)}" cwd=${t??"default"} timeout=${o}ms`);try{return sT(e,{cwd:t,timeout:o,encoding:"utf-8",maxBuffer:10485760,stdio:["pipe","pipe","pipe"]})||"(command completed with no output)"}catch(n){let s=n.stdout||"",i=n.stderr||"";return`Command failed (exit code ${n.status??"unknown"}):
43
+ `.trim()}},oa=class extends A{constructor(t,o,n){super(t,"CONVERSATION_NOT_FOUND",404,n);this.conversationId=o;this.name="ConversationNotFoundError"}conversationId}});var fw,le,jt=h(()=>{"use strict";c();fw={enabled:!1,alwaysLoadedTools:[],alwaysLoadedCategories:[],searchResultLimit:5,cacheDiscoveredTools:!0},le={enabled:!0,autoExecute:!0,maxToolRounds:5,toolChoicePolicy:"auto",resultMaxChars:2e4,enabledTools:[],enabledToolCategories:[],toolSearch:fw}});import{appendFileSync as fa,mkdirSync as gw}from"fs";import{dirname as hw,isAbsolute as yw,join as bw,resolve as ww}from"path";function ua(r){if(!r)return;let e=r.toLowerCase();if(e in jr)return e;console.warn(`[Toolpack Warning] Invalid log level "${r}". Falling back to "info".`)}function ga(r){if(r?.enabled!==void 0&&(gt=r.enabled),r?.filePath&&(ve=r.filePath),r?.level&&(Ft=ua(r.level)||"info"),process.env.TOOLPACK_SDK_LOG_ENABLED!==void 0&&(gt=process.env.TOOLPACK_SDK_LOG_ENABLED==="true"),process.env.TOOLPACK_SDK_LOG_FILE&&(ve=process.env.TOOLPACK_SDK_LOG_FILE,gt=!0),process.env.TOOLPACK_SDK_LOG_LEVEL&&(Ft=ua(process.env.TOOLPACK_SDK_LOG_LEVEL)||Ft),process.env.TOOLPACK_SDK_LOG_CONSOLE!==void 0&&(Fr=process.env.TOOLPACK_SDK_LOG_CONSOLE==="true"),r?.console!==void 0&&process.env.TOOLPACK_SDK_LOG_CONSOLE===void 0&&(Fr=r.console),gt)try{ve=yw(ve)?ve:ww(process.cwd(),ve),gw(hw(ve),{recursive:!0}),fa(ve,`[${new Date().toISOString()}] [INFO] [Logger] initialized level=${Ft} file=${ve}
44
+ `)}catch(e){console.warn(`[Toolpack Warning] Failed to initialize log file "${ve}": ${e.message}`),gt=!1}}function Xe(r){return gt?jr[r]<=jr[Ft]:!1}function qt(r,e){if(!Xe(r))return;let o=`[${new Date().toISOString()}] [${r.toUpperCase()}] ${ha(e)}`;fa(ve,o+`
45
+ `),Fr&&(r==="error"?console.error:r==="warn"?console.warn:console.log)(o)}function ce(r){qt("error",r)}function I(r){qt("warn",r)}function S(r){qt("info",r)}function y(r){qt("debug",r)}function Ae(r){qt("trace",r)}function ha(r){return r.replace(/\bsk-[A-Za-z0-9_-]{10,}\b/g,"[REDACTED]").replace(/\bsk-proj-[A-Za-z0-9_-]{10,}\b/g,"[REDACTED]").replace(/\bAIza[0-9A-Za-z_-]{10,}\b/g,"[REDACTED]").replace(/\bBearer\s+[A-Za-z0-9._-]{10,}\b/g,"Bearer [REDACTED]").replace(/\bghs_[A-Za-z0-9]{10,}\b/g,"ghs_[REDACTED]").replace(/\bghp_[A-Za-z0-9]{10,}\b/g,"ghp_[REDACTED]").replace(/\bghu_[A-Za-z0-9]{10,}\b/g,"ghu_[REDACTED]").replace(/\bghr_[A-Za-z0-9]{10,}\b/g,"ghr_[REDACTED]")}function O(r,e=200){try{let t=typeof r=="string"?r:JSON.stringify(r),o=ha(t);return o.length<=e?o:`${o.slice(0,e)}\u2026`}catch{return"[Unserializable]"}}function ee(r,e,t){Xe("debug")&&(y(`[${e}][${r}] Messages (${t.length}):`),t.forEach((o,n)=>{y(`[${e}][${r}] #${n} role=${o?.role} content=${O(o?.content,300)}`)}))}var jr,gt,Ft,ve,Fr,k=h(()=>{"use strict";c();jr={error:0,warn:1,info:2,debug:3,trace:4},gt=!1,Ft="info",ve=bw(process.cwd(),"toolpack-sdk.log"),Fr=!1});var Wt={};ue(Wt,{fetchUrlAsBase64:()=>Ra,getMimeType:()=>Ca,isDataUri:()=>Pa,normalizeImagePart:()=>Cw,parseDataUri:()=>ka,readFileAsBase64:()=>Sa,toDataUri:()=>vw});import*as xa from"fs/promises";import*as va from"path";function Ca(r){let e=va.extname(r).toLowerCase();return xw[e]||"application/octet-stream"}function Pa(r){return r.startsWith("data:")}function ka(r){let e=r.match(/^data:(.*?);base64,(.+)$/);return e?{mimeType:e[1],data:e[2]}:null}function vw(r,e){return`data:${e};base64,${r}`}async function Sa(r){try{return{data:(await xa.readFile(r)).toString("base64"),mimeType:Ca(r)}}catch(e){throw new L(`Failed to read image file: ${r}`,e)}}async function Ra(r){try{let e=await fetch(r);if(!e.ok)throw new Error(`HTTP ${e.status} ${e.statusText}`);let t=await e.arrayBuffer(),o=Buffer.from(t),n=e.headers.get("content-type")||"application/octet-stream";return n=n.split(";")[0].trim(),{data:o.toString("base64"),mimeType:n}}catch(e){throw new q(`Failed to download image from URL: ${r}`,"FETCH_ERROR",500,e)}}async function Cw(r){if(r.type==="image_data")return{data:r.image_data.data,mimeType:r.image_data.mimeType};if(r.type==="image_file")return await Sa(r.image_file.path);if(r.type==="image_url"){let e=r.image_url.url;if(Pa(e)){let t=ka(e);if(!t)throw new L(`Malformed data URI provided in image_url: ${e.substring(0,50)}...`);return t}return await Ra(e)}throw new L(`Unknown ImagePart type: ${r.type}`)}var xw,ht=h(()=>{"use strict";c();ae();xw={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".gif":"image/gif",".heic":"image/heic",".heif":"image/heif"}});var Na,Aa,Ia,La,ja,Fa=h(()=>{"use strict";c();Na="fs.read_file",Aa="Read File",Ia="Read the contents of a file at the given path. Returns the file content as a string.",La="filesystem",ja={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path to read"},encoding:{type:"string",description:"File encoding (default: utf-8)",default:"utf-8"}},required:["path"]}});import*as bt from"fs";async function Mw(r){let e=r.path,t=r.encoding||"utf-8";if(y(`[fs.read-file] execute path="${e}" encoding=${t}`),!e)throw new Error("path is required");if(!bt.existsSync(e))throw new Error(`File not found: ${e}`);if(bt.statSync(e).isDirectory())throw new Error(`Path is a directory, not a file: ${e}`);return bt.readFileSync(e,t)}var zt,zr=h(()=>{"use strict";c();Fa();k();zt={name:Na,displayName:Aa,description:Ia,parameters:ja,category:La,execute:Mw}});var qa,Wa,Ua,Ga,Ba,za=h(()=>{"use strict";c();qa="fs.write_file",Wa="Write File",Ua="Write content to a file. Creates parent directories if they do not exist. Overwrites existing files. IMPORTANT: Do NOT use this to delete/remove files - use fs.delete_file for that.",Ga="filesystem",Ba={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path to write"},content:{type:"string",description:"Content to write to the file"},encoding:{type:"string",description:"File encoding (default: utf-8)",default:"utf-8"}},required:["path","content"]}});import*as wt from"fs";import*as Ha from"path";async function Ow(r){let e=r.path,t=r.content,o=r.encoding||"utf-8";if(y(`[fs.write-file] execute path="${e}" encoding=${o} content_len=${t?.length??0}`),!e)throw new Error("path is required");if(t==null)throw new Error("content is required");let n=Ha.dirname(e);return wt.existsSync(n)||wt.mkdirSync(n,{recursive:!0}),wt.writeFileSync(e,t,o),`File written successfully: ${e} (${Buffer.byteLength(t,o)} bytes)`}var Ht,Hr=h(()=>{"use strict";c();za();k();Ht={name:qa,displayName:Wa,description:Ua,parameters:Ba,category:Ga,execute:Ow,confirmation:{level:"high",reason:"This will overwrite the entire file contents.",showArgs:["path"]}}});var Ka,Ja,Va,Qa,Xa,Ya=h(()=>{"use strict";c();Ka="fs.append_file",Ja="Append File",Va="Append content to the end of a file. Creates the file if it does not exist.",Qa="filesystem",Xa={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path to append to"},content:{type:"string",description:"Content to append to the file"},encoding:{type:"string",description:"File encoding (default: utf-8)",default:"utf-8"}},required:["path","content"]}});import*as Tt from"fs";import*as Za from"path";async function Nw(r){let e=r.path,t=r.content,o=r.encoding||"utf-8";if(!e)throw new Error("path is required");if(t==null)throw new Error("content is required");let n=Za.dirname(e);return Tt.existsSync(n)||Tt.mkdirSync(n,{recursive:!0}),Tt.appendFileSync(e,t,o),`Content appended to: ${e} (${Buffer.byteLength(t,o)} bytes appended)`}var Kt,Kr=h(()=>{"use strict";c();Ya();Kt={name:Ka,displayName:Ja,description:Va,parameters:Xa,category:Qa,execute:Nw,confirmation:{level:"medium",reason:"This will modify the file by appending content.",showArgs:["path"]}}});var el,tl,ol,nl,rl,sl=h(()=>{"use strict";c();el="fs.delete_file",tl="Delete File",ol="Remove/delete a file from the filesystem. Does not delete directories.",nl="filesystem",rl={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path to delete"}},required:["path"]}});import*as xt from"fs";async function Aw(r){let e=r.path;if(y(`[fs.delete-file] execute path="${e}"`),!e)throw new Error("path is required");if(!xt.existsSync(e))throw new Error(`File not found: ${e}`);if(xt.statSync(e).isDirectory())throw new Error(`Path is a directory, not a file: ${e}. Use a different tool to remove directories.`);return xt.unlinkSync(e),`File deleted successfully: ${e}`}var Jt,Jr=h(()=>{"use strict";c();sl();k();Jt={name:el,displayName:tl,description:ol,parameters:rl,category:nl,execute:Aw,confirmation:{level:"high",reason:"This will permanently delete the file. This action cannot be undone.",showArgs:["path"]}}});var il,al,ll,cl,pl,ml=h(()=>{"use strict";c();il="fs.exists",al="Exists",ll="Check if a file or directory exists at the given path. Returns true or false.",cl="filesystem",pl={type:"object",properties:{path:{type:"string",description:"Absolute or relative path to check"}},required:["path"]}});import*as dl from"fs";async function Iw(r){let e=r.path;if(!e)throw new Error("path is required");let t=dl.existsSync(e);return JSON.stringify({exists:t,path:e})}var Vt,Vr=h(()=>{"use strict";c();ml();Vt={name:il,displayName:al,description:ll,parameters:pl,category:cl,execute:Iw}});var ul,fl,gl,hl,yl,bl=h(()=>{"use strict";c();ul="fs.stat",fl="Stat",gl="Get file or directory information including size, type, and modification date.",hl="filesystem",yl={type:"object",properties:{path:{type:"string",description:"Absolute or relative path to get info for"}},required:["path"]}});import*as $n from"fs";async function Lw(r){let e=r.path;if(!e)throw new Error("path is required");if(!$n.existsSync(e))throw new Error(`Path not found: ${e}`);let t=$n.statSync(e);return JSON.stringify({path:e,type:t.isDirectory()?"directory":t.isFile()?"file":"other",size:t.size,created:t.birthtime.toISOString(),modified:t.mtime.toISOString(),accessed:t.atime.toISOString(),permissions:t.mode.toString(8)})}var Qt,Qr=h(()=>{"use strict";c();bl();Qt={name:ul,displayName:fl,description:gl,parameters:yl,category:hl,execute:Lw}});var wl,Tl,xl,vl,Cl,Pl=h(()=>{"use strict";c();wl="fs.list_dir",Tl="List Directory",xl="List files and directories at the given path. Optionally recurse into subdirectories.",vl="filesystem",Cl={type:"object",properties:{path:{type:"string",description:"Absolute or relative directory path to list"},recursive:{type:"boolean",description:"Whether to list recursively (default: false)",default:!1}},required:["path"]}});import*as et from"fs";import*as kl from"path";function Sl(r,e,t,o=""){let n=et.readdirSync(r,{withFileTypes:!0});for(let s of n){let i=kl.join(r,s.name),a=o?`${o}/${s.name}`:s.name;if(s.isDirectory())t.push({name:a,type:"directory",size:0}),e&&Sl(i,!0,t,a);else if(s.isFile()){let l=et.statSync(i);t.push({name:a,type:"file",size:l.size})}}}async function jw(r){let e=r.path,t=r.recursive===!0;if(!e)throw new Error("path is required");if(!et.existsSync(e))throw new Error(`Directory not found: ${e}`);if(!et.statSync(e).isDirectory())throw new Error(`Path is not a directory: ${e}`);let n=[];return Sl(e,t,n),JSON.stringify(n,null,2)}var Xt,Xr=h(()=>{"use strict";c();Pl();Xt={name:wl,displayName:Tl,description:xl,parameters:Cl,category:vl,execute:jw}});var Rl,_l,$l,El,Dl,Ml=h(()=>{"use strict";c();Rl="fs.create_dir",_l="Create Directory",$l="Create a directory at the given path. Creates parent directories recursively if they do not exist.",El="filesystem",Dl={type:"object",properties:{path:{type:"string",description:"Absolute or relative directory path to create"},recursive:{type:"boolean",description:"Create parent directories if they do not exist (default: true)",default:!0}},required:["path"]}});import*as vt from"fs";async function Fw(r){let e=r.path,t=r.recursive!==!1;if(!e)throw new Error("path is required");if(vt.existsSync(e)){if(vt.statSync(e).isDirectory())return`Directory already exists: ${e}`;throw new Error(`Path exists but is not a directory: ${e}`)}return vt.mkdirSync(e,{recursive:t}),`Directory created: ${e}`}var Yt,Yr=h(()=>{"use strict";c();Ml();Yt={name:Rl,displayName:_l,description:$l,parameters:Dl,category:El,execute:Fw}});var Ol,Nl,Al,Il,Ll,jl=h(()=>{"use strict";c();Ol="fs.move",Nl="Move",Al="Move or rename a file or directory from one path to another.",Il="filesystem",Ll={type:"object",properties:{path:{type:"string",description:"Source path (file or directory)"},new_path:{type:"string",description:"Destination path"}},required:["path","new_path"]}});import*as tt from"fs";import*as Fl from"path";async function qw(r){let e=r.path,t=r.new_path;if(!e)throw new Error("path is required");if(!t)throw new Error("new_path is required");if(!tt.existsSync(e))throw new Error(`Source not found: ${e}`);let o=Fl.dirname(t);return tt.existsSync(o)||tt.mkdirSync(o,{recursive:!0}),tt.renameSync(e,t),`Moved: ${e} \u2192 ${t}`}var Zt,Zr=h(()=>{"use strict";c();jl();Zt={name:Ol,displayName:Nl,description:Al,parameters:Ll,category:Il,execute:qw,confirmation:{level:"high",reason:"This will move/rename the file or directory, potentially overwriting the destination.",showArgs:["path","new_path"]}}});var ql,Wl,Ul,Gl,Bl,zl=h(()=>{"use strict";c();ql="fs.copy",Wl="Copy",Ul="Copy a file or directory from one path to another. Recursively copies directories.",Gl="filesystem",Bl={type:"object",properties:{path:{type:"string",description:"Source path (file or directory)"},new_path:{type:"string",description:"Destination path"}},required:["path","new_path"]}});import*as pe from"fs";import*as eo from"path";function Hl(r,e){if(pe.statSync(r).isDirectory()){pe.existsSync(e)||pe.mkdirSync(e,{recursive:!0});let o=pe.readdirSync(r);for(let n of o)Hl(eo.join(r,n),eo.join(e,n))}else pe.copyFileSync(r,e)}async function Ww(r){let e=r.path,t=r.new_path;if(!e)throw new Error("path is required");if(!t)throw new Error("new_path is required");if(!pe.existsSync(e))throw new Error(`Source not found: ${e}`);let o=eo.dirname(t);return pe.existsSync(o)||pe.mkdirSync(o,{recursive:!0}),Hl(e,t),`Copied ${pe.statSync(e).isDirectory()?"directory":"file"}: ${e} \u2192 ${t}`}var to,es=h(()=>{"use strict";c();zl();to={name:ql,displayName:Wl,description:Ul,parameters:Bl,category:Gl,execute:Ww,confirmation:{level:"medium",reason:"This will copy files or directories, potentially overwriting the destination.",showArgs:["path","new_path"]}}});var Kl,Jl,Vl,Ql,Xl,Yl=h(()=>{"use strict";c();Kl="fs.read_file_range",Jl="Read File Range",Vl="Read a specific range of lines from a file. Useful for reading portions of large files without loading the entire content.",Ql="filesystem",Xl={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path to read"},start_line:{type:"integer",description:"Start line number (1-indexed)"},end_line:{type:"integer",description:"End line number (1-indexed, inclusive)"}},required:["path","start_line","end_line"]}});import*as Ct from"fs";async function Uw(r){let e=r.path,t=r.start_line,o=r.end_line;if(!e)throw new Error("path is required");if(t==null)throw new Error("start_line is required");if(o==null)throw new Error("end_line is required");if(t<1)throw new Error("start_line must be >= 1");if(o<t)throw new Error("end_line must be >= start_line");if(!Ct.existsSync(e))throw new Error(`File not found: ${e}`);if(Ct.statSync(e).isDirectory())throw new Error(`Path is a directory, not a file: ${e}`);let i=Ct.readFileSync(e,"utf-8").split(`
46
+ `),a=i.length,l=Math.min(t,a),p=Math.min(o,a),f=i.slice(l-1,p).map((g,w)=>`${l+w}: ${g}`).join(`
47
+ `);return`Lines ${l}-${p} of ${a} total:
48
+ ${f}`}var oo,ts=h(()=>{"use strict";c();Yl();oo={name:Kl,displayName:Jl,description:Vl,parameters:Xl,category:Ql,execute:Uw}});var Zl,ec,tc,oc,nc,rc=h(()=>{"use strict";c();Zl="fs.search",ec="Search",tc="Search for text in files within a directory. Returns matching lines with file paths and line numbers.",oc="filesystem",nc={type:"object",properties:{path:{type:"string",description:"Directory path to search in"},query:{type:"string",description:"Text or pattern to search for"},recursive:{type:"boolean",description:"Search recursively in subdirectories (default: true)",default:!0},max_results:{type:"integer",description:"Maximum number of matching lines to return (default: 50)",default:50},regex:{type:"boolean",description:"Treat query as a regular expression (default: false)",default:!1},case_sensitive:{type:"boolean",description:"Perform case-sensitive search. If false, search is case-insensitive (default: false)",default:!1}},required:["path","query"]}});import*as Le from"fs";import*as sc from"path";function Gw(r,e,t,o){try{let s=Le.readFileSync(r,"utf-8").split(`
49
+ `);for(let i=0;i<s.length&&t.length<o;i++){let a=s[i];(typeof e=="string"?a.includes(e):e.test(a))&&t.push({file:r,line:i+1,content:a.trim()})}}catch{}}function ic(r,e,t,o,n){let s=Le.readdirSync(r,{withFileTypes:!0});for(let i of s){if(o.length>=n)break;let a=sc.join(r,i.name);i.isDirectory()&&t?ic(a,e,!0,o,n):i.isFile()&&Gw(a,e,o,n)}}async function Bw(r){let e=r.path,t=r.query,o=r.recursive!==!1,n=r.max_results||50,s=!!r.regex,i=!!r.case_sensitive;if(y(`[fs.search] execute path="${e}" query="${t}" recursive=${o} regex=${s} caseSensitive=${i}`),!e)throw new Error("path is required");if(!t)throw new Error("query is required");let a=t;if(s||!i){let f=t;s||(f=f.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));let g=i?"":"i";a=new RegExp(f,g)}if(!Le.existsSync(e))throw new Error(`Directory not found: ${e}`);if(!Le.statSync(e).isDirectory())throw new Error(`Path is not a directory: ${e}`);let p=[];if(ic(e,a,o,p,n),p.length===0)return`No matches found for "${t}" in ${e}`;let m=p.length>=n?`
50
+ (results capped at ${n})`:"";return JSON.stringify(p,null,2)+m}var no,os=h(()=>{"use strict";c();rc();k();no={name:Zl,displayName:ec,description:tc,parameters:nc,category:oc,execute:Bw}});var ac,lc,cc,pc,mc,dc=h(()=>{"use strict";c();ac="fs.replace_in_file",lc="Replace In File",cc="Find and replace text in a file. Returns the number of replacements made.",pc="filesystem",mc={type:"object",properties:{path:{type:"string",description:"Absolute or relative file path"},search:{type:"string",description:"Text to search for"},replace:{type:"string",description:"Text to replace with"}},required:["path","search","replace"]}});import*as je from"fs";async function zw(r){let e=r.path,t=r.search,o=r.replace;if(!e)throw new Error("path is required");if(!t)throw new Error("search is required");if(o==null)throw new Error("replace is required");if(!je.existsSync(e))throw new Error(`File not found: ${e}`);if(je.statSync(e).isDirectory())throw new Error(`Path is a directory, not a file: ${e}`);let s=je.readFileSync(e,"utf-8"),i=0,a=0;for(;(a=s.indexOf(t,a))!==-1;)i++,a+=t.length;if(i===0)return`No occurrences of "${t}" found in ${e}`;let l=s.split(t).join(o);return je.writeFileSync(e,l,"utf-8"),`Replaced ${i} occurrence(s) in ${e}`}var ro,ns=h(()=>{"use strict";c();dc();ro={name:ac,displayName:lc,description:cc,parameters:mc,category:pc,execute:zw,confirmation:{level:"high",reason:"This will perform a global find-and-replace operation that may corrupt the file if the pattern is incorrect.",showArgs:["path","search","replace"]}}});var uc,fc,gc,hc,yc,bc=h(()=>{"use strict";c();uc="fs.tree",fc="Tree",gc="Get a tree representation of a directory structure. Useful for understanding project layout at a glance.",hc="filesystem",yc={type:"object",properties:{path:{type:"string",description:"Absolute or relative directory path"},depth:{type:"integer",description:"Maximum depth to traverse (default: 3)",default:3}},required:["path"]}});import*as Pt from"fs";import*as En from"path";function wc(r,e,t,o,n){if(t>o)return;let i=Pt.readdirSync(r,{withFileTypes:!0}).sort((a,l)=>a.isDirectory()&&!l.isDirectory()?-1:!a.isDirectory()&&l.isDirectory()?1:a.name.localeCompare(l.name));for(let a=0;a<i.length;a++){let l=i[a],p=a===i.length-1,m=p?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",f=p?" ":"\u2502 ";l.isDirectory()?(n.push(`${e}${m}${l.name}/`),wc(En.join(r,l.name),e+f,t+1,o,n)):n.push(`${e}${m}${l.name}`)}}async function Hw(r){let e=r.path,t=r.depth||3;if(!e)throw new Error("path is required");if(!Pt.existsSync(e))throw new Error(`Directory not found: ${e}`);if(!Pt.statSync(e).isDirectory())throw new Error(`Path is not a directory: ${e}`);let s=[`${En.basename(e)}/`];return wc(e,"",1,t,s),s.join(`
51
+ `)}var so,rs=h(()=>{"use strict";c();bc();so={name:uc,displayName:fc,description:gc,parameters:yc,category:hc,execute:Hw}});var Tc,xc,vc,Cc,Pc,kc=h(()=>{"use strict";c();Tc="fs.glob",xc="Glob Pattern Match",vc='Find files matching glob patterns (e.g., "**/*.ts", "src/**/*.test.js")',Cc="filesystem",Pc={type:"object",properties:{pattern:{type:"string",description:'Glob pattern to match files (e.g., "**/*.ts", "src/**/*.json")'},cwd:{type:"string",description:"Root directory to search from (defaults to current working directory)"},ignore:{type:"array",items:{type:"string"},description:'Patterns to ignore (e.g., ["node_modules/**", "dist/**"])'},onlyFiles:{type:"boolean",description:"Return only files, not directories (default: true)"},onlyDirectories:{type:"boolean",description:"Return only directories, not files (default: false)"},absolute:{type:"boolean",description:"Return absolute paths instead of relative (default: false)"}},required:["pattern"]}});import Kw from"fast-glob";async function Jw(r){let e=r.pattern,t=r.cwd,o=r.ignore,n=r.onlyFiles!==!1,s=r.onlyDirectories===!0,i=r.absolute===!0;if(!e)throw new Error("pattern is required");let a=e.replace(/\\/g,"/");try{let l=await Kw(a,{cwd:t||process.cwd(),ignore:o||["node_modules/**",".git/**"],onlyFiles:n,onlyDirectories:s,absolute:i,dot:!0});return JSON.stringify({pattern:e,files:l,count:l.length},null,2)}catch(l){throw new Error(`Failed to glob pattern "${e}": ${l.message}`)}}var io,ss=h(()=>{"use strict";c();kc();io={name:Tc,displayName:xc,description:vc,parameters:Pc,category:Cc,execute:Jw}});var Sc,Rc,_c,$c,Ec,Dc=h(()=>{"use strict";c();Sc="fs.delete_dir",Rc="Delete Directory",_c="Delete a directory and all its contents recursively",$c="filesystem",Ec={type:"object",properties:{path:{type:"string",description:"Absolute or relative path to the directory to delete"},force:{type:"boolean",description:"Force deletion even if directory is not empty (default: true)"}},required:["path"]}});import{rm as Vw}from"fs/promises";import{existsSync as Qw,statSync as Xw}from"fs";async function Yw(r){let e=r.path,t=r.force!==!1;if(!e)throw new Error("path is required");if(!Qw(e))throw new Error(`Directory does not exist: ${e}`);if(!Xw(e).isDirectory())throw new Error(`Path is not a directory: ${e}`);try{return await Vw(e,{recursive:!0,force:t}),`Directory deleted successfully: ${e}`}catch(n){throw new Error(`Failed to delete directory "${e}": ${n.message}`)}}var ao,is=h(()=>{"use strict";c();Dc();ao={name:Sc,displayName:Rc,description:_c,parameters:Ec,category:$c,execute:Yw,confirmation:{level:"high",reason:"This will recursively delete the directory and all its contents. This action cannot be undone.",showArgs:["path"]}}});var Mc,Oc,Nc,Ac,Ic,Lc=h(()=>{"use strict";c();Mc="fs.batch_read",Oc="Batch Read Files",Nc="Read multiple files efficiently in one operation. Returns content for each file or error if read fails.",Ac="filesystem",Ic={type:"object",properties:{paths:{type:"array",items:{type:"string"},description:"Array of file paths to read"},encoding:{type:"string",description:"File encoding (default: utf-8)"},continueOnError:{type:"boolean",description:"Continue reading other files if one fails (default: true)"}},required:["paths"]}});import{readFile as Zw}from"fs/promises";async function eT(r){let e=r.paths,t=r.encoding||"utf-8",o=r.continueOnError!==!1;if(!e||!Array.isArray(e)||e.length===0)throw new Error("paths array is required and must not be empty");let n=[],s=0,i=0;for(let a of e)try{let l=await Zw(a,t);n.push({path:a,content:l,success:!0}),s++}catch(l){let p=l.message;if(n.push({path:a,error:p,success:!1}),i++,!o)throw new Error(`Failed to read file "${a}": ${p}`)}return JSON.stringify({total:e.length,success:s,failed:i,results:n},null,2)}var lo,as=h(()=>{"use strict";c();Lc();lo={name:Mc,displayName:Oc,description:Nc,parameters:Ic,category:Ac,execute:eT}});var jc,Fc,qc,Wc,Uc,Gc=h(()=>{"use strict";c();jc="fs.batch_write",Fc="Batch Write Files",qc="Write multiple files atomically in one operation. If atomic mode is enabled, all writes succeed or all are rolled back on failure.",Wc="filesystem",Uc={type:"object",properties:{files:{type:"array",items:{type:"object",properties:{path:{type:"string"},content:{type:"string"}}},description:"Array of files to write, each with path and content"},encoding:{type:"string",description:"File encoding (default: utf-8)"},atomic:{type:"boolean",description:"Atomic mode: rollback all writes if any fails (default: true)"},createDirs:{type:"boolean",description:"Create parent directories if they don't exist (default: true)"}},required:["files"]}});import{writeFile as Bc,mkdir as tT,readFile as oT,unlink as nT}from"fs/promises";import{dirname as rT,resolve as sT}from"path";import{existsSync as zc}from"fs";async function iT(r){let e=r.files,t=r.encoding||"utf-8",o=r.atomic!==!1,n=r.createDirs!==!1;if(!e||!Array.isArray(e)||e.length===0)throw new Error("files array is required and must not be empty");for(let a of e)if(!a.path||a.content===void 0)throw new Error("Each file must have path and content properties");let s=[],i=[];try{for(let a of e){let l=sT(a.path);if(o){let p=zc(l),m={path:l,existed:p};p&&(m.originalContent=await oT(l,t)),s.push(m)}if(n){let p=rT(l);await tT(p,{recursive:!0})}await Bc(l,a.content,t),i.push(l)}return JSON.stringify({success:!0,written:i.length,files:i},null,2)}catch(a){if(o&&s.length>0){for(let l of s)try{l.existed&&l.originalContent!==void 0?await Bc(l.path,l.originalContent,t):!l.existed&&zc(l.path)&&await nT(l.path)}catch{}throw new Error(`Batch write failed and rolled back: ${a.message}`)}throw new Error(`Batch write failed: ${a.message}`)}}var co,ls=h(()=>{"use strict";c();Gc();co={name:jc,displayName:Fc,description:qc,parameters:Uc,category:Wc,execute:iT,confirmation:{level:"high",reason:"This will overwrite multiple files at once.",showArgs:["files"]}}});var Kc={};ue(Kc,{fsAppendFileTool:()=>Kt,fsBatchReadTool:()=>lo,fsBatchWriteTool:()=>co,fsCopyTool:()=>to,fsCreateDirTool:()=>Yt,fsDeleteDirTool:()=>ao,fsDeleteFileTool:()=>Jt,fsExistsTool:()=>Vt,fsGlobTool:()=>io,fsListDirTool:()=>Xt,fsMoveTool:()=>Zt,fsReadFileRangeTool:()=>oo,fsReadFileTool:()=>zt,fsReplaceInFileTool:()=>ro,fsSearchTool:()=>no,fsStatTool:()=>Qt,fsToolsProject:()=>Hc,fsTreeTool:()=>so,fsWriteFileTool:()=>Ht});var Hc,cs=h(()=>{"use strict";c();zr();Hr();Kr();Jr();Vr();Qr();Xr();Yr();Zr();es();ts();os();ns();rs();ss();is();as();ls();zr();Hr();Kr();Jr();Vr();Qr();Xr();Yr();Zr();es();ts();os();ns();rs();ss();is();as();ls();Hc={manifest:{key:"fs",name:"fs-tools",displayName:"File System",version:"1.0.0",description:"File system tools for reading, writing, searching, and managing files and directories.",author:"Sajeer",tools:["fs.read_file","fs.write_file","fs.append_file","fs.delete_file","fs.exists","fs.stat","fs.list_dir","fs.create_dir","fs.move","fs.copy","fs.read_file_range","fs.search","fs.replace_in_file","fs.tree","fs.glob","fs.delete_dir","fs.batch_read","fs.batch_write"],category:"filesystem"},tools:[zt,Ht,Kt,Jt,Vt,Qt,Xt,Yt,Zt,to,oo,no,ro,so,io,ao,lo,co],dependencies:{"fast-glob":"^3.3.2"}}});var Jc,Vc,Qc,Xc,Yc,Zc=h(()=>{"use strict";c();Jc="exec.run",Vc="Run",Qc="Execute a command directly (without shell) and return its output. Use exec.run_shell for pipes, redirects, or shell features.",Xc="execution",Yc={type:"object",properties:{command:{type:"string",description:"The command to execute"},cwd:{type:"string",description:"Working directory for the command (optional)"},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["command"]}});import{execSync as aT}from"child_process";async function lT(r){let e=r.command,t=r.cwd,o=r.timeout||3e4;if(!e)throw new Error("command is required");y(`[exec.run] execute command="${e.substring(0,100)}" cwd=${t??"default"} timeout=${o}ms`);try{return aT(e,{cwd:t,timeout:o,encoding:"utf-8",maxBuffer:10485760,stdio:["pipe","pipe","pipe"]})||"(command completed with no output)"}catch(n){let s=n.stdout||"",i=n.stderr||"";return`Command failed (exit code ${n.status??"unknown"}):
52
52
  STDOUT:
53
53
  ${s}
54
54
  STDERR:
55
- ${i}`}}var co,cs=h(()=>{"use strict";l();Xc();k();co={name:Hc,displayName:Kc,description:Jc,parameters:Qc,category:Vc,execute:iT,confirmation:{level:"high",reason:"This will execute a shell command on the host system.",showArgs:["command"]}}});var Yc,Zc,ep,tp,op,np=h(()=>{"use strict";l();Yc="exec.run_shell",Zc="Run Shell",ep="Execute a command through the system shell. Supports pipes, redirects, environment variable expansion, and other shell features.",tp="execution",op={type:"object",properties:{command:{type:"string",description:"The shell command to execute (supports pipes, redirects, etc.)"},cwd:{type:"string",description:"Working directory for the command (optional)"},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["command"]}});import{execSync as aT}from"child_process";function lT(){return process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/sh"}async function cT(r){let e=r.command,t=r.cwd,o=r.timeout||3e4;if(!e)throw new Error("command is required");y(`[exec.run-shell] execute command="${e.substring(0,100)}" cwd=${t??"default"} timeout=${o}ms`);try{return aT(e,{cwd:t,timeout:o,encoding:"utf-8",maxBuffer:10485760,stdio:["pipe","pipe","pipe"],shell:lT()})||"(command completed with no output)"}catch(n){let s=n.stdout||"",i=n.stderr||"";return`Command failed (exit code ${n.status??"unknown"}):
55
+ ${i}`}}var po,ps=h(()=>{"use strict";c();Zc();k();po={name:Jc,displayName:Vc,description:Qc,parameters:Yc,category:Xc,execute:lT,confirmation:{level:"high",reason:"This will execute a shell command on the host system.",showArgs:["command"]}}});var ep,tp,op,np,rp,sp=h(()=>{"use strict";c();ep="exec.run_shell",tp="Run Shell",op="Execute a command through the system shell. Supports pipes, redirects, environment variable expansion, and other shell features.",np="execution",rp={type:"object",properties:{command:{type:"string",description:"The shell command to execute (supports pipes, redirects, etc.)"},cwd:{type:"string",description:"Working directory for the command (optional)"},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["command"]}});import{execSync as cT}from"child_process";function pT(){return process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/sh"}async function mT(r){let e=r.command,t=r.cwd,o=r.timeout||3e4;if(!e)throw new Error("command is required");y(`[exec.run-shell] execute command="${e.substring(0,100)}" cwd=${t??"default"} timeout=${o}ms`);try{return cT(e,{cwd:t,timeout:o,encoding:"utf-8",maxBuffer:10485760,stdio:["pipe","pipe","pipe"],shell:pT()})||"(command completed with no output)"}catch(n){let s=n.stdout||"",i=n.stderr||"";return`Command failed (exit code ${n.status??"unknown"}):
56
56
  STDOUT:
57
57
  ${s}
58
58
  STDERR:
59
- ${i}`}}var po,ps=h(()=>{"use strict";l();np();k();po={name:Yc,displayName:Zc,description:ep,parameters:op,category:tp,execute:cT,confirmation:{level:"high",reason:"This will execute a shell command with explicit shell context.",showArgs:["command"]}}});function rp(r,e,t){let o=`proc_${pT++}`,n={id:o,command:r,cwd:e,process:t,startedAt:new Date().toISOString(),stdout:"",stderr:""};return t.stdout?.on("data",s=>{n.stdout+=s.toString(),n.stdout.length>1e6&&(n.stdout=n.stdout.slice(-5e5))}),t.stderr?.on("data",s=>{n.stderr+=s.toString(),n.stderr.length>1e6&&(n.stderr=n.stderr.slice(-5e5))}),t.on("exit",()=>{}),En.set(o,n),o}function Dn(r){return En.get(r)}function sp(r){let e=En.get(r);if(!e)return!1;let t=e.process.exitCode===null;return t&&e.process.kill("SIGTERM"),t}function ip(){return Array.from(En.values()).map(r=>({id:r.id,command:r.command,cwd:r.cwd,startedAt:r.startedAt,alive:r.process.exitCode===null,pid:r.process.pid}))}var En,pT,mo=h(()=>{"use strict";l();En=new Map,pT=1});var ap,lp,cp,pp,mp,dp=h(()=>{"use strict";l();ap="exec.run_background",lp="Run Background",cp="Start a command as a background process. Returns a process ID that can be used with exec.read_output, exec.kill, and exec.list_processes.",pp="execution",mp={type:"object",properties:{command:{type:"string",description:"The command to run in the background"},cwd:{type:"string",description:"Working directory for the command (optional)"}},required:["command"]}});import{spawn as mT}from"child_process";async function dT(r){let e=r.command,t=r.cwd;if(!e)throw new Error("command is required");if(y(`[exec.run-background] execute command="${e.substring(0,100)}" cwd=${t??"default"}`),!e)throw new Error("command is required");let o=mT(e,[],{cwd:t,shell:!0,stdio:["ignore","pipe","pipe"],detached:!1}),n=rp(e,t,o);return JSON.stringify({id:n,pid:o.pid,command:e,message:`Background process started. Use exec.read_output("${n}") to read output, exec.kill("${n}") to stop.`})}var uo,ms=h(()=>{"use strict";l();mo();dp();k();uo={name:ap,displayName:lp,description:cp,parameters:mp,category:pp,execute:dT,confirmation:{level:"high",reason:"This will spawn a background process that runs unsupervised.",showArgs:["command"]}}});var up,fp,gp,hp,yp,bp=h(()=>{"use strict";l();up="exec.read_output",fp="Read Output",gp="Read stdout and stderr from a background process started with exec.run_background.",hp="execution",yp={type:"object",properties:{process_id:{type:"string",description:"The process ID returned by exec.run_background"}},required:["process_id"]}});async function uT(r){let e=r.process_id;if(!e)throw new Error("process_id is required");let t=Dn(e);if(!t)throw new Error(`Process not found: ${e}`);let o=t.process.exitCode===null;return JSON.stringify({id:t.id,alive:o,exitCode:t.process.exitCode,stdout:t.stdout,stderr:t.stderr})}var fo,ds=h(()=>{"use strict";l();mo();bp();fo={name:up,displayName:fp,description:gp,parameters:yp,category:hp,execute:uT}});var wp,Tp,xp,vp,Cp,kp=h(()=>{"use strict";l();wp="exec.kill",Tp="Kill",xp="Kill a background process started with exec.run_background.",vp="execution",Cp={type:"object",properties:{process_id:{type:"string",description:"The process ID returned by exec.run_background"}},required:["process_id"]}});async function fT(r){let e=r.process_id;if(!e)throw new Error("process_id is required");let t=Dn(e);if(!t)throw new Error(`Process not found: ${e}`);return sp(e)?`Process ${e} (${t.command}) killed successfully.`:`Process ${e} (${t.command}) was already terminated (exit code: ${t.process.exitCode}).`}var go,us=h(()=>{"use strict";l();mo();kp();go={name:wp,displayName:Tp,description:xp,parameters:Cp,category:vp,execute:fT,confirmation:{level:"medium",reason:"This will terminate a running process.",showArgs:["process_id"]}}});var Pp,Sp,Rp,_p,$p,Ep=h(()=>{"use strict";l();Pp="exec.list_processes",Sp="List Processes",Rp="List all managed background processes started with exec.run_background, including their status.",_p="execution",$p={type:"object",properties:{}}});async function gT(r){let e=ip();return e.length===0?"No managed background processes.":JSON.stringify(e,null,2)}var ho,fs=h(()=>{"use strict";l();mo();Ep();ho={name:Pp,displayName:Sp,description:Rp,parameters:$p,category:_p,execute:gT}});var Mp={};le(Mp,{execKillTool:()=>go,execListProcessesTool:()=>ho,execReadOutputTool:()=>fo,execRunBackgroundTool:()=>uo,execRunShellTool:()=>po,execRunTool:()=>co,execToolsProject:()=>Dp});var Dp,gs=h(()=>{"use strict";l();cs();ps();ms();ds();us();fs();cs();ps();ms();ds();us();fs();Dp={manifest:{key:"exec",name:"exec-tools",displayName:"Execution",version:"1.0.0",description:"Code execution tools for running commands, managing background processes, and automation.",author:"Sajeer",tools:["exec.run","exec.run_shell","exec.run_background","exec.read_output","exec.kill","exec.list_processes"],category:"execution"},tools:[co,po,uo,fo,go,ho],dependencies:{}}});var Op,Np,Ap,Ip,Lp,jp=h(()=>{"use strict";l();Op="system.info",Np="Info",Ap="Get system information including OS, CPU, memory, and architecture.",Ip="system",Lp={type:"object",properties:{}}});import*as F from"os";async function hT(r){return y("[system.info] execute"),JSON.stringify({platform:F.platform(),arch:F.arch(),release:F.release(),hostname:F.hostname(),uptime:F.uptime(),cpus:{model:F.cpus()[0]?.model||"unknown",count:F.cpus().length},memory:{total:F.totalmem(),free:F.freemem(),used:F.totalmem()-F.freemem()},homedir:F.homedir(),tmpdir:F.tmpdir(),nodeVersion:process.version},null,2)}var yo,hs=h(()=>{"use strict";l();jp();k();yo={name:Op,displayName:Np,description:Ap,parameters:Lp,category:Ip,execute:hT}});var Fp,qp,Wp,Up,Gp,Bp=h(()=>{"use strict";l();Fp="system.env",qp="Environment",Wp="Get environment variable(s). If key is provided, returns that specific variable. Otherwise returns all environment variables.",Up="system",Gp={type:"object",properties:{key:{type:"string",description:"Specific environment variable name to get (optional, returns all if omitted)"}}}});async function yT(r){let e=r.key;if(y(`[system.env] execute key=${e??"all"}`),e){let n=process.env[e];return n===void 0?`Environment variable "${e}" is not set.`:JSON.stringify({[e]:n})}let t={},o=Object.keys(process.env).sort();for(let n of o)process.env[n]!==void 0&&(t[n]=process.env[n]);return JSON.stringify(t,null,2)}var bo,ys=h(()=>{"use strict";l();Bp();k();bo={name:Fp,displayName:qp,description:Wp,parameters:Gp,category:Up,execute:yT}});var zp,Hp,Kp,Jp,Vp,Qp=h(()=>{"use strict";l();zp="system.set_env",Hp="Set Environment",Kp="Set an environment variable for the current session. Does not persist across restarts.",Jp="system",Vp={type:"object",properties:{key:{type:"string",description:"Environment variable name"},value:{type:"string",description:"Value to set"}},required:["key","value"]}});async function bT(r){let e=r.key,t=r.value;if(!e)throw new Error("key is required");if(t==null)throw new Error("value is required");let o=process.env[e];return process.env[e]=t,o!==void 0?`Environment variable "${e}" updated (was: "${o}", now: "${t}")`:`Environment variable "${e}" set to "${t}"`}var wo,bs=h(()=>{"use strict";l();Qp();wo={name:zp,displayName:Hp,description:Kp,parameters:Vp,category:Jp,execute:bT,confirmation:{level:"medium",reason:"This will modify the process environment, affecting all subsequent operations.",showArgs:["key","value"]}}});var Xp,Yp,Zp,em,tm,om=h(()=>{"use strict";l();Xp="system.cwd",Yp="Current Directory",Zp="Get the current working directory of the process.",em="system",tm={type:"object",properties:{}}});async function wT(r){return y("[system.cwd] execute"),JSON.stringify({cwd:process.cwd()})}var To,ws=h(()=>{"use strict";l();om();k();To={name:Xp,displayName:Yp,description:Zp,parameters:tm,category:em,execute:wT}});var nm,rm,sm,im,am,lm=h(()=>{"use strict";l();nm="system.disk_usage",rm="Disk Usage",sm="Get disk usage information for a given path or the root filesystem.",im="system",am={type:"object",properties:{path:{type:"string",description:"Path to check disk usage for (default: /)",default:"/"}}}});import*as pm from"fs";import*as mm from"os";import*as Mn from"path";import{execSync as cm}from"child_process";function Ts(r){let e=["B","KB","MB","GB","TB","PB"],t=r,o=0;for(;t>=1024&&o<e.length-1;)t/=1024,o++;return`${t.toFixed(1)}${e[o]}`}async function TT(r){let t=r.path||(process.platform==="win32"?mm.tmpdir():"/");t=Mn.resolve(t);let o=process.platform==="win32";try{let n=pm.statfsSync(t),s=BigInt(n.blocks)*BigInt(n.bsize),i=BigInt(n.bavail)*BigInt(n.bsize),a=BigInt(n.bfree)*BigInt(n.bsize),c=s-a,p=s>0?Number(c*BigInt(100)/s):0;return JSON.stringify({path:t,filesystem:"statfs",size:Ts(Number(s)),used:Ts(Number(c)),available:Ts(Number(i)),usePercent:`${p}%`,mountedOn:t},null,2)}catch(n){try{if(o){let c=Mn.parse(t).root.replace(/\\$/,"")||"C:",p=`Get-PSDrive -Name ${c.replace(":","")} | Select-Object @{n='Drive';e={$_.Name+':'}},@{n='Used';e={$_.Used}},@{n='Free';e={$_.Free}},@{n='Total';e={$_.Used+$_.Free}} | ConvertTo-Json`,m=cm(p,{encoding:"utf-8",timeout:5e3,shell:"powershell.exe"}),f=JSON.parse(m.trim()),g=f.Total||0,w=f.Free||0,b=f.Used||0,T=g>0?Math.round(b/g*100):0;return JSON.stringify({path:t,filesystem:f.Name||"NTFS",size:`${(g/1024**3).toFixed(1)}G`,used:`${(b/1024**3).toFixed(1)}G`,available:`${(w/1024**3).toFixed(1)}G`,usePercent:`${T}%`,mountedOn:f.Drive||`${c}`},null,2)}let s=cm(`df -h "${t}"`,{encoding:"utf-8",timeout:5e3}),i=s.trim().split(`
60
- `);if(i.length<2)return s;let a=i[1].split(/\s+/);return JSON.stringify({path:t,filesystem:a[0]||"unknown",size:a[1]||"unknown",used:a[2]||"unknown",available:a[3]||"unknown",usePercent:a[4]||"unknown",mountedOn:a[5]||"unknown"},null,2)}catch(s){throw new Error(`Failed to get disk usage for ${t}: ${n?.message||n}; fallback error: ${s.message}`)}}}var xo,xs=h(()=>{"use strict";l();lm();xo={name:nm,displayName:rm,description:sm,parameters:am,category:im,execute:TT}});var um={};le(um,{systemCwdTool:()=>To,systemDiskUsageTool:()=>xo,systemEnvTool:()=>bo,systemInfoTool:()=>yo,systemSetEnvTool:()=>wo,systemToolsProject:()=>dm});var dm,vs=h(()=>{"use strict";l();hs();ys();bs();ws();xs();hs();ys();bs();ws();xs();dm={manifest:{key:"system",name:"system-tools",displayName:"System",version:"1.0.0",description:"System tools for querying OS info, environment variables, working directory, and disk usage.",author:"Sajeer",tools:["system.info","system.env","system.set_env","system.cwd","system.disk_usage"],category:"system"},tools:[yo,bo,wo,To,xo],dependencies:{}}});var fm,gm,hm,ym,bm,wm=h(()=>{"use strict";l();fm="http.get",gm="GET",hm="Make an HTTP GET request to a URL and return the response body.",ym="network",bm={type:"object",properties:{url:{type:"string",description:"The URL to request"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"}},required:["url"]}});async function xT(r){let e=r.url,t=r.headers;if(y(`[http.get] execute url="${e}"`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let o=await fetch(e,{method:"GET",headers:t||{}}),n=await o.text(),s=`HTTP ${o.status} ${o.statusText}`;return o.ok?n.length>Tm?`${s}
61
- ${n.substring(0,Tm)}
59
+ ${i}`}}var mo,ms=h(()=>{"use strict";c();sp();k();mo={name:ep,displayName:tp,description:op,parameters:rp,category:np,execute:mT,confirmation:{level:"high",reason:"This will execute a shell command with explicit shell context.",showArgs:["command"]}}});function ip(r,e,t){let o=`proc_${dT++}`,n={id:o,command:r,cwd:e,process:t,startedAt:new Date().toISOString(),stdout:"",stderr:""};return t.stdout?.on("data",s=>{n.stdout+=s.toString(),n.stdout.length>1e6&&(n.stdout=n.stdout.slice(-5e5))}),t.stderr?.on("data",s=>{n.stderr+=s.toString(),n.stderr.length>1e6&&(n.stderr=n.stderr.slice(-5e5))}),t.on("exit",()=>{}),Dn.set(o,n),o}function Mn(r){return Dn.get(r)}function ap(r){let e=Dn.get(r);if(!e)return!1;let t=e.process.exitCode===null;return t&&e.process.kill("SIGTERM"),t}function lp(){return Array.from(Dn.values()).map(r=>({id:r.id,command:r.command,cwd:r.cwd,startedAt:r.startedAt,alive:r.process.exitCode===null,pid:r.process.pid}))}var Dn,dT,uo=h(()=>{"use strict";c();Dn=new Map,dT=1});var cp,pp,mp,dp,up,fp=h(()=>{"use strict";c();cp="exec.run_background",pp="Run Background",mp="Start a command as a background process. Returns a process ID that can be used with exec.read_output, exec.kill, and exec.list_processes.",dp="execution",up={type:"object",properties:{command:{type:"string",description:"The command to run in the background"},cwd:{type:"string",description:"Working directory for the command (optional)"}},required:["command"]}});import{spawn as uT}from"child_process";async function fT(r){let e=r.command,t=r.cwd;if(!e)throw new Error("command is required");if(y(`[exec.run-background] execute command="${e.substring(0,100)}" cwd=${t??"default"}`),!e)throw new Error("command is required");let o=uT(e,[],{cwd:t,shell:!0,stdio:["ignore","pipe","pipe"],detached:!1}),n=ip(e,t,o);return JSON.stringify({id:n,pid:o.pid,command:e,message:`Background process started. Use exec.read_output("${n}") to read output, exec.kill("${n}") to stop.`})}var fo,ds=h(()=>{"use strict";c();uo();fp();k();fo={name:cp,displayName:pp,description:mp,parameters:up,category:dp,execute:fT,confirmation:{level:"high",reason:"This will spawn a background process that runs unsupervised.",showArgs:["command"]}}});var gp,hp,yp,bp,wp,Tp=h(()=>{"use strict";c();gp="exec.read_output",hp="Read Output",yp="Read stdout and stderr from a background process started with exec.run_background.",bp="execution",wp={type:"object",properties:{process_id:{type:"string",description:"The process ID returned by exec.run_background"}},required:["process_id"]}});async function gT(r){let e=r.process_id;if(!e)throw new Error("process_id is required");let t=Mn(e);if(!t)throw new Error(`Process not found: ${e}`);let o=t.process.exitCode===null;return JSON.stringify({id:t.id,alive:o,exitCode:t.process.exitCode,stdout:t.stdout,stderr:t.stderr})}var go,us=h(()=>{"use strict";c();uo();Tp();go={name:gp,displayName:hp,description:yp,parameters:wp,category:bp,execute:gT}});var xp,vp,Cp,Pp,kp,Sp=h(()=>{"use strict";c();xp="exec.kill",vp="Kill",Cp="Kill a background process started with exec.run_background.",Pp="execution",kp={type:"object",properties:{process_id:{type:"string",description:"The process ID returned by exec.run_background"}},required:["process_id"]}});async function hT(r){let e=r.process_id;if(!e)throw new Error("process_id is required");let t=Mn(e);if(!t)throw new Error(`Process not found: ${e}`);return ap(e)?`Process ${e} (${t.command}) killed successfully.`:`Process ${e} (${t.command}) was already terminated (exit code: ${t.process.exitCode}).`}var ho,fs=h(()=>{"use strict";c();uo();Sp();ho={name:xp,displayName:vp,description:Cp,parameters:kp,category:Pp,execute:hT,confirmation:{level:"medium",reason:"This will terminate a running process.",showArgs:["process_id"]}}});var Rp,_p,$p,Ep,Dp,Mp=h(()=>{"use strict";c();Rp="exec.list_processes",_p="List Processes",$p="List all managed background processes started with exec.run_background, including their status.",Ep="execution",Dp={type:"object",properties:{}}});async function yT(r){let e=lp();return e.length===0?"No managed background processes.":JSON.stringify(e,null,2)}var yo,gs=h(()=>{"use strict";c();uo();Mp();yo={name:Rp,displayName:_p,description:$p,parameters:Dp,category:Ep,execute:yT}});var Np={};ue(Np,{execKillTool:()=>ho,execListProcessesTool:()=>yo,execReadOutputTool:()=>go,execRunBackgroundTool:()=>fo,execRunShellTool:()=>mo,execRunTool:()=>po,execToolsProject:()=>Op});var Op,hs=h(()=>{"use strict";c();ps();ms();ds();us();fs();gs();ps();ms();ds();us();fs();gs();Op={manifest:{key:"exec",name:"exec-tools",displayName:"Execution",version:"1.0.0",description:"Code execution tools for running commands, managing background processes, and automation.",author:"Sajeer",tools:["exec.run","exec.run_shell","exec.run_background","exec.read_output","exec.kill","exec.list_processes"],category:"execution"},tools:[po,mo,fo,go,ho,yo],dependencies:{}}});var Ap,Ip,Lp,jp,Fp,qp=h(()=>{"use strict";c();Ap="system.info",Ip="Info",Lp="Get system information including OS, CPU, memory, and architecture.",jp="system",Fp={type:"object",properties:{}}});import*as j from"os";async function bT(r){return y("[system.info] execute"),JSON.stringify({platform:j.platform(),arch:j.arch(),release:j.release(),hostname:j.hostname(),uptime:j.uptime(),cpus:{model:j.cpus()[0]?.model||"unknown",count:j.cpus().length},memory:{total:j.totalmem(),free:j.freemem(),used:j.totalmem()-j.freemem()},homedir:j.homedir(),tmpdir:j.tmpdir(),nodeVersion:process.version},null,2)}var bo,ys=h(()=>{"use strict";c();qp();k();bo={name:Ap,displayName:Ip,description:Lp,parameters:Fp,category:jp,execute:bT}});var Wp,Up,Gp,Bp,zp,Hp=h(()=>{"use strict";c();Wp="system.env",Up="Environment",Gp="Get environment variable(s). If key is provided, returns that specific variable. Otherwise returns all environment variables.",Bp="system",zp={type:"object",properties:{key:{type:"string",description:"Specific environment variable name to get (optional, returns all if omitted)"}}}});async function wT(r){let e=r.key;if(y(`[system.env] execute key=${e??"all"}`),e){let n=process.env[e];return n===void 0?`Environment variable "${e}" is not set.`:JSON.stringify({[e]:n})}let t={},o=Object.keys(process.env).sort();for(let n of o)process.env[n]!==void 0&&(t[n]=process.env[n]);return JSON.stringify(t,null,2)}var wo,bs=h(()=>{"use strict";c();Hp();k();wo={name:Wp,displayName:Up,description:Gp,parameters:zp,category:Bp,execute:wT}});var Kp,Jp,Vp,Qp,Xp,Yp=h(()=>{"use strict";c();Kp="system.set_env",Jp="Set Environment",Vp="Set an environment variable for the current session. Does not persist across restarts.",Qp="system",Xp={type:"object",properties:{key:{type:"string",description:"Environment variable name"},value:{type:"string",description:"Value to set"}},required:["key","value"]}});async function TT(r){let e=r.key,t=r.value;if(!e)throw new Error("key is required");if(t==null)throw new Error("value is required");let o=process.env[e];return process.env[e]=t,o!==void 0?`Environment variable "${e}" updated (was: "${o}", now: "${t}")`:`Environment variable "${e}" set to "${t}"`}var To,ws=h(()=>{"use strict";c();Yp();To={name:Kp,displayName:Jp,description:Vp,parameters:Xp,category:Qp,execute:TT,confirmation:{level:"medium",reason:"This will modify the process environment, affecting all subsequent operations.",showArgs:["key","value"]}}});var Zp,em,tm,om,nm,rm=h(()=>{"use strict";c();Zp="system.cwd",em="Current Directory",tm="Get the current working directory of the process.",om="system",nm={type:"object",properties:{}}});async function xT(r){return y("[system.cwd] execute"),JSON.stringify({cwd:process.cwd()})}var xo,Ts=h(()=>{"use strict";c();rm();k();xo={name:Zp,displayName:em,description:tm,parameters:nm,category:om,execute:xT}});var sm,im,am,lm,cm,pm=h(()=>{"use strict";c();sm="system.disk_usage",im="Disk Usage",am="Get disk usage information for a given path or the root filesystem.",lm="system",cm={type:"object",properties:{path:{type:"string",description:"Path to check disk usage for (default: /)",default:"/"}}}});import*as dm from"fs";import*as um from"os";import*as On from"path";import{execSync as mm}from"child_process";function xs(r){let e=["B","KB","MB","GB","TB","PB"],t=r,o=0;for(;t>=1024&&o<e.length-1;)t/=1024,o++;return`${t.toFixed(1)}${e[o]}`}async function vT(r){let t=r.path||(process.platform==="win32"?um.tmpdir():"/");t=On.resolve(t);let o=process.platform==="win32";try{let n=dm.statfsSync(t),s=BigInt(n.blocks)*BigInt(n.bsize),i=BigInt(n.bavail)*BigInt(n.bsize),a=BigInt(n.bfree)*BigInt(n.bsize),l=s-a,p=s>0?Number(l*BigInt(100)/s):0;return JSON.stringify({path:t,filesystem:"statfs",size:xs(Number(s)),used:xs(Number(l)),available:xs(Number(i)),usePercent:`${p}%`,mountedOn:t},null,2)}catch(n){try{if(o){let l=On.parse(t).root.replace(/\\$/,"")||"C:",p=`Get-PSDrive -Name ${l.replace(":","")} | Select-Object @{n='Drive';e={$_.Name+':'}},@{n='Used';e={$_.Used}},@{n='Free';e={$_.Free}},@{n='Total';e={$_.Used+$_.Free}} | ConvertTo-Json`,m=mm(p,{encoding:"utf-8",timeout:5e3,shell:"powershell.exe"}),f=JSON.parse(m.trim()),g=f.Total||0,w=f.Free||0,b=f.Used||0,T=g>0?Math.round(b/g*100):0;return JSON.stringify({path:t,filesystem:f.Name||"NTFS",size:`${(g/1024**3).toFixed(1)}G`,used:`${(b/1024**3).toFixed(1)}G`,available:`${(w/1024**3).toFixed(1)}G`,usePercent:`${T}%`,mountedOn:f.Drive||`${l}`},null,2)}let s=mm(`df -h "${t}"`,{encoding:"utf-8",timeout:5e3}),i=s.trim().split(`
60
+ `);if(i.length<2)return s;let a=i[1].split(/\s+/);return JSON.stringify({path:t,filesystem:a[0]||"unknown",size:a[1]||"unknown",used:a[2]||"unknown",available:a[3]||"unknown",usePercent:a[4]||"unknown",mountedOn:a[5]||"unknown"},null,2)}catch(s){throw new Error(`Failed to get disk usage for ${t}: ${n?.message||n}; fallback error: ${s.message}`)}}}var vo,vs=h(()=>{"use strict";c();pm();vo={name:sm,displayName:im,description:am,parameters:cm,category:lm,execute:vT}});var gm={};ue(gm,{systemCwdTool:()=>xo,systemDiskUsageTool:()=>vo,systemEnvTool:()=>wo,systemInfoTool:()=>bo,systemSetEnvTool:()=>To,systemToolsProject:()=>fm});var fm,Cs=h(()=>{"use strict";c();ys();bs();ws();Ts();vs();ys();bs();ws();Ts();vs();fm={manifest:{key:"system",name:"system-tools",displayName:"System",version:"1.0.0",description:"System tools for querying OS info, environment variables, working directory, and disk usage.",author:"Sajeer",tools:["system.info","system.env","system.set_env","system.cwd","system.disk_usage"],category:"system"},tools:[bo,wo,To,xo,vo],dependencies:{}}});var hm,ym,bm,wm,Tm,xm=h(()=>{"use strict";c();hm="http.get",ym="GET",bm="Make an HTTP GET request to a URL and return the response body.",wm="network",Tm={type:"object",properties:{url:{type:"string",description:"The URL to request"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"}},required:["url"]}});async function CT(r){let e=r.url,t=r.headers;if(y(`[http.get] execute url="${e}"`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let o=await fetch(e,{method:"GET",headers:t||{}}),n=await o.text(),s=`HTTP ${o.status} ${o.statusText}`;return o.ok?n.length>vm?`${s}
61
+ ${n.substring(0,vm)}
62
62
 
63
63
  ... (truncated, total ${n.length} characters)`:`${s}
64
64
  ${n}`:`${s}
65
- ${n}`}var Tm,vo,Cs=h(()=>{"use strict";l();wm();k();Tm=1e5;vo={name:fm,displayName:gm,description:hm,parameters:bm,category:ym,execute:xT}});var xm,vm,Cm,km,Pm,Sm=h(()=>{"use strict";l();xm="http.post",vm="POST",Cm="Make an HTTP POST request to a URL with an optional body and return the response.",km="network",Pm={type:"object",properties:{url:{type:"string",description:"The URL to request"},body:{type:"string",description:"Request body (JSON string or plain text)"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"}},required:["url"]}});async function vT(r){let e=r.url,t=r.body,o=r.headers||{};if(y(`[http.post] execute url="${e}" body_len=${t?.length??0}`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");if(t&&!o["Content-Type"]&&!o["content-type"])try{JSON.parse(t),o["Content-Type"]="application/json"}catch{o["Content-Type"]="text/plain"}let n=await fetch(e,{method:"POST",headers:o,body:t||void 0}),s=await n.text(),i=`HTTP ${n.status} ${n.statusText}`;return s.length>Rm?`${i}
66
- ${s.substring(0,Rm)}
65
+ ${n}`}var vm,Co,Ps=h(()=>{"use strict";c();xm();k();vm=1e5;Co={name:hm,displayName:ym,description:bm,parameters:Tm,category:wm,execute:CT}});var Cm,Pm,km,Sm,Rm,_m=h(()=>{"use strict";c();Cm="http.post",Pm="POST",km="Make an HTTP POST request to a URL with an optional body and return the response.",Sm="network",Rm={type:"object",properties:{url:{type:"string",description:"The URL to request"},body:{type:"string",description:"Request body (JSON string or plain text)"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"}},required:["url"]}});async function PT(r){let e=r.url,t=r.body,o=r.headers||{};if(y(`[http.post] execute url="${e}" body_len=${t?.length??0}`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");if(t&&!o["Content-Type"]&&!o["content-type"])try{JSON.parse(t),o["Content-Type"]="application/json"}catch{o["Content-Type"]="text/plain"}let n=await fetch(e,{method:"POST",headers:o,body:t||void 0}),s=await n.text(),i=`HTTP ${n.status} ${n.statusText}`;return s.length>$m?`${i}
66
+ ${s.substring(0,$m)}
67
67
 
68
68
  ... (truncated, total ${s.length} characters)`:`${i}
69
- ${s}`}var Rm,Co,ks=h(()=>{"use strict";l();Sm();k();Rm=1e5;Co={name:xm,displayName:vm,description:Cm,parameters:Pm,category:km,execute:vT,confirmation:{level:"high",reason:"This will send an HTTP POST request with arbitrary payload.",showArgs:["url","body"]}}});var _m,$m,Em,Dm,Mm,Om=h(()=>{"use strict";l();_m="http.put",$m="PUT",Em="Make an HTTP PUT request to a URL with an optional body and return the response.",Dm="network",Mm={type:"object",properties:{url:{type:"string",description:"The URL to request"},body:{type:"string",description:"Request body (JSON string or plain text)"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"}},required:["url"]}});async function CT(r){let e=r.url,t=r.body,o=r.headers||{};if(y(`[http.put] execute url="${e}" body_len=${t?.length??0}`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");if(t&&!o["Content-Type"]&&!o["content-type"])try{JSON.parse(t),o["Content-Type"]="application/json"}catch{o["Content-Type"]="text/plain"}let n=await fetch(e,{method:"PUT",headers:o,body:t||void 0}),s=await n.text(),i=`HTTP ${n.status} ${n.statusText}`;return s.length>Nm?`${i}
70
- ${s.substring(0,Nm)}
69
+ ${s}`}var $m,Po,ks=h(()=>{"use strict";c();_m();k();$m=1e5;Po={name:Cm,displayName:Pm,description:km,parameters:Rm,category:Sm,execute:PT,confirmation:{level:"high",reason:"This will send an HTTP POST request with arbitrary payload.",showArgs:["url","body"]}}});var Em,Dm,Mm,Om,Nm,Am=h(()=>{"use strict";c();Em="http.put",Dm="PUT",Mm="Make an HTTP PUT request to a URL with an optional body and return the response.",Om="network",Nm={type:"object",properties:{url:{type:"string",description:"The URL to request"},body:{type:"string",description:"Request body (JSON string or plain text)"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"}},required:["url"]}});async function kT(r){let e=r.url,t=r.body,o=r.headers||{};if(y(`[http.put] execute url="${e}" body_len=${t?.length??0}`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");if(t&&!o["Content-Type"]&&!o["content-type"])try{JSON.parse(t),o["Content-Type"]="application/json"}catch{o["Content-Type"]="text/plain"}let n=await fetch(e,{method:"PUT",headers:o,body:t||void 0}),s=await n.text(),i=`HTTP ${n.status} ${n.statusText}`;return s.length>Im?`${i}
70
+ ${s.substring(0,Im)}
71
71
 
72
72
  ... (truncated)`:`${i}
73
- ${s}`}var Nm,ko,Ps=h(()=>{"use strict";l();Om();k();Nm=1e5;ko={name:_m,displayName:$m,description:Em,parameters:Mm,category:Dm,execute:CT,confirmation:{level:"high",reason:"This will send an HTTP PUT request to overwrite remote resources.",showArgs:["url","body"]}}});var Am,Im,Lm,jm,Fm,qm=h(()=>{"use strict";l();Am="http.delete",Im="DELETE",Lm="Make an HTTP DELETE request to a URL and return the response.",jm="network",Fm={type:"object",properties:{url:{type:"string",description:"The URL to request"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"}},required:["url"]}});async function kT(r){let e=r.url,t=r.headers;if(y(`[http.delete] execute url="${e}"`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let o=await fetch(e,{method:"DELETE",headers:t||{}}),n=await o.text(),s=`HTTP ${o.status} ${o.statusText}`;return n.length>Wm?`${s}
74
- ${n.substring(0,Wm)}
73
+ ${s}`}var Im,ko,Ss=h(()=>{"use strict";c();Am();k();Im=1e5;ko={name:Em,displayName:Dm,description:Mm,parameters:Nm,category:Om,execute:kT,confirmation:{level:"high",reason:"This will send an HTTP PUT request to overwrite remote resources.",showArgs:["url","body"]}}});var Lm,jm,Fm,qm,Wm,Um=h(()=>{"use strict";c();Lm="http.delete",jm="DELETE",Fm="Make an HTTP DELETE request to a URL and return the response.",qm="network",Wm={type:"object",properties:{url:{type:"string",description:"The URL to request"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"}},required:["url"]}});async function ST(r){let e=r.url,t=r.headers;if(y(`[http.delete] execute url="${e}"`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let o=await fetch(e,{method:"DELETE",headers:t||{}}),n=await o.text(),s=`HTTP ${o.status} ${o.statusText}`;return n.length>Gm?`${s}
74
+ ${n.substring(0,Gm)}
75
75
 
76
76
  ... (truncated)`:`${s}
77
- ${n}`}var Wm,Po,Ss=h(()=>{"use strict";l();qm();k();Wm=1e5;Po={name:Am,displayName:Im,description:Lm,parameters:Fm,category:jm,execute:kT,confirmation:{level:"high",reason:"This will send an HTTP DELETE request to destroy remote resources.",showArgs:["url"]}}});var Um,Gm,Bm,zm,Hm,Km=h(()=>{"use strict";l();Um="http.download",Gm="Download",Bm="Download a file from a URL and save it to a local path.",zm="network",Hm={type:"object",properties:{url:{type:"string",description:"The URL to download from"},path:{type:"string",description:"Local file path to save the downloaded file"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"}},required:["url","path"]}});import*as kt from"fs";import*as Jm from"path";async function PT(r){let e=r.url,t=r.path,o=r.headers;if(y(`[http.download] execute url="${e}" path="${t}"`),!e)throw new Error("url is required");if(!t)throw new Error("path is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let n=await fetch(e,{method:"GET",headers:o||{}});if(!n.ok)throw new Error(`Download failed: HTTP ${n.status} ${n.statusText}`);let s=Buffer.from(await n.arrayBuffer()),i=Jm.dirname(t);return kt.existsSync(i)||kt.mkdirSync(i,{recursive:!0}),kt.writeFileSync(t,s),`Downloaded ${e} \u2192 ${t} (${s.length} bytes)`}var So,Rs=h(()=>{"use strict";l();Km();k();So={name:Um,displayName:Gm,description:Bm,parameters:Hm,category:zm,execute:PT}});var Qm={};le(Qm,{httpDeleteTool:()=>Po,httpDownloadTool:()=>So,httpGetTool:()=>vo,httpPostTool:()=>Co,httpPutTool:()=>ko,httpToolsProject:()=>Vm});var Vm,_s=h(()=>{"use strict";l();Cs();ks();Ps();Ss();Rs();Cs();ks();Ps();Ss();Rs();Vm={manifest:{key:"http",name:"http-tools",displayName:"HTTP",version:"1.0.0",description:"HTTP tools for making GET, POST, PUT, DELETE requests and downloading files.",author:"Sajeer",tools:["http.get","http.post","http.put","http.delete","http.download"],category:"network"},tools:[vo,Co,ko,Po,So],dependencies:{}}});var Xm,Ym,Zm,ed,td,od=h(()=>{"use strict";l();Xm="github.graphql.execute",Ym="GitHub GraphQL",Zm=["Execute a GitHub GraphQL query or mutation with standard headers.","NOTE: GitHub App installation tokens (ghs_*) cannot call certain write mutations.","The following mutations require a PAT and will return FORBIDDEN with an App token:","resolveReviewThread, unresolveReviewThread.","If using an App token, avoid these mutations and use fallback strategies (replies, new comments)."].join(" "),ed="github",td={type:"object",properties:{query:{type:"string",description:"GraphQL query string"},variables:{type:"object",description:"Optional GraphQL variables"},repo:{type:"string",description:"owner/name \u2014 used for token resolution when no explicit token is provided"},token:{type:"string",description:"GitHub token (App installation or PAT). Optional \u2014 omit to auto-resolve from server credentials."}},required:["query"]}});function z(r,e){let t={Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",...e||{}};return r&&(t.Authorization=`Bearer ${r}`),t}var Re=h(()=>{"use strict";l()});import*as sd from"crypto";async function G(r,e){if(e)return e;let t=process.env.GITHUB_PAT;if(t)return t;let o=process.env.GITHUB_APP_ID,n=process.env.GITHUB_APP_PRIVATE_KEY?.replace(/\\n/g,`
78
- `);if(!o||!n)throw new Error("No GitHub token available. Set GITHUB_PAT, or GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY.");let s=await ST(o,n,r);return RT(o,n,s)}async function ST(r,e,t){if(!t)throw new Error("Cannot resolve GitHub App installation token without a repo name. Pass args.repo or set GITHUB_PAT.");let o=rd.get(t);if(o!==void 0)return o;let n=id(r,e),s=await fetch(`https://api.github.com/repos/${t}/installation`,{headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"}});if(!s.ok){let a=await s.text();throw new Error(`Failed to look up installation for ${t} (${s.status}): ${a}`)}let i=await s.json();return rd.set(t,i.id),i.id}async function RT(r,e,t){let o=nd.get(t);if(o&&o.expiresAt>Date.now()+6e4)return o.token;let n=id(r,e),s=await fetch(`https://api.github.com/app/installations/${t}/access_tokens`,{method:"POST",headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"}});if(!s.ok){let a=await s.text();throw new Error(`Failed to mint installation token (${s.status}): ${a}`)}let i=await s.json();return nd.set(t,{token:i.token,expiresAt:new Date(i.expires_at).getTime()}),i.token}function id(r,e){let t=Math.floor(Date.now()/1e3),o={alg:"RS256",typ:"JWT"},n={iat:t-30,exp:t+540,iss:r},s=c=>Buffer.from(JSON.stringify(c)).toString("base64").replace(/=+$/,"").replace(/\+/g,"-").replace(/\//g,"_"),i=`${s(o)}.${s(n)}`,a=sd.createSign("RSA-SHA256");return a.update(i),a.end(),`${i}.`+a.sign(e).toString("base64").replace(/=+$/,"").replace(/\+/g,"-").replace(/\//g,"_")}var nd,rd,xe=h(()=>{"use strict";l();nd=new Map,rd=new Map});async function _T(r){let e=r.query,t=r.variables??{},o=await G(r.repo,r.token);y(`[github.graphql.execute] query_len=${e?.length??0}`);let n=await fetch("https://api.github.com/graphql",{method:"POST",headers:z(o,{"Content-Type":"application/json"}),body:JSON.stringify({query:e,variables:t})}),s=await n.text();try{let i=JSON.parse(s);i&&Array.isArray(i.errors)&&i.errors.length>0&&y(`[github.graphql.execute] errors=${i.errors.length}`)}catch{}return`HTTP ${n.status} ${n.statusText}
79
- ${s}`}var Ro,$s=h(()=>{"use strict";l();od();k();Re();xe();Ro={name:Xm,displayName:Ym,description:Zm,parameters:td,category:ed,execute:_T}});var ad,ld,cd,pd,md,dd=h(()=>{"use strict";l();ad="github.contents.getText",ld="Get Repo File (Text)",cd="Fetch file content (decoded text) via the GitHub Contents API.",pd="github",md={type:"object",properties:{repo:{type:"string",description:"owner/name (e.g. octo/repo)"},path:{type:"string",description:"File path within the repo"},ref:{type:"string",description:"Branch, tag, or commit sha"},token:{type:"string",description:"GitHub token (App installation or PAT)"},maxBytes:{type:"integer",description:"Optional max bytes of decoded text to return; if exceeded, result is truncated with a footer."}},required:["repo","path"]}});import{Buffer as On}from"buffer";async function $T(r){let e=r.repo,t=r.path,o=r.ref,n=await G(e,r.token),s=r.maxBytes?Number(r.maxBytes):void 0,i=t.split("/").map(m=>encodeURIComponent(m)).join("/"),a=`https://api.github.com/repos/${e}/contents/${i}${o?`?ref=${encodeURIComponent(o)}`:""}`;y(`[github.contents.getText] repo=${e} path=${t} ref=${o??""}`);let c=await fetch(a,{method:"GET",headers:z(n)}),p=await c.text();if(!c.ok)return`HTTP ${c.status} ${c.statusText}
80
- ${p}`;try{let f=JSON.parse(p)?.content;if(typeof f=="string"){let g=On.from(f.replace(/\n/g,""),"base64").toString("utf8");if(s&&On.byteLength(g,"utf8")>s){let w=On.from(g,"utf8").subarray(0,s).toString("utf8"),b=`
81
- \u2026 [truncated, ${s} of ${On.byteLength(g,"utf8")} bytes]`;return`HTTP ${c.status} ${c.statusText}
82
- ${w}${b}`}return`HTTP ${c.status} ${c.statusText}
83
- ${g}`}}catch{}return`HTTP ${c.status} ${c.statusText}
84
- ${p}`}var _o,Es=h(()=>{"use strict";l();dd();k();Re();xe();_o={name:ad,displayName:ld,description:cd,parameters:md,category:pd,execute:$T}});var ud,fd,gd,hd,yd,bd=h(()=>{"use strict";l();ud="github.pr.reviewThreads.list",fd="List PR Review Threads",gd="List PR review threads via GraphQL (optionally unresolved only).",hd="github",yd={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"PR number"},token:{type:"string",description:"GitHub token (App installation or PAT)"},unresolvedOnly:{type:"boolean",description:"If true, filter unresolved threads only"},first:{type:"integer",description:"Threads page size (max 100). Default 100."},after:{type:"string",description:"Cursor for pagination (GraphQL pageInfo.endCursor)."},commentsFirst:{type:"integer",description:"Comments per thread (max 100). Default 20."},includeMeta:{type:"boolean",description:"If true, return { headRefOid, threads, pageInfo } instead of array."}},required:["repo","number"]}});async function ET(r){let[e,t]=String(r.repo).split("/"),o=Number(r.number),n=await G(r.repo,r.token),s=!!r.unresolvedOnly,i=r.first?Number(r.first):100,a=r.after?String(r.after):void 0,c=r.commentsFirst?Number(r.commentsFirst):20,p=!!r.includeMeta;y(`[github.pr.reviewThreads.list] repo=${e}/${t} pr=${o} unresolvedOnly=${s} first=${i} after=${a??""} commentsFirst=${c} includeMeta=${p}`);let f=await fetch("https://api.github.com/graphql",{method:"POST",headers:z(n,{"Content-Type":"application/json"}),body:JSON.stringify({query:`query($owner:String!,$name:String!,$number:Int!,$first:Int!,$after:String,$commentsFirst:Int!){
77
+ ${n}`}var Gm,So,Rs=h(()=>{"use strict";c();Um();k();Gm=1e5;So={name:Lm,displayName:jm,description:Fm,parameters:Wm,category:qm,execute:ST,confirmation:{level:"high",reason:"This will send an HTTP DELETE request to destroy remote resources.",showArgs:["url"]}}});var Bm,zm,Hm,Km,Jm,Vm=h(()=>{"use strict";c();Bm="http.download",zm="Download",Hm="Download a file from a URL and save it to a local path.",Km="network",Jm={type:"object",properties:{url:{type:"string",description:"The URL to download from"},path:{type:"string",description:"Local file path to save the downloaded file"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"}},required:["url","path"]}});import*as kt from"fs";import*as Qm from"path";async function RT(r){let e=r.url,t=r.path,o=r.headers;if(y(`[http.download] execute url="${e}" path="${t}"`),!e)throw new Error("url is required");if(!t)throw new Error("path is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let n=await fetch(e,{method:"GET",headers:o||{}});if(!n.ok)throw new Error(`Download failed: HTTP ${n.status} ${n.statusText}`);let s=Buffer.from(await n.arrayBuffer()),i=Qm.dirname(t);return kt.existsSync(i)||kt.mkdirSync(i,{recursive:!0}),kt.writeFileSync(t,s),`Downloaded ${e} \u2192 ${t} (${s.length} bytes)`}var Ro,_s=h(()=>{"use strict";c();Vm();k();Ro={name:Bm,displayName:zm,description:Hm,parameters:Jm,category:Km,execute:RT}});var Ym={};ue(Ym,{httpDeleteTool:()=>So,httpDownloadTool:()=>Ro,httpGetTool:()=>Co,httpPostTool:()=>Po,httpPutTool:()=>ko,httpToolsProject:()=>Xm});var Xm,$s=h(()=>{"use strict";c();Ps();ks();Ss();Rs();_s();Ps();ks();Ss();Rs();_s();Xm={manifest:{key:"http",name:"http-tools",displayName:"HTTP",version:"1.0.0",description:"HTTP tools for making GET, POST, PUT, DELETE requests and downloading files.",author:"Sajeer",tools:["http.get","http.post","http.put","http.delete","http.download"],category:"network"},tools:[Co,Po,ko,So,Ro],dependencies:{}}});var Zm,ed,td,od,nd,rd=h(()=>{"use strict";c();Zm="github.graphql.execute",ed="GitHub GraphQL",td=["Execute a GitHub GraphQL query or mutation with standard headers.","NOTE: GitHub App installation tokens (ghs_*) cannot call certain write mutations.","The following mutations require a PAT and will return FORBIDDEN with an App token:","resolveReviewThread, unresolveReviewThread.","If using an App token, avoid these mutations and use fallback strategies (replies, new comments)."].join(" "),od="github",nd={type:"object",properties:{query:{type:"string",description:"GraphQL query string"},variables:{type:"object",description:"Optional GraphQL variables"},repo:{type:"string",description:"owner/name \u2014 used for token resolution when no explicit token is provided"},token:{type:"string",description:"GitHub token (App installation or PAT). Optional \u2014 omit to auto-resolve from server credentials."}},required:["query"]}});function J(r,e){let t={Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28",...e||{}};return r&&(t.Authorization=`Bearer ${r}`),t}var _e=h(()=>{"use strict";c()});import*as ad from"crypto";async function B(r,e){if(e)return e;let t=process.env.GITHUB_PAT;if(t)return t;let o=process.env.GITHUB_APP_ID,n=process.env.GITHUB_APP_PRIVATE_KEY?.replace(/\\n/g,`
78
+ `);if(!o||!n)throw new Error("No GitHub token available. Set GITHUB_PAT, or GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY.");let s=await _T(o,n,r);return $T(o,n,s)}async function _T(r,e,t){if(!t)throw new Error("Cannot resolve GitHub App installation token without a repo name. Pass args.repo or set GITHUB_PAT.");let o=id.get(t);if(o!==void 0)return o;let n=ld(r,e),s=await fetch(`https://api.github.com/repos/${t}/installation`,{headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"}});if(!s.ok){let a=await s.text();throw new Error(`Failed to look up installation for ${t} (${s.status}): ${a}`)}let i=await s.json();return id.set(t,i.id),i.id}async function $T(r,e,t){let o=sd.get(t);if(o&&o.expiresAt>Date.now()+6e4)return o.token;let n=ld(r,e),s=await fetch(`https://api.github.com/app/installations/${t}/access_tokens`,{method:"POST",headers:{Authorization:`Bearer ${n}`,Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28"}});if(!s.ok){let a=await s.text();throw new Error(`Failed to mint installation token (${s.status}): ${a}`)}let i=await s.json();return sd.set(t,{token:i.token,expiresAt:new Date(i.expires_at).getTime()}),i.token}function ld(r,e){let t=Math.floor(Date.now()/1e3),o={alg:"RS256",typ:"JWT"},n={iat:t-30,exp:t+540,iss:r},s=l=>Buffer.from(JSON.stringify(l)).toString("base64").replace(/=+$/,"").replace(/\+/g,"-").replace(/\//g,"_"),i=`${s(o)}.${s(n)}`,a=ad.createSign("RSA-SHA256");return a.update(i),a.end(),`${i}.`+a.sign(e).toString("base64").replace(/=+$/,"").replace(/\+/g,"-").replace(/\//g,"_")}var sd,id,Ce=h(()=>{"use strict";c();sd=new Map,id=new Map});async function ET(r){let e=r.query,t=r.variables??{},o=await B(r.repo,r.token);y(`[github.graphql.execute] query_len=${e?.length??0}`);let n=await fetch("https://api.github.com/graphql",{method:"POST",headers:J(o,{"Content-Type":"application/json"}),body:JSON.stringify({query:e,variables:t})}),s=await n.text();try{let i=JSON.parse(s);i&&Array.isArray(i.errors)&&i.errors.length>0&&y(`[github.graphql.execute] errors=${i.errors.length}`)}catch{}return`HTTP ${n.status} ${n.statusText}
79
+ ${s}`}var _o,Es=h(()=>{"use strict";c();rd();k();_e();Ce();_o={name:Zm,displayName:ed,description:td,parameters:nd,category:od,execute:ET}});var cd,pd,md,dd,ud,fd=h(()=>{"use strict";c();cd="github.contents.getText",pd="Get Repo File (Text)",md="Fetch file content (decoded text) via the GitHub Contents API.",dd="github",ud={type:"object",properties:{repo:{type:"string",description:"owner/name (e.g. octo/repo)"},path:{type:"string",description:"File path within the repo"},ref:{type:"string",description:"Branch, tag, or commit sha"},token:{type:"string",description:"GitHub token (App installation or PAT)"},maxBytes:{type:"integer",description:"Optional max bytes of decoded text to return; if exceeded, result is truncated with a footer."}},required:["repo","path"]}});import{Buffer as Nn}from"buffer";async function DT(r){let e=r.repo,t=r.path,o=r.ref,n=await B(e,r.token),s=r.maxBytes?Number(r.maxBytes):void 0,i=t.split("/").map(m=>encodeURIComponent(m)).join("/"),a=`https://api.github.com/repos/${e}/contents/${i}${o?`?ref=${encodeURIComponent(o)}`:""}`;y(`[github.contents.getText] repo=${e} path=${t} ref=${o??""}`);let l=await fetch(a,{method:"GET",headers:J(n)}),p=await l.text();if(!l.ok)return`HTTP ${l.status} ${l.statusText}
80
+ ${p}`;try{let f=JSON.parse(p)?.content;if(typeof f=="string"){let g=Nn.from(f.replace(/\n/g,""),"base64").toString("utf8");if(s&&Nn.byteLength(g,"utf8")>s){let w=Nn.from(g,"utf8").subarray(0,s).toString("utf8"),b=`
81
+ \u2026 [truncated, ${s} of ${Nn.byteLength(g,"utf8")} bytes]`;return`HTTP ${l.status} ${l.statusText}
82
+ ${w}${b}`}return`HTTP ${l.status} ${l.statusText}
83
+ ${g}`}}catch{}return`HTTP ${l.status} ${l.statusText}
84
+ ${p}`}var $o,Ds=h(()=>{"use strict";c();fd();k();_e();Ce();$o={name:cd,displayName:pd,description:md,parameters:ud,category:dd,execute:DT}});var gd,hd,yd,bd,wd,Td=h(()=>{"use strict";c();gd="github.pr.reviewThreads.list",hd="List PR Review Threads",yd="List PR review threads via GraphQL (optionally unresolved only).",bd="github",wd={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"PR number"},token:{type:"string",description:"GitHub token (App installation or PAT)"},unresolvedOnly:{type:"boolean",description:"If true, filter unresolved threads only"},first:{type:"integer",description:"Threads page size (max 100). Default 100."},after:{type:"string",description:"Cursor for pagination (GraphQL pageInfo.endCursor)."},commentsFirst:{type:"integer",description:"Comments per thread (max 100). Default 20."},includeMeta:{type:"boolean",description:"If true, return { headRefOid, threads, pageInfo } instead of array."}},required:["repo","number"]}});async function MT(r){let[e,t]=String(r.repo).split("/"),o=Number(r.number),n=await B(r.repo,r.token),s=!!r.unresolvedOnly,i=r.first?Number(r.first):100,a=r.after?String(r.after):void 0,l=r.commentsFirst?Number(r.commentsFirst):20,p=!!r.includeMeta;y(`[github.pr.reviewThreads.list] repo=${e}/${t} pr=${o} unresolvedOnly=${s} first=${i} after=${a??""} commentsFirst=${l} includeMeta=${p}`);let f=await fetch("https://api.github.com/graphql",{method:"POST",headers:J(n,{"Content-Type":"application/json"}),body:JSON.stringify({query:`query($owner:String!,$name:String!,$number:Int!,$first:Int!,$after:String,$commentsFirst:Int!){
85
85
  repository(owner:$owner,name:$name){
86
86
  pullRequest(number:$number){
87
87
  headRefOid
@@ -91,29 +91,29 @@ ${p}`}var _o,Es=h(()=>{"use strict";l();dd();k();Re();xe();_o={name:ad,displayNa
91
91
  }
92
92
  }
93
93
  }
94
- }`,variables:{owner:e,name:t,number:o,first:i,after:a,commentsFirst:c}})}),g=await f.text();if(!f.ok)return`HTTP ${f.status} ${f.statusText}
95
- ${g}`;try{let w=JSON.parse(g);w&&Array.isArray(w.errors)&&w.errors.length>0&&y(`[github.pr.reviewThreads.list] errors=${w.errors.length}`);let b=w?.data?.repository?.pullRequest,T=b?.reviewThreads?.pageInfo??{hasNextPage:!1,endCursor:null},v=b?.reviewThreads?.nodes??[];if(s&&(v=v.filter(C=>C?.isResolved===!1)),p){let C={headRefOid:b?.headRefOid,threads:v,pageInfo:T};return`HTTP 200 OK
94
+ }`,variables:{owner:e,name:t,number:o,first:i,after:a,commentsFirst:l}})}),g=await f.text();if(!f.ok)return`HTTP ${f.status} ${f.statusText}
95
+ ${g}`;try{let w=JSON.parse(g);w&&Array.isArray(w.errors)&&w.errors.length>0&&y(`[github.pr.reviewThreads.list] errors=${w.errors.length}`);let b=w?.data?.repository?.pullRequest,T=b?.reviewThreads?.pageInfo??{hasNextPage:!1,endCursor:null},x=b?.reviewThreads?.nodes??[];if(s&&(x=x.filter(C=>C?.isResolved===!1)),p){let C={headRefOid:b?.headRefOid,threads:x,pageInfo:T};return`HTTP 200 OK
96
96
  ${JSON.stringify(C)}`}return`HTTP 200 OK
97
- ${JSON.stringify(v)}`}catch{return`HTTP ${f.status} ${f.statusText}
98
- ${g}`}}var $o,Ds=h(()=>{"use strict";l();bd();Re();k();xe();$o={name:ud,displayName:fd,description:gd,parameters:yd,category:hd,execute:ET}});var wd,Td,xd,vd,Cd,kd=h(()=>{"use strict";l();wd="github.pr.reviewThreads.resolve",Td="Resolve Review Thread",xd=["Resolve a PR review thread via GraphQL resolveReviewThread mutation.","IMPORTANT: GitHub App installation tokens (ghs_*) cannot call this mutation \u2014 GitHub returns FORBIDDEN.","This tool only works with a Personal Access Token (PAT) that has repo scope.","If you are using a GitHub App installation token, do NOT call this tool.","Instead, post a reply on the thread acknowledging the fix and ask the author to resolve it manually."].join(" "),vd="github",Cd={type:"object",properties:{threadId:{type:"string",description:"GraphQL node ID of the review thread"},repo:{type:"string",description:"owner/name \u2014 used for token resolution when no explicit token is provided"},token:{type:"string",description:"GitHub token \u2014 MUST be a PAT with repo scope. App installation tokens (ghs_*) will receive FORBIDDEN."}},required:["threadId"]}});async function DT(r){let e=String(r.threadId),t=await G(r.repo,r.token);y(`[github.pr.reviewThreads.resolve] threadId=${e}`);let n=await fetch("https://api.github.com/graphql",{method:"POST",headers:z(t,{"Content-Type":"application/json"}),body:JSON.stringify({query:"mutation($id:ID!){ resolveReviewThread(input:{threadId:$id}) { thread { id isResolved } } }",variables:{id:e}})}),s=await n.text();if(n.ok)try{if(JSON.parse(s).errors?.find(c=>c.type==="FORBIDDEN"))return["TOOL_UNSUPPORTED_FOR_TOKEN_TYPE: resolveReviewThread is not available for GitHub App installation tokens (ghs_*).","GitHub requires a user identity (PAT with repo scope) for this operation.","Fallback action: post a reply on the thread acknowledging the fix and ask the author to resolve it manually."].join(" ")}catch{}return`HTTP ${n.status} ${n.statusText}
99
- ${s}`}var Eo,Ms=h(()=>{"use strict";l();kd();Re();k();xe();Eo={name:wd,displayName:Td,description:xd,parameters:Cd,category:vd,execute:DT}});var Pd,Sd,Rd,_d,$d,Ed=h(()=>{"use strict";l();Pd="github.pr.reviewComments.reply",Sd="Reply to Review Comment",Rd="Reply within an existing PR review thread to maintain continuity.",_d="github",$d={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"PR number"},inReplyTo:{type:"integer",description:"databaseId of the review comment to reply to"},body:{type:"string",description:"Reply body"},token:{type:"string",description:"GitHub token (App installation or PAT)"}},required:["repo","number","inReplyTo","body"]}});async function MT(r){let e=String(r.repo),t=Number(r.number),o=Number(r.inReplyTo),n=String(r.body),s=await G(e,r.token),i=`https://api.github.com/repos/${e}/pulls/${t}/comments/${o}/replies`;y(`[github.pr.reviewComments.reply] repo=${e} inReplyTo=${o}`);let a=await fetch(i,{method:"POST",headers:z(s,{"Content-Type":"application/json"}),body:JSON.stringify({body:n})}),c=await a.text();return`HTTP ${a.status} ${a.statusText}
100
- ${c}`}var Do,Os=h(()=>{"use strict";l();Ed();k();Re();xe();Do={name:Pd,displayName:Sd,description:Rd,parameters:$d,category:_d,execute:MT}});var Dd,Md,Od,Nd,Ad,Id=h(()=>{"use strict";l();Dd="github.pr.diff.get",Md="Get PR Diff",Od="Fetch the unified diff for a pull request (text/patch).",Nd="github",Ad={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"PR number"},token:{type:"string",description:"GitHub token (App installation or PAT)"},maxBytes:{type:"integer",description:"Optional max bytes of diff to return; if exceeded, result is truncated with a footer."}},required:["repo","number"]}});import{Buffer as Ns}from"buffer";async function OT(r){let e=String(r.repo),t=Number(r.number),o=await G(e,r.token),n=r.maxBytes?Number(r.maxBytes):void 0,s=`https://api.github.com/repos/${e}/pulls/${t}`;y(`[github.pr.diff.get] repo=${e} pr=${t}`);let i=await fetch(s,{method:"GET",headers:z(o,{Accept:"application/vnd.github.v3.diff"})}),a=await i.text();if(n&&Ns.byteLength(a,"utf8")>n){let c=Ns.from(a,"utf8").subarray(0,n).toString("utf8"),p=`
101
- \u2026 [truncated, ${n} of ${Ns.byteLength(a,"utf8")} bytes]`;return`HTTP ${i.status} ${i.statusText}
102
- ${c}${p}`}return`HTTP ${i.status} ${i.statusText}
103
- ${a}`}var Mo,As=h(()=>{"use strict";l();Id();Re();k();xe();Mo={name:Dd,displayName:Md,description:Od,parameters:Ad,category:Nd,execute:OT}});var Ld,jd,Fd,qd,Wd,Ud=h(()=>{"use strict";l();Ld="github.pr.files.list",jd="List PR Files",Fd="List files changed in a PR with positions metadata.",qd="github",Wd={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"PR number"},token:{type:"string",description:"GitHub token (App installation or PAT)"},perPage:{type:"integer",description:"Results per page (max 100)"},page:{type:"integer",description:"Page number"}},required:["repo","number"]}});async function NT(r){let e=String(r.repo),t=Number(r.number),o=await G(e,r.token),n=r.perPage?Number(r.perPage):void 0,s=r.page?Number(r.page):void 0,i=new URLSearchParams;n&&i.set("per_page",String(n)),s&&i.set("page",String(s));let a=`https://api.github.com/repos/${e}/pulls/${t}/files${i.toString()?`?${i.toString()}`:""}`;y(`[github.pr.files.list] repo=${e} pr=${t} perPage=${n??""} page=${s??""}`);let c=await fetch(a,{method:"GET",headers:z(o)}),p=await c.text();return`HTTP ${c.status} ${c.statusText}
104
- ${p}`}var Oo,Is=h(()=>{"use strict";l();Ud();Re();k();xe();Oo={name:Ld,displayName:jd,description:Fd,parameters:Wd,category:qd,execute:NT}});var Gd,Bd,zd,Hd,Kd,Jd=h(()=>{"use strict";l();Gd="github.pr.reviews.submit",Bd="Submit PR Review",zd="Submit a PR review (APPROVE, REQUEST_CHANGES, or COMMENT), optionally with inline comments.",Hd="github",Kd={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"PR number"},event:{type:"string",description:"Review event",enum:["APPROVE","REQUEST_CHANGES","COMMENT"]},body:{type:"string",description:"Top-level review body"},comments:{type:"array",description:"Optional inline comments array",items:{type:"object",properties:{path:{type:"string",description:"File path"},position:{type:"integer",description:"Position in the diff"},body:{type:"string",description:"Comment body"}},required:["path","position","body"]}},token:{type:"string",description:"GitHub token (App installation or PAT)"}},required:["repo","number","event"]}});async function AT(r){let e=String(r.repo),t=Number(r.number),o=String(r.event),n=r.body?String(r.body):void 0,s=Array.isArray(r.comments)?r.comments:void 0,i=await G(e,r.token),a=`https://api.github.com/repos/${e}/pulls/${t}/reviews`;y(`[github.pr.reviews.submit] repo=${e} pr=${t} event=${o} comments=${s?.length??0}`);let c={event:o};n&&(c.body=n),s&&s.length>0&&(c.comments=s);let p=await fetch(a,{method:"POST",headers:z(i,{"Content-Type":"application/json"}),body:JSON.stringify(c)}),m=await p.text();return`HTTP ${p.status} ${p.statusText}
105
- ${m}`}var No,Ls=h(()=>{"use strict";l();Jd();Re();k();xe();No={name:Gd,displayName:Bd,description:zd,parameters:Kd,category:Hd,execute:AT}});var Vd,Qd,Xd,Yd,Zd,eu=h(()=>{"use strict";l();Vd="github.issues.comments.create",Qd="Create Issue/PR Comment",Xd="Create a comment on an issue or pull request (conversation tab).",Yd="github",Zd={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"Issue or PR number"},body:{type:"string",description:"Comment body"},token:{type:"string",description:"GitHub token (App installation or PAT)"}},required:["repo","number","body"]}});async function IT(r){let e=String(r.repo),t=Number(r.number),o=String(r.body),n=await G(e,r.token),s=`https://api.github.com/repos/${e}/issues/${t}/comments`;y(`[github.issues.comments.create] repo=${e} number=${t}`);let i=await fetch(s,{method:"POST",headers:z(n,{"Content-Type":"application/json"}),body:JSON.stringify({body:o})}),a=await i.text();return`HTTP ${i.status} ${i.statusText}
106
- ${a}`}var Ao,js=h(()=>{"use strict";l();eu();Re();k();xe();Ao={name:Vd,displayName:Qd,description:Xd,parameters:Zd,category:Yd,execute:IT}});var ou={};le(ou,{githubContentsGetTextTool:()=>_o,githubGraphqlExecuteTool:()=>Ro,githubIssuesCommentsCreateTool:()=>Ao,githubPrDiffGetTool:()=>Mo,githubPrFilesListTool:()=>Oo,githubPrReviewCommentsReplyTool:()=>Do,githubPrReviewThreadsListTool:()=>$o,githubPrReviewThreadsResolveTool:()=>Eo,githubPrReviewsSubmitTool:()=>No,githubToolsProject:()=>tu});var tu,Fs=h(()=>{"use strict";l();$s();Es();Ds();Ms();Os();As();Is();Ls();js();$s();Es();Ds();Ms();Os();As();Is();Ls();js();tu={manifest:{key:"github",name:"github-tools",displayName:"GitHub",version:"1.0.0",description:"GitHub GraphQL/REST tools for PR threads, comments, and contents.",author:"Toolpack",tools:["github.graphql.execute","github.contents.getText","github.pr.reviewThreads.list","github.pr.reviewThreads.resolve","github.pr.reviewComments.reply","github.pr.diff.get","github.pr.files.list","github.pr.reviews.submit","github.issues.comments.create"],category:"network"},tools:[Ro,_o,$o,Eo,Do,Mo,Oo,No,Ao],dependencies:{}}});var nu,ru,su,iu,au,lu=h(()=>{"use strict";l();nu="web.fetch",ru="Fetch",su="Fetch content from a URL. Supports multiple extraction modes: full (raw HTML up to 15K chars), structured (title, excerpt, key points), or minimal (title + snippet).",iu="network",au={type:"object",properties:{url:{type:"string",description:"The URL to fetch"},extractionMode:{type:"string",description:'Content extraction mode: "full" (raw HTML, 15K limit), "structured" (title, excerpt, key points, main content), or "minimal" (title + 500 char snippet). Default: "full"',enum:["full","structured","minimal"],default:"full"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as qs from"cheerio";function cu(r,e){let t=qs.load(r);t("script, style, nav, header, footer, aside, .advertisement, .ad, .sidebar").remove();let o=t("title").text().trim()||t("h1").first().text().trim()||t('meta[property="og:title"]').attr("content")||"Untitled",n=t('meta[name="author"]').attr("content")||t('meta[property="article:author"]').attr("content")||t(".author").first().text().trim()||void 0,s=t('meta[property="article:published_time"]').attr("content")||t("time").first().attr("datetime")||t(".date, .published").first().text().trim()||void 0,i=["article","main",'[role="main"]',".content",".article-content",".post-content","#content"],a="";for(let w of i){let b=t(w).first();if(b.length>0&&(a=b.text().trim(),a.length>200))break}(!a||a.length<200)&&(a=t("body").text().trim()),a=a.replace(/\s+/g," ").trim();let c=[];t("p").each((w,b)=>{let T=t(b).text().trim();T.length>50&&c.length<3&&c.push(T)});let p=c.join(`
107
-
108
- `)||a.substring(0,500),m=[];t("h2, h3").each((w,b)=>{let T=t(b).text().trim();T&&T.length>5&&T.length<200&&m.length<10&&m.push(T)});let f=a.split(/\s+/).length,g=a.split(/\s+/);return g.length>2e3&&(a=g.slice(0,2e3).join(" ")+"..."),{title:o,url:e,author:n,publishDate:s,excerpt:p.substring(0,1e3),mainContent:a.substring(0,1e4),keyPoints:m,wordCount:f}}function pu(r,e){let t=qs.load(r);t("script, style, nav, header, footer").remove();let o=t("title").text().trim()||t("h1").first().text().trim()||"Untitled",n=t('meta[name="description"]').attr("content")||t('meta[property="og:description"]').attr("content")||"";return n||t("p").each((s,i)=>{let a=t(i).text().trim();a.length>50&&!n&&(n=a)}),n||(n=t("body").text().trim().replace(/\s+/g," ")),{title:o,url:e,snippet:n.substring(0,500)}}function mu(r){let e=[];return e.push(`# ${r.title}`),e.push(`URL: ${r.url}`),r.author&&e.push(`Author: ${r.author}`),r.publishDate&&e.push(`Published: ${r.publishDate}`),e.push(`Word Count: ${r.wordCount}`),e.push(""),r.keyPoints.length>0&&(e.push("## Key Points"),r.keyPoints.forEach(t=>{e.push(`- ${t}`)}),e.push("")),e.push("## Excerpt"),e.push(r.excerpt),e.push(""),e.push("## Main Content"),e.push(r.mainContent),e.join(`
109
- `)}function du(r){return`# ${r.title}
97
+ ${JSON.stringify(x)}`}catch{return`HTTP ${f.status} ${f.statusText}
98
+ ${g}`}}var Eo,Ms=h(()=>{"use strict";c();Td();_e();k();Ce();Eo={name:gd,displayName:hd,description:yd,parameters:wd,category:bd,execute:MT}});var xd,vd,Cd,Pd,kd,Sd=h(()=>{"use strict";c();xd="github.pr.reviewThreads.resolve",vd="Resolve Review Thread",Cd=["Resolve a PR review thread via GraphQL resolveReviewThread mutation.","IMPORTANT: GitHub App installation tokens (ghs_*) cannot call this mutation \u2014 GitHub returns FORBIDDEN.","This tool only works with a Personal Access Token (PAT) that has repo scope.","If you are using a GitHub App installation token, do NOT call this tool.","Instead, post a reply on the thread acknowledging the fix and ask the author to resolve it manually."].join(" "),Pd="github",kd={type:"object",properties:{threadId:{type:"string",description:"GraphQL node ID of the review thread"},repo:{type:"string",description:"owner/name \u2014 used for token resolution when no explicit token is provided"},token:{type:"string",description:"GitHub token \u2014 MUST be a PAT with repo scope. App installation tokens (ghs_*) will receive FORBIDDEN."}},required:["threadId"]}});async function OT(r){let e=String(r.threadId),t=await B(r.repo,r.token);y(`[github.pr.reviewThreads.resolve] threadId=${e}`);let n=await fetch("https://api.github.com/graphql",{method:"POST",headers:J(t,{"Content-Type":"application/json"}),body:JSON.stringify({query:"mutation($id:ID!){ resolveReviewThread(input:{threadId:$id}) { thread { id isResolved } } }",variables:{id:e}})}),s=await n.text();if(n.ok)try{if(JSON.parse(s).errors?.find(l=>l.type==="FORBIDDEN"))return["TOOL_UNSUPPORTED_FOR_TOKEN_TYPE: resolveReviewThread is not available for GitHub App installation tokens (ghs_*).","GitHub requires a user identity (PAT with repo scope) for this operation.","Fallback action: post a reply on the thread acknowledging the fix and ask the author to resolve it manually."].join(" ")}catch{}return`HTTP ${n.status} ${n.statusText}
99
+ ${s}`}var Do,Os=h(()=>{"use strict";c();Sd();_e();k();Ce();Do={name:xd,displayName:vd,description:Cd,parameters:kd,category:Pd,execute:OT}});var Rd,_d,$d,Ed,Dd,Md=h(()=>{"use strict";c();Rd="github.pr.reviewComments.reply",_d="Reply to Review Comment",$d="Reply within an existing PR review thread to maintain continuity.",Ed="github",Dd={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"PR number"},inReplyTo:{type:"integer",description:"databaseId of the review comment to reply to"},body:{type:"string",description:"Reply body"},token:{type:"string",description:"GitHub token (App installation or PAT)"}},required:["repo","number","inReplyTo","body"]}});async function NT(r){let e=String(r.repo),t=Number(r.number),o=Number(r.inReplyTo),n=String(r.body),s=await B(e,r.token),i=`https://api.github.com/repos/${e}/pulls/${t}/comments/${o}/replies`;y(`[github.pr.reviewComments.reply] repo=${e} inReplyTo=${o}`);let a=await fetch(i,{method:"POST",headers:J(s,{"Content-Type":"application/json"}),body:JSON.stringify({body:n})}),l=await a.text();return`HTTP ${a.status} ${a.statusText}
100
+ ${l}`}var Mo,Ns=h(()=>{"use strict";c();Md();k();_e();Ce();Mo={name:Rd,displayName:_d,description:$d,parameters:Dd,category:Ed,execute:NT}});var Od,Nd,Ad,Id,Ld,jd=h(()=>{"use strict";c();Od="github.pr.diff.get",Nd="Get PR Diff",Ad="Fetch the unified diff for a pull request (text/patch).",Id="github",Ld={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"PR number"},token:{type:"string",description:"GitHub token (App installation or PAT)"},maxBytes:{type:"integer",description:"Optional max bytes of diff to return; if exceeded, result is truncated with a footer."}},required:["repo","number"]}});import{Buffer as As}from"buffer";async function AT(r){let e=String(r.repo),t=Number(r.number),o=await B(e,r.token),n=r.maxBytes?Number(r.maxBytes):void 0,s=`https://api.github.com/repos/${e}/pulls/${t}`;y(`[github.pr.diff.get] repo=${e} pr=${t}`);let i=await fetch(s,{method:"GET",headers:J(o,{Accept:"application/vnd.github.v3.diff"})}),a=await i.text();if(n&&As.byteLength(a,"utf8")>n){let l=As.from(a,"utf8").subarray(0,n).toString("utf8"),p=`
101
+ \u2026 [truncated, ${n} of ${As.byteLength(a,"utf8")} bytes]`;return`HTTP ${i.status} ${i.statusText}
102
+ ${l}${p}`}return`HTTP ${i.status} ${i.statusText}
103
+ ${a}`}var Oo,Is=h(()=>{"use strict";c();jd();_e();k();Ce();Oo={name:Od,displayName:Nd,description:Ad,parameters:Ld,category:Id,execute:AT}});var Fd,qd,Wd,Ud,Gd,Bd=h(()=>{"use strict";c();Fd="github.pr.files.list",qd="List PR Files",Wd="List files changed in a PR with positions metadata.",Ud="github",Gd={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"PR number"},token:{type:"string",description:"GitHub token (App installation or PAT)"},perPage:{type:"integer",description:"Results per page (max 100)"},page:{type:"integer",description:"Page number"}},required:["repo","number"]}});async function IT(r){let e=String(r.repo),t=Number(r.number),o=await B(e,r.token),n=r.perPage?Number(r.perPage):void 0,s=r.page?Number(r.page):void 0,i=new URLSearchParams;n&&i.set("per_page",String(n)),s&&i.set("page",String(s));let a=`https://api.github.com/repos/${e}/pulls/${t}/files${i.toString()?`?${i.toString()}`:""}`;y(`[github.pr.files.list] repo=${e} pr=${t} perPage=${n??""} page=${s??""}`);let l=await fetch(a,{method:"GET",headers:J(o)}),p=await l.text();return`HTTP ${l.status} ${l.statusText}
104
+ ${p}`}var No,Ls=h(()=>{"use strict";c();Bd();_e();k();Ce();No={name:Fd,displayName:qd,description:Wd,parameters:Gd,category:Ud,execute:IT}});var zd,Hd,Kd,Jd,Vd,Qd=h(()=>{"use strict";c();zd="github.pr.reviews.submit",Hd="Submit PR Review",Kd="Submit a PR review (APPROVE, REQUEST_CHANGES, or COMMENT), optionally with inline comments.",Jd="github",Vd={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"PR number"},event:{type:"string",description:"Review event",enum:["APPROVE","REQUEST_CHANGES","COMMENT"]},body:{type:"string",description:"Top-level review body"},comments:{type:"array",description:"Optional inline comments array",items:{type:"object",properties:{path:{type:"string",description:"File path"},position:{type:"integer",description:"Position in the diff"},body:{type:"string",description:"Comment body"}},required:["path","position","body"]}},token:{type:"string",description:"GitHub token (App installation or PAT)"}},required:["repo","number","event"]}});async function LT(r){let e=String(r.repo),t=Number(r.number),o=String(r.event),n=r.body?String(r.body):void 0,s=Array.isArray(r.comments)?r.comments:void 0,i=await B(e,r.token),a=`https://api.github.com/repos/${e}/pulls/${t}/reviews`;y(`[github.pr.reviews.submit] repo=${e} pr=${t} event=${o} comments=${s?.length??0}`);let l={event:o};n&&(l.body=n),s&&s.length>0&&(l.comments=s);let p=await fetch(a,{method:"POST",headers:J(i,{"Content-Type":"application/json"}),body:JSON.stringify(l)}),m=await p.text();return`HTTP ${p.status} ${p.statusText}
105
+ ${m}`}var Ao,js=h(()=>{"use strict";c();Qd();_e();k();Ce();Ao={name:zd,displayName:Hd,description:Kd,parameters:Vd,category:Jd,execute:LT}});var Xd,Yd,Zd,eu,tu,ou=h(()=>{"use strict";c();Xd="github.issues.comments.create",Yd="Create Issue/PR Comment",Zd="Create a comment on an issue or pull request (conversation tab).",eu="github",tu={type:"object",properties:{repo:{type:"string",description:"owner/name"},number:{type:"integer",description:"Issue or PR number"},body:{type:"string",description:"Comment body"},token:{type:"string",description:"GitHub token (App installation or PAT)"}},required:["repo","number","body"]}});async function jT(r){let e=String(r.repo),t=Number(r.number),o=String(r.body),n=await B(e,r.token),s=`https://api.github.com/repos/${e}/issues/${t}/comments`;y(`[github.issues.comments.create] repo=${e} number=${t}`);let i=await fetch(s,{method:"POST",headers:J(n,{"Content-Type":"application/json"}),body:JSON.stringify({body:o})}),a=await i.text();return`HTTP ${i.status} ${i.statusText}
106
+ ${a}`}var Io,Fs=h(()=>{"use strict";c();ou();_e();k();Ce();Io={name:Xd,displayName:Yd,description:Zd,parameters:tu,category:eu,execute:jT}});var ru={};ue(ru,{githubContentsGetTextTool:()=>$o,githubGraphqlExecuteTool:()=>_o,githubIssuesCommentsCreateTool:()=>Io,githubPrDiffGetTool:()=>Oo,githubPrFilesListTool:()=>No,githubPrReviewCommentsReplyTool:()=>Mo,githubPrReviewThreadsListTool:()=>Eo,githubPrReviewThreadsResolveTool:()=>Do,githubPrReviewsSubmitTool:()=>Ao,githubToolsProject:()=>nu});var nu,qs=h(()=>{"use strict";c();Es();Ds();Ms();Os();Ns();Is();Ls();js();Fs();Es();Ds();Ms();Os();Ns();Is();Ls();js();Fs();nu={manifest:{key:"github",name:"github-tools",displayName:"GitHub",version:"1.0.0",description:"GitHub GraphQL/REST tools for PR threads, comments, and contents.",author:"Toolpack",tools:["github.graphql.execute","github.contents.getText","github.pr.reviewThreads.list","github.pr.reviewThreads.resolve","github.pr.reviewComments.reply","github.pr.diff.get","github.pr.files.list","github.pr.reviews.submit","github.issues.comments.create"],category:"network"},tools:[_o,$o,Eo,Do,Mo,Oo,No,Ao,Io],dependencies:{}}});var su,iu,au,lu,cu,pu=h(()=>{"use strict";c();su="web.fetch",iu="Fetch",au="Fetch content from a URL. Supports multiple extraction modes: full (raw HTML up to 15K chars), structured (title, excerpt, key points), or minimal (title + snippet).",lu="network",cu={type:"object",properties:{url:{type:"string",description:"The URL to fetch"},extractionMode:{type:"string",description:'Content extraction mode: "full" (raw HTML, 15K limit), "structured" (title, excerpt, key points, main content), or "minimal" (title + 500 char snippet). Default: "full"',enum:["full","structured","minimal"],default:"full"},headers:{type:"object",description:"Optional HTTP headers as key-value pairs"},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as Ws from"cheerio";function mu(r,e){let t=Ws.load(r);t("script, style, nav, header, footer, aside, .advertisement, .ad, .sidebar").remove();let o=t("title").text().trim()||t("h1").first().text().trim()||t('meta[property="og:title"]').attr("content")||"Untitled",n=t('meta[name="author"]').attr("content")||t('meta[property="article:author"]').attr("content")||t(".author").first().text().trim()||void 0,s=t('meta[property="article:published_time"]').attr("content")||t("time").first().attr("datetime")||t(".date, .published").first().text().trim()||void 0,i=["article","main",'[role="main"]',".content",".article-content",".post-content","#content"],a="";for(let w of i){let b=t(w).first();if(b.length>0&&(a=b.text().trim(),a.length>200))break}(!a||a.length<200)&&(a=t("body").text().trim()),a=a.replace(/\s+/g," ").trim();let l=[];t("p").each((w,b)=>{let T=t(b).text().trim();T.length>50&&l.length<3&&l.push(T)});let p=l.join(`
107
+
108
+ `)||a.substring(0,500),m=[];t("h2, h3").each((w,b)=>{let T=t(b).text().trim();T&&T.length>5&&T.length<200&&m.length<10&&m.push(T)});let f=a.split(/\s+/).length,g=a.split(/\s+/);return g.length>2e3&&(a=g.slice(0,2e3).join(" ")+"..."),{title:o,url:e,author:n,publishDate:s,excerpt:p.substring(0,1e3),mainContent:a.substring(0,1e4),keyPoints:m,wordCount:f}}function du(r,e){let t=Ws.load(r);t("script, style, nav, header, footer").remove();let o=t("title").text().trim()||t("h1").first().text().trim()||"Untitled",n=t('meta[name="description"]').attr("content")||t('meta[property="og:description"]').attr("content")||"";return n||t("p").each((s,i)=>{let a=t(i).text().trim();a.length>50&&!n&&(n=a)}),n||(n=t("body").text().trim().replace(/\s+/g," ")),{title:o,url:e,snippet:n.substring(0,500)}}function uu(r){let e=[];return e.push(`# ${r.title}`),e.push(`URL: ${r.url}`),r.author&&e.push(`Author: ${r.author}`),r.publishDate&&e.push(`Published: ${r.publishDate}`),e.push(`Word Count: ${r.wordCount}`),e.push(""),r.keyPoints.length>0&&(e.push("## Key Points"),r.keyPoints.forEach(t=>{e.push(`- ${t}`)}),e.push("")),e.push("## Excerpt"),e.push(r.excerpt),e.push(""),e.push("## Main Content"),e.push(r.mainContent),e.join(`
109
+ `)}function fu(r){return`# ${r.title}
110
110
  URL: ${r.url}
111
111
 
112
- ${r.snippet}`}var uu=h(()=>{"use strict";l()});async function LT(r){let e=r.url,t=r.extractionMode||"full",o=r.headers,n=r.timeout||3e4;if(y(`[web.fetch] execute url="${e}" mode=${t} timeout=${n}ms`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let s=new AbortController,i=setTimeout(()=>s.abort(),n),a;try{a=await fetch(e,{method:"GET",headers:o||{},signal:s.signal})}catch(p){throw p.name==="AbortError"?new Error(`Request timed out after ${n}ms`):p}finally{clearTimeout(i)}if(!a.ok)return`HTTP ${a.status} ${a.statusText}
113
- ${await a.text()}`;let c=await a.text();if(t==="structured"){let p=cu(c,e);return mu(p)}else if(t==="minimal"){let p=pu(c,e);return du(p)}else return c.length>15e3?c.substring(0,15e3)+`
112
+ ${r.snippet}`}var gu=h(()=>{"use strict";c()});async function FT(r){let e=r.url,t=r.extractionMode||"full",o=r.headers,n=r.timeout||3e4;if(y(`[web.fetch] execute url="${e}" mode=${t} timeout=${n}ms`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let s=new AbortController,i=setTimeout(()=>s.abort(),n),a;try{a=await fetch(e,{method:"GET",headers:o||{},signal:s.signal})}catch(p){throw p.name==="AbortError"?new Error(`Request timed out after ${n}ms`):p}finally{clearTimeout(i)}if(!a.ok)return`HTTP ${a.status} ${a.statusText}
113
+ ${await a.text()}`;let l=await a.text();if(t==="structured"){let p=mu(l,e);return uu(p)}else if(t==="minimal"){let p=du(l,e);return fu(p)}else return l.length>15e3?l.substring(0,15e3)+`
114
114
 
115
- [TRUNCATED: showing 15K of ${c.length} total characters]`:c}var Io,Ws=h(()=>{"use strict";l();lu();uu();k();Io={name:nu,displayName:ru,description:su,parameters:au,category:iu,execute:LT}});var fu,gu,hu,yu,bu,wu=h(()=>{"use strict";l();fu="web.search",gu="Search",hu="Search the web using multiple providers (Tavily, Brave, DuckDuckGo Lite) with automatic fallback. Supports real-time results via freshness parameter and AI-generated answers. Configure API keys via environment variables (TOOLPACK_TAVILY_API_KEY, TOOLPACK_BRAVE_API_KEY) or toolpack.config.json for best results.",yu="network",bu={type:"object",properties:{query:{type:"string",description:"The search query"},max_results:{type:"integer",description:"Maximum number of results to return (default: 5)",default:5},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4},include_answer:{type:"boolean",description:"Include AI-generated answer summary (works with Tavily and Brave APIs). Default: false",default:!1},freshness:{type:"string",description:'Time range for fresh/recent results: "day" (last 24h), "week" (last 7 days), "month" (last 31 days), "year" (last 365 days). Ensures latest real-time data. Supported by Tavily and Brave APIs; DuckDuckGo returns general results.',enum:["day","week","month","year"]}},required:["query"]}});import*as Fe from"fs";import*as Nn from"path";function An(r){let e=xu(r);if(!Fe.existsSync(e))return{};try{let t=Fe.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return{}}}function Lo(r){let e=An(r),t=FT(e.tools||e);return y(JSON.stringify(t??{})),t}function jT(r,e){let t=xu(e),o={};try{Fe.existsSync(t)&&(o=JSON.parse(Fe.readFileSync(t,"utf-8")))}catch{o={}}o.tools=r,Fe.writeFileSync(t,JSON.stringify(o,null,4),"utf-8")}function FT(r){let e=r.additionalConfigurations||{};return e.webSearch||(e.webSearch={}),!e.webSearch.tavilyApiKey&&process.env.TOOLPACK_TAVILY_API_KEY&&(e.webSearch.tavilyApiKey=process.env.TOOLPACK_TAVILY_API_KEY),!e.webSearch.braveApiKey&&process.env.TOOLPACK_BRAVE_API_KEY&&(e.webSearch.braveApiKey=process.env.TOOLPACK_BRAVE_API_KEY),{enabled:r.enabled??re.enabled,autoExecute:r.autoExecute??re.autoExecute,maxToolRounds:r.maxToolRounds??re.maxToolRounds,toolChoicePolicy:r.toolChoicePolicy??re.toolChoicePolicy,resultMaxChars:r.resultMaxChars??re.resultMaxChars,enabledTools:r.enabledTools??re.enabledTools,enabledToolCategories:r.enabledToolCategories??re.enabledToolCategories,toolSearch:r.toolSearch??re.toolSearch,additionalConfigurations:e}}function xu(r){return r?r.endsWith(".json")?Nn.resolve(r):Nn.resolve(r,Tu):Nn.resolve(process.cwd(),Tu)}var Tu,Us=h(()=>{"use strict";l();Lt();k();Tu="toolpack.config.json"});import*as Cu from"cheerio";function UT(r,e){y("[web.search] Parsing DuckDuckGo Lite response");let t=Cu.load(r),o=[];return t("a.result-link").each((s,i)=>{if(o.length>=e)return;let a=t(i),c=a.text().trim(),p=a.attr("href"),m=a.siblings(".result-snippet").text().trim();m||(m=a.parent().text().replace(c,"").trim()),c&&p&&o.push({title:c,link:p,snippet:m.slice(0,200)})}),o}function GT(r){if(r)switch(r){case"day":return 1;case"week":return 7;case"month":return 31;case"year":return 365;default:return}}function vu(r){if(!r)return"";switch(r){case"day":return"pd";case"week":return"pw";case"month":return"pm";case"year":return"py";default:return""}}async function BT(r){let e=r.query,t=r.max_results||5,o=r.include_answer||!1,n=r.freshness;y(`[web.search] execute query="${e}" max_results=${t} includeAnswer=${o} freshness=${n??"none"}`);let s=`Request timed out after ${r.timeout||3e4}ms`,i=()=>{let f=new AbortController,g=setTimeout(()=>f.abort(),r.timeout||3e4);return{signal:f.signal,clear:()=>clearTimeout(g)}};if(!e)throw new Error("query is required");let a=Lo();if(y(`[web.search] config=${JSON.stringify(a)}`),a.additionalConfigurations?.webSearch?.tavilyApiKey){y("[web.search] using Tavily API");try{let{signal:f,clear:g}=i(),w=GT(n),b={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({api_key:a.additionalConfigurations.webSearch.tavilyApiKey,query:e,max_results:t,include_answer:o,...w&&{days:w}}),signal:f};y(`[web.search] Tavily request=${JSON.stringify(b)}`);let T=await fetch("https://api.tavily.com/search",b).finally(g);if(T.ok){let v=await T.json();if(v.results&&v.results.length>0){let C=v.results.map(x=>({title:x.title,link:x.url,snippet:x.content}));return o&&v.answer?JSON.stringify({answer:v.answer,results:C},null,2):JSON.stringify(C,null,2)}}else pe(`[web.search] Tavily search failed with status ${T.status}`)}catch(f){pe(`[web.search] Tavily search failed, falling back: ${f}`)}}if(a.additionalConfigurations?.webSearch?.braveApiKey)try{let{signal:f,clear:g}=i();if(o){let w=vu(n),b=w?`&freshness=${w}`:"",T=await fetch(`https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(e)}&count=${Math.min(t,20)}&summary=1${b}`,{headers:{Accept:"application/json","Accept-Encoding":"gzip","X-Subscription-Token":a.additionalConfigurations.webSearch.braveApiKey},signal:f}).finally(g);if(T.ok){let v=await T.json(),C=v.summarizer?.key;if(C&&v.web?.results){let{signal:x,clear:R}=i(),D=await fetch(`https://api.search.brave.com/res/v1/summarizer/search?key=${C}`,{headers:{Accept:"application/json","X-Subscription-Token":a.additionalConfigurations.webSearch.braveApiKey},signal:x}).finally(R);if(D.ok){let M=await D.json(),S=v.web.results.slice(0,t).map(_=>({title:_.title,link:_.url,snippet:_.description})),$=M.summary?.map(_=>_.data).join(`
116
- `)||M.title;return JSON.stringify({answer:$,results:S},null,2)}}if(v.web?.results){let x=v.web.results.slice(0,t).map(R=>({title:R.title,link:R.url,snippet:R.description}));return JSON.stringify(x,null,2)}}}else{let w=vu(n),b=w?`&freshness=${w}`:"",T=await fetch(`https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(e)}&count=${Math.min(t,20)}${b}`,{headers:{Accept:"application/json","Accept-Encoding":"gzip","X-Subscription-Token":a.additionalConfigurations.webSearch.braveApiKey},signal:f}).finally(g);if(T.ok){let v=await T.json();if(v.web?.results&&v.web.results.length>0){let C=v.web.results.slice(0,t).map(x=>({title:x.title,link:x.url,snippet:x.description}));return JSON.stringify(C,null,2)}}}}catch(f){I(`[web.search] Brave search failed, falling back: ${f}`)}let{signal:c,clear:p}=i(),m;try{m=await fetch(qT,{method:"POST",headers:{"User-Agent":WT,"Content-Type":"application/x-www-form-urlencoded",Origin:"https://lite.duckduckgo.com",Referer:"https://lite.duckduckgo.com/"},body:new URLSearchParams({q:e}).toString(),signal:c})}catch(f){throw f.name==="AbortError"?new Error(s):f}finally{p()}if(m.ok){let f=await m.text(),g=UT(f,t);if(g.length>0)return JSON.stringify(g,null,2)}return JSON.stringify({error:"search_unavailable",message:`Search failed to find results for "${e}" across all providers.`,suggestion:"Please configure a search provider API key (tavilyApiKey or braveApiKey) in toolpack.config.json under tools.additionalConfigurations.webSearch."})}var qT,WT,jo,Gs=h(()=>{"use strict";l();wu();Us();k();qT="https://lite.duckduckgo.com/lite/",WT="Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1";jo={name:fu,displayName:gu,description:hu,parameters:bu,category:yu,execute:BT}});var ku,Pu,Su,Ru,_u,$u=h(()=>{"use strict";l();ku="web.scrape",Pu="Scrape",Su="Extract clean text content from a webpage. RECOMMENDED WORKFLOW: Use web.map first to see page structure, then use section parameter to extract specific sections. Strips scripts, styles, navigation, and other junk. By default, auto-detects and extracts the main article/content area.",Ru="network",_u={type:"object",properties:{url:{type:"string",description:"The URL to scrape"},section:{type:"string",description:'Optional section name to extract (e.g., "talks", "about", "experience"). Finds the heading containing this text and extracts content until the next same-level heading. Use web.map first to discover available sections.'},format:{type:"string",description:'Output format: "text" (clean readable text) or "tables" (extract table data as JSON array). Default: "text"',enum:["text","tables"],default:"text"},selector:{type:"string",description:"Optional CSS selector to target a specific element. Only use if you know the exact selector exists."},max_length:{type:"integer",description:"Maximum characters to return (default: 6000). Keep small (3000-6000) to avoid context limits.",default:6e3},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as Mu from"cheerio";async function KT(r){let e=r.url,t=r.selector,o=r.section,n=r.format||"text",s=r.max_length||6e3,i=r.timeout||3e4;if(y(`[web.scrape] execute url="${e}" format=${n} selector=${t??"none"} section=${o??"none"} timeout=${i}ms`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let a=new AbortController,c=setTimeout(()=>a.abort(),i),p;try{p=await fetch(e,{method:"GET",headers:{"User-Agent":zT},signal:a.signal})}catch(b){throw b.name==="AbortError"?new Error(`Request timed out after ${i}ms`):b}finally{clearTimeout(c)}if(!p.ok)throw new Error(`Failed to fetch ${e}: HTTP ${p.status} ${p.statusText}`);let m=await p.text(),f=Mu.load(m);for(let b of HT)f(b).remove();if(n==="tables"){let b=[];return f("table").each((T,v)=>{let C=[],x=[];f(v).find("th").each((R,D)=>{x.push(f(D).text().trim())}),f(v).find("tr").each((R,D)=>{let M=x.length>0?{}:[],S=f(D).find("td");S.length>0&&(S.each(($,_)=>{let L=f(_).text().trim();x.length>0&&x[$]?M[x[$]]=L:M.push(L)}),C.push(M))}),C.length>0&&b.push({id:`Table ${T+1}`,headers:x.length>0?x:void 0,rows:C})}),b.length===0?`No tables found on ${e}`:JSON.stringify(b,null,2)}let g="";if(o){let b=o.toLowerCase(),T=null,v=0;if(f("h1, h2, h3, h4, h5, h6").each((C,x)=>{if(f(x).text().toLowerCase().includes(b))return T=x,v=parseInt(x.tagName.charAt(1)),!1}),T){let C=f(T),x=[],R=C.next();for(;R.length>0;){let D=R.prop("tagName")?.toLowerCase();if(D&&/^h[1-6]$/.test(D)&&parseInt(D.charAt(1))<=v)break;let M=R.text().trim();M&&x.push(M),R=R.next()}x.length>0?(g=x.join(`
115
+ [TRUNCATED: showing 15K of ${l.length} total characters]`:l}var Lo,Us=h(()=>{"use strict";c();pu();gu();k();Lo={name:su,displayName:iu,description:au,parameters:cu,category:lu,execute:FT}});var hu,yu,bu,wu,Tu,xu=h(()=>{"use strict";c();hu="web.search",yu="Search",bu="Search the web using multiple providers (Tavily, Brave, DuckDuckGo Lite) with automatic fallback. Supports real-time results via freshness parameter and AI-generated answers. Configure API keys via environment variables (TOOLPACK_TAVILY_API_KEY, TOOLPACK_BRAVE_API_KEY) or toolpack.config.json for best results.",wu="network",Tu={type:"object",properties:{query:{type:"string",description:"The search query"},max_results:{type:"integer",description:"Maximum number of results to return (default: 5)",default:5},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4},include_answer:{type:"boolean",description:"Include AI-generated answer summary (works with Tavily and Brave APIs). Default: false",default:!1},freshness:{type:"string",description:'Time range for fresh/recent results: "day" (last 24h), "week" (last 7 days), "month" (last 31 days), "year" (last 365 days). Ensures latest real-time data. Supported by Tavily and Brave APIs; DuckDuckGo returns general results.',enum:["day","week","month","year"]}},required:["query"]}});import*as Fe from"fs";import*as An from"path";function In(r){let e=Cu(r);if(!Fe.existsSync(e))return{};try{let t=Fe.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return{}}}function jo(r){let e=In(r),t=WT(e.tools||e);return y(JSON.stringify(t??{})),t}function qT(r,e){let t=Cu(e),o={};try{Fe.existsSync(t)&&(o=JSON.parse(Fe.readFileSync(t,"utf-8")))}catch{o={}}o.tools=r,Fe.writeFileSync(t,JSON.stringify(o,null,4),"utf-8")}function WT(r){let e=r.additionalConfigurations||{};return e.webSearch||(e.webSearch={}),!e.webSearch.tavilyApiKey&&process.env.TOOLPACK_TAVILY_API_KEY&&(e.webSearch.tavilyApiKey=process.env.TOOLPACK_TAVILY_API_KEY),!e.webSearch.braveApiKey&&process.env.TOOLPACK_BRAVE_API_KEY&&(e.webSearch.braveApiKey=process.env.TOOLPACK_BRAVE_API_KEY),{enabled:r.enabled??le.enabled,autoExecute:r.autoExecute??le.autoExecute,maxToolRounds:r.maxToolRounds??le.maxToolRounds,toolChoicePolicy:r.toolChoicePolicy??le.toolChoicePolicy,resultMaxChars:r.resultMaxChars??le.resultMaxChars,enabledTools:r.enabledTools??le.enabledTools,enabledToolCategories:r.enabledToolCategories??le.enabledToolCategories,toolSearch:r.toolSearch??le.toolSearch,additionalConfigurations:e}}function Cu(r){return r?r.endsWith(".json")?An.resolve(r):An.resolve(r,vu):An.resolve(process.cwd(),vu)}var vu,Gs=h(()=>{"use strict";c();jt();k();vu="toolpack.config.json"});import*as ku from"cheerio";function BT(r,e){y("[web.search] Parsing DuckDuckGo Lite response");let t=ku.load(r),o=[];return t("a.result-link").each((s,i)=>{if(o.length>=e)return;let a=t(i),l=a.text().trim(),p=a.attr("href"),m=a.siblings(".result-snippet").text().trim();m||(m=a.parent().text().replace(l,"").trim()),l&&p&&o.push({title:l,link:p,snippet:m.slice(0,200)})}),o}function zT(r){if(r)switch(r){case"day":return 1;case"week":return 7;case"month":return 31;case"year":return 365;default:return}}function Pu(r){if(!r)return"";switch(r){case"day":return"pd";case"week":return"pw";case"month":return"pm";case"year":return"py";default:return""}}async function HT(r){let e=r.query,t=r.max_results||5,o=r.include_answer||!1,n=r.freshness;y(`[web.search] execute query="${e}" max_results=${t} includeAnswer=${o} freshness=${n??"none"}`);let s=`Request timed out after ${r.timeout||3e4}ms`,i=()=>{let f=new AbortController,g=setTimeout(()=>f.abort(),r.timeout||3e4);return{signal:f.signal,clear:()=>clearTimeout(g)}};if(!e)throw new Error("query is required");let a=jo();if(y(`[web.search] config=${JSON.stringify(a)}`),a.additionalConfigurations?.webSearch?.tavilyApiKey){y("[web.search] using Tavily API");try{let{signal:f,clear:g}=i(),w=zT(n),b={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({api_key:a.additionalConfigurations.webSearch.tavilyApiKey,query:e,max_results:t,include_answer:o,...w&&{days:w}}),signal:f};y(`[web.search] Tavily request=${JSON.stringify(b)}`);let T=await fetch("https://api.tavily.com/search",b).finally(g);if(T.ok){let x=await T.json();if(x.results&&x.results.length>0){let C=x.results.map(v=>({title:v.title,link:v.url,snippet:v.content}));return o&&x.answer?JSON.stringify({answer:x.answer,results:C},null,2):JSON.stringify(C,null,2)}}else ce(`[web.search] Tavily search failed with status ${T.status}`)}catch(f){ce(`[web.search] Tavily search failed, falling back: ${f}`)}}if(a.additionalConfigurations?.webSearch?.braveApiKey)try{let{signal:f,clear:g}=i();if(o){let w=Pu(n),b=w?`&freshness=${w}`:"",T=await fetch(`https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(e)}&count=${Math.min(t,20)}&summary=1${b}`,{headers:{Accept:"application/json","Accept-Encoding":"gzip","X-Subscription-Token":a.additionalConfigurations.webSearch.braveApiKey},signal:f}).finally(g);if(T.ok){let x=await T.json(),C=x.summarizer?.key;if(C&&x.web?.results){let{signal:v,clear:$}=i(),P=await fetch(`https://api.search.brave.com/res/v1/summarizer/search?key=${C}`,{headers:{Accept:"application/json","X-Subscription-Token":a.additionalConfigurations.webSearch.braveApiKey},signal:v}).finally($);if(P.ok){let M=await P.json(),R=x.web.results.slice(0,t).map(_=>({title:_.title,link:_.url,snippet:_.description})),D=M.summary?.map(_=>_.data).join(`
116
+ `)||M.title;return JSON.stringify({answer:D,results:R},null,2)}}if(x.web?.results){let v=x.web.results.slice(0,t).map($=>({title:$.title,link:$.url,snippet:$.description}));return JSON.stringify(v,null,2)}}}else{let w=Pu(n),b=w?`&freshness=${w}`:"",T=await fetch(`https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(e)}&count=${Math.min(t,20)}${b}`,{headers:{Accept:"application/json","Accept-Encoding":"gzip","X-Subscription-Token":a.additionalConfigurations.webSearch.braveApiKey},signal:f}).finally(g);if(T.ok){let x=await T.json();if(x.web?.results&&x.web.results.length>0){let C=x.web.results.slice(0,t).map(v=>({title:v.title,link:v.url,snippet:v.description}));return JSON.stringify(C,null,2)}}}}catch(f){I(`[web.search] Brave search failed, falling back: ${f}`)}let{signal:l,clear:p}=i(),m;try{m=await fetch(UT,{method:"POST",headers:{"User-Agent":GT,"Content-Type":"application/x-www-form-urlencoded",Origin:"https://lite.duckduckgo.com",Referer:"https://lite.duckduckgo.com/"},body:new URLSearchParams({q:e}).toString(),signal:l})}catch(f){throw f.name==="AbortError"?new Error(s):f}finally{p()}if(m.ok){let f=await m.text(),g=BT(f,t);if(g.length>0)return JSON.stringify(g,null,2)}return JSON.stringify({error:"search_unavailable",message:`Search failed to find results for "${e}" across all providers.`,suggestion:"Please configure a search provider API key (tavilyApiKey or braveApiKey) in toolpack.config.json under tools.additionalConfigurations.webSearch."})}var UT,GT,Fo,Bs=h(()=>{"use strict";c();xu();Gs();k();UT="https://lite.duckduckgo.com/lite/",GT="Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1";Fo={name:hu,displayName:yu,description:bu,parameters:Tu,category:wu,execute:HT}});var Su,Ru,_u,$u,Eu,Du=h(()=>{"use strict";c();Su="web.scrape",Ru="Scrape",_u="Extract clean text content from a webpage. RECOMMENDED WORKFLOW: Use web.map first to see page structure, then use section parameter to extract specific sections. Strips scripts, styles, navigation, and other junk. By default, auto-detects and extracts the main article/content area.",$u="network",Eu={type:"object",properties:{url:{type:"string",description:"The URL to scrape"},section:{type:"string",description:'Optional section name to extract (e.g., "talks", "about", "experience"). Finds the heading containing this text and extracts content until the next same-level heading. Use web.map first to discover available sections.'},format:{type:"string",description:'Output format: "text" (clean readable text) or "tables" (extract table data as JSON array). Default: "text"',enum:["text","tables"],default:"text"},selector:{type:"string",description:"Optional CSS selector to target a specific element. Only use if you know the exact selector exists."},max_length:{type:"integer",description:"Maximum characters to return (default: 6000). Keep small (3000-6000) to avoid context limits.",default:6e3},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as Nu from"cheerio";async function VT(r){let e=r.url,t=r.selector,o=r.section,n=r.format||"text",s=r.max_length||6e3,i=r.timeout||3e4;if(y(`[web.scrape] execute url="${e}" format=${n} selector=${t??"none"} section=${o??"none"} timeout=${i}ms`),!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let a=new AbortController,l=setTimeout(()=>a.abort(),i),p;try{p=await fetch(e,{method:"GET",headers:{"User-Agent":KT},signal:a.signal})}catch(b){throw b.name==="AbortError"?new Error(`Request timed out after ${i}ms`):b}finally{clearTimeout(l)}if(!p.ok)throw new Error(`Failed to fetch ${e}: HTTP ${p.status} ${p.statusText}`);let m=await p.text(),f=Nu.load(m);for(let b of JT)f(b).remove();if(n==="tables"){let b=[];return f("table").each((T,x)=>{let C=[],v=[];f(x).find("th").each(($,P)=>{v.push(f(P).text().trim())}),f(x).find("tr").each(($,P)=>{let M=v.length>0?{}:[],R=f(P).find("td");R.length>0&&(R.each((D,_)=>{let W=f(_).text().trim();v.length>0&&v[D]?M[v[D]]=W:M.push(W)}),C.push(M))}),C.length>0&&b.push({id:`Table ${T+1}`,headers:v.length>0?v:void 0,rows:C})}),b.length===0?`No tables found on ${e}`:JSON.stringify(b,null,2)}let g="";if(o){let b=o.toLowerCase(),T=null,x=0;if(f("h1, h2, h3, h4, h5, h6").each((C,v)=>{if(f(v).text().toLowerCase().includes(b))return T=v,x=parseInt(v.tagName.charAt(1)),!1}),T){let C=f(T),v=[],$=C.next();for(;$.length>0;){let P=$.prop("tagName")?.toLowerCase();if(P&&/^h[1-6]$/.test(P)&&parseInt(P.charAt(1))<=x)break;let M=$.text().trim();M&&v.push(M),$=$.next()}v.length>0?(g=v.join(`
117
117
 
118
118
  `).replace(/\s+/g," ").trim(),g=`[Section: "${o}"]
119
119
 
@@ -121,9 +121,9 @@ ${g}`):g=`[Note: Found heading "${o}" but no content below it. Falling back to f
121
121
 
122
122
  `}else g=`[Note: Section "${o}" not found. Falling back to full page.]
123
123
 
124
- `}if(!g||g.includes("Falling back to full page"))if(g&&g.includes("Falling back to full page")&&(g=""),t){let b=f(t);if(b.length>0)g=b.text().replace(/\s+/g," ").trim();else{for(let T of Eu){let v=f(T);if(v.length>0){let C=v.text().replace(/\s+/g," ").trim();if(C.length>Du){g=C;break}}}if(g)g=`[Note: Selector "${t}" not found. Showing auto-detected main content instead.]
124
+ `}if(!g||g.includes("Falling back to full page"))if(g&&g.includes("Falling back to full page")&&(g=""),t){let b=f(t);if(b.length>0)g=b.text().replace(/\s+/g," ").trim();else{for(let T of Mu){let x=f(T);if(x.length>0){let C=x.text().replace(/\s+/g," ").trim();if(C.length>Ou){g=C;break}}}if(g)g=`[Note: Selector "${t}" not found. Showing auto-detected main content instead.]
125
125
 
126
- ${g}`;else return`No element found matching selector "${t}" and could not auto-detect main content from ${e}`}}else for(let b of Eu){let T=f(b);if(T.length>0){let v=T.text().replace(/\s+/g," ").trim();if(v.length>Du){g=v;break}}}if(g||(g=f("body").text().replace(/\s+/g," ").trim(),g&&(g=`[Note: Could not detect main content area. Showing full page text (may include navigation).]
126
+ ${g}`;else return`No element found matching selector "${t}" and could not auto-detect main content from ${e}`}}else for(let b of Mu){let T=f(b);if(T.length>0){let x=T.text().replace(/\s+/g," ").trim();if(x.length>Ou){g=x;break}}}if(g||(g=f("body").text().replace(/\s+/g," ").trim(),g&&(g=`[Note: Could not detect main content area. Showing full page text (may include navigation).]
127
127
 
128
128
  ${g}`)),!g)return`Could not extract any content from ${e}`;if(g.length>s){let b=g.substring(0,s);return`[Warning: Content exceeds ${s} chars (actual: ${g.length} chars). Showing first ${s} chars only.]
129
129
 
@@ -135,18 +135,18 @@ ${b}
135
135
 
136
136
  ... [Content truncated. ${g.length-s} chars remaining. Use section parameter to extract specific sections.]`}return`Page content from ${e}:
137
137
 
138
- ${g}`}var zT,HT,Eu,Du,Fo,Bs=h(()=>{"use strict";l();$u();k();zT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",HT=["script","style","nav","footer","header","iframe",".ads",".sidebar","noscript"],Eu=["article","main",".content","#content",'[role="main"]',"body"],Du=200;Fo={name:ku,displayName:Pu,description:Su,parameters:_u,category:Ru,execute:KT}});var Ou,Nu,Au,Iu,Lu,ju=h(()=>{"use strict";l();Ou="web.extract_links",Nu="Extract Links",Au="Extract all links from a webpage. Returns an array of objects with text and URL. Optionally filter by pattern.",Iu="network",Lu={type:"object",properties:{url:{type:"string",description:"The URL to extract links from"},filter:{type:"string",description:'Optional filter: "same-domain" to only include links from the same domain, or a substring to match against URLs'},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as Fu from"cheerio";async function VT(r){let e=r.url,t=r.filter,o=r.timeout||3e4;if(!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let n=new AbortController,s=setTimeout(()=>n.abort(),o),i;try{i=await fetch(e,{method:"GET",headers:{"User-Agent":JT},signal:n.signal})}catch(f){throw f.name==="AbortError"?new Error(`Request timed out after ${o}ms`):f}finally{clearTimeout(s)}if(!i.ok)throw new Error(`Failed to fetch ${e}: HTTP ${i.status} ${i.statusText}`);let a=await i.text(),c=Fu.load(a),p=new URL(e),m=[];return c("a[href]").each((f,g)=>{let w=c(g),b=w.attr("href");if(!b)return;let T;try{T=new URL(b,e).toString()}catch{return}if(T.startsWith("javascript:")||T.startsWith("mailto:")||T.startsWith("tel:"))return;let v=w.text().trim()||"[no text]";if(t){if(t==="same-domain")try{if(new URL(T).hostname!==p.hostname)return}catch{return}else if(!T.includes(t))return}m.push({text:v,url:T})}),m.length===0?`No links found on ${e}${t?` matching filter "${t}"`:""}`:JSON.stringify(m,null,2)}var JT,qo,zs=h(()=>{"use strict";l();ju();JT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";qo={name:Ou,displayName:Nu,description:Au,parameters:Lu,category:Iu,execute:VT}});var qu,Wu,Uu,Gu,Bu,zu=h(()=>{"use strict";l();qu="web.map",Wu="Map",Uu="Extract the structure/outline of a webpage by returning all headings (h1-h6). Use this FIRST when you need to understand what sections exist on a page before scraping specific content. Returns a lightweight outline showing the page hierarchy.",Gu="network",Bu={type:"object",properties:{url:{type:"string",description:"The URL to map"},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as Hu from"cheerio";async function XT(r){let e=r.url,t=r.timeout||3e4;if(!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let o=new AbortController,n=setTimeout(()=>o.abort(),t),s;try{s=await fetch(e,{method:"GET",headers:{"User-Agent":QT},signal:o.signal})}catch(m){throw m.name==="AbortError"?new Error(`Request timed out after ${t}ms`):m}finally{clearTimeout(n)}if(!s.ok)throw new Error(`Failed to fetch ${e}: HTTP ${s.status} ${s.statusText}`);let i=await s.text(),a=Hu.load(i),c=[];if(a("h1, h2, h3, h4, h5, h6").each((m,f)=>{let g=f.tagName.toLowerCase(),w=parseInt(g.charAt(1)),b=a(f).text().trim();b&&c.push({level:w,text:b})}),c.length===0)return`No headings found on ${e}. The page may not have a clear structure.`;let p=`Page outline for ${e}:
138
+ ${g}`}var KT,JT,Mu,Ou,qo,zs=h(()=>{"use strict";c();Du();k();KT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",JT=["script","style","nav","footer","header","iframe",".ads",".sidebar","noscript"],Mu=["article","main",".content","#content",'[role="main"]',"body"],Ou=200;qo={name:Su,displayName:Ru,description:_u,parameters:Eu,category:$u,execute:VT}});var Au,Iu,Lu,ju,Fu,qu=h(()=>{"use strict";c();Au="web.extract_links",Iu="Extract Links",Lu="Extract all links from a webpage. Returns an array of objects with text and URL. Optionally filter by pattern.",ju="network",Fu={type:"object",properties:{url:{type:"string",description:"The URL to extract links from"},filter:{type:"string",description:'Optional filter: "same-domain" to only include links from the same domain, or a substring to match against URLs'},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as Wu from"cheerio";async function XT(r){let e=r.url,t=r.filter,o=r.timeout||3e4;if(!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let n=new AbortController,s=setTimeout(()=>n.abort(),o),i;try{i=await fetch(e,{method:"GET",headers:{"User-Agent":QT},signal:n.signal})}catch(f){throw f.name==="AbortError"?new Error(`Request timed out after ${o}ms`):f}finally{clearTimeout(s)}if(!i.ok)throw new Error(`Failed to fetch ${e}: HTTP ${i.status} ${i.statusText}`);let a=await i.text(),l=Wu.load(a),p=new URL(e),m=[];return l("a[href]").each((f,g)=>{let w=l(g),b=w.attr("href");if(!b)return;let T;try{T=new URL(b,e).toString()}catch{return}if(T.startsWith("javascript:")||T.startsWith("mailto:")||T.startsWith("tel:"))return;let x=w.text().trim()||"[no text]";if(t){if(t==="same-domain")try{if(new URL(T).hostname!==p.hostname)return}catch{return}else if(!T.includes(t))return}m.push({text:x,url:T})}),m.length===0?`No links found on ${e}${t?` matching filter "${t}"`:""}`:JSON.stringify(m,null,2)}var QT,Wo,Hs=h(()=>{"use strict";c();qu();QT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";Wo={name:Au,displayName:Iu,description:Lu,parameters:Fu,category:ju,execute:XT}});var Uu,Gu,Bu,zu,Hu,Ku=h(()=>{"use strict";c();Uu="web.map",Gu="Map",Bu="Extract the structure/outline of a webpage by returning all headings (h1-h6). Use this FIRST when you need to understand what sections exist on a page before scraping specific content. Returns a lightweight outline showing the page hierarchy.",zu="network",Hu={type:"object",properties:{url:{type:"string",description:"The URL to map"},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as Ju from"cheerio";async function ZT(r){let e=r.url,t=r.timeout||3e4;if(!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let o=new AbortController,n=setTimeout(()=>o.abort(),t),s;try{s=await fetch(e,{method:"GET",headers:{"User-Agent":YT},signal:o.signal})}catch(m){throw m.name==="AbortError"?new Error(`Request timed out after ${t}ms`):m}finally{clearTimeout(n)}if(!s.ok)throw new Error(`Failed to fetch ${e}: HTTP ${s.status} ${s.statusText}`);let i=await s.text(),a=Ju.load(i),l=[];if(a("h1, h2, h3, h4, h5, h6").each((m,f)=>{let g=f.tagName.toLowerCase(),w=parseInt(g.charAt(1)),b=a(f).text().trim();b&&l.push({level:w,text:b})}),l.length===0)return`No headings found on ${e}. The page may not have a clear structure.`;let p=`Page outline for ${e}:
139
139
 
140
- `;for(let m of c){let f=" ".repeat(m.level-1);p+=`${f}${"#".repeat(m.level)} ${m.text}
141
- `}return p}var QT,Wo,Hs=h(()=>{"use strict";l();zu();QT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";Wo={name:qu,displayName:Wu,description:Uu,parameters:Bu,category:Gu,execute:XT}});var Ku,Ju,Vu,Qu,Xu,Yu=h(()=>{"use strict";l();Ku="web.metadata",Ju="Extract Metadata",Vu="Extract Open Graph, Twitter Cards, JSON-LD, and meta tags from a URL.",Qu="network",Xu={type:"object",properties:{url:{type:"string",description:"The URL to extract metadata from"},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as Zu from"cheerio";async function ZT(r){let e=r.url,t=r.timeout||3e4;if(!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let o=new AbortController,n=setTimeout(()=>o.abort(),t),s;try{s=await fetch(e,{method:"GET",headers:{"User-Agent":YT},signal:o.signal})}catch(p){throw p.name==="AbortError"?new Error(`Request timed out after ${t}ms`):p}finally{clearTimeout(n)}if(!s.ok)throw new Error(`Failed to fetch ${e}: HTTP ${s.status} ${s.statusText}`);let i=await s.text(),a=Zu.load(i),c={title:a("title").text()||"",description:a('meta[name="description"]').attr("content")||a('meta[property="og:description"]').attr("content")||"",author:a('meta[name="author"]').attr("content")||"",openGraph:{},twitter:{},jsonLd:[]};return a('meta[property^="og:"]').each((p,m)=>{let f=a(m).attr("property")?.replace("og:",""),g=a(m).attr("content");f&&g&&(c.openGraph[f]=g)}),a('meta[name^="twitter:"]').each((p,m)=>{let f=a(m).attr("name")?.replace("twitter:",""),g=a(m).attr("content");f&&g&&(c.twitter[f]=g)}),a('script[type="application/ld+json"]').each((p,m)=>{let f=a(m).html();if(f)try{c.jsonLd.push(JSON.parse(f))}catch{}}),JSON.stringify(c,null,2)}var YT,Uo,Ks=h(()=>{"use strict";l();Yu();YT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";Uo={name:Ku,displayName:Ju,description:Vu,parameters:Xu,category:Qu,execute:ZT}});var ef,tf,of,nf,rf,sf=h(()=>{"use strict";l();ef="web.sitemap",tf="Extract Sitemap",of="Parse sitemap.xml or robots.txt to discover all pages on a site. Returns an array of URLs with lastmod/priority if available.",nf="network",rf={type:"object",properties:{url:{type:"string",description:"The base URL or direct sitemap.xml / robots.txt URL"},max_urls:{type:"integer",description:"Maximum number of URLs to return (default: 100)",default:100},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as af from"cheerio";async function Js(r,e){let t=new AbortController,o=setTimeout(()=>t.abort(),e);try{return await fetch(r,{method:"GET",headers:{"User-Agent":ex},signal:t.signal})}catch(n){throw n.name==="AbortError"?new Error(`Request timed out after ${e}ms`):n}finally{clearTimeout(o)}}async function tx(r){let e=r.url,t=r.max_urls||100,o=r.timeout||3e4;if(!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let n=e,s=!1;!e.endsWith(".xml")&&!e.endsWith(".txt")&&(n=new URL(e.endsWith("/")?"sitemap.xml":"/sitemap.xml",e).toString(),s=!0);let i;try{i=await Js(n,o),!i.ok&&s&&(n=new URL(e.endsWith("/")?"robots.txt":"/robots.txt",e).toString(),i=await Js(n,o))}catch(p){if(s)n=new URL(e.endsWith("/")?"robots.txt":"/robots.txt",e).toString(),i=await Js(n,o);else throw p}if(!i||!i.ok)throw new Error(`Failed to fetch sitemap or robots.txt from ${e}`);let a=await i.text(),c=[];if(n.endsWith(".xml")||a.trim().startsWith("<")){let p=af.load(a,{xmlMode:!0}),m=p("sitemap > loc");if(m.length>0)return m.each((g,w)=>{c.length>=t||c.push({loc:p(w).text()})}),JSON.stringify({type:"sitemapindex",urls:c},null,2);p("urlset > url").each((g,w)=>{if(c.length>=t)return;let b=p(w);c.push({loc:b.children("loc").text(),lastmod:b.children("lastmod").text()||void 0,priority:b.children("priority").text()||void 0})})}else{let p=a.split(`
142
- `);for(let m of p){if(c.length>=t)break;let f=m.trim();if(f.toLowerCase().startsWith("sitemap:"))c.push({loc:f.substring(8).trim()});else if(f.toLowerCase().startsWith("allow:")){let g=f.substring(6).trim();c.push({loc:new URL(g,n).toString()})}}}return JSON.stringify(c,null,2)}var ex,Go,Vs=h(()=>{"use strict";l();sf();ex="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";Go={name:ef,displayName:tf,description:of,parameters:rf,category:nf,execute:tx}});var lf,cf,pf,mf,df,uf=h(()=>{"use strict";l();lf="web.feed",cf="Extract Feed",pf="Parse RSS/Atom feeds and return structured entries. Requires rss-parser library to be installed.",mf="network",df={type:"object",properties:{url:{type:"string",description:"The URL of the RSS/Atom feed"},max_entries:{type:"integer",description:"Maximum number of entries to return (default: 10)",default:10},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});async function ff(){try{let r=await import("rss-parser");return new(r.default||r)}catch{throw new Error("rss-parser is not installed. Please install it using `npm install rss-parser` to use this feature.")}}var gf=h(()=>{"use strict";l()});async function ox(r){let e=r.url,t=r.max_entries||10,o=r.timeout||3e4;if(!e)throw new Error("url is required");let n=await ff();n.options={...n.options,timeout:o};try{let s=await n.parseURL(e),i=s.items.slice(0,t).map(a=>({title:a.title,link:a.link,published:a.pubDate||a.isoDate,summary:a.contentSnippet||a.content}));return JSON.stringify({feedTitle:s.title,feedDescription:s.description,entries:i},null,2)}catch(s){throw new Error(`Failed to parse feed from ${e}: ${s.message}`)}}var Bo,Qs=h(()=>{"use strict";l();uf();gf();Bo={name:lf,displayName:cf,description:pf,parameters:df,category:mf,execute:ox}});var hf,yf,bf,wf,Tf,xf=h(()=>{"use strict";l();hf="web.screenshot",yf="Screenshot",bf="Render a page with headless browser and return screenshot Base64 PNG or rendered HTML.",wf="network",Tf={type:"object",properties:{url:{type:"string",description:"The URL to capture"},format:{type:"string",description:'Output format: "html" or "png" (default: "html")',enum:["html","png"],default:"html"},viewport:{type:"object",description:"Optional viewport { width, height } (default: { width: 1280, height: 800 })",properties:{width:{type:"integer"},height:{type:"integer"}}},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});async function vf(){try{let r=await import("puppeteer");return r.default||r}catch{throw new Error("Puppeteer is not installed. Please install it using `npm install puppeteer` to use this feature.")}}var Cf=h(()=>{"use strict";l()});async function rx(r){let e=r.url,t=r.format||"html",o=r.viewport,n=r.timeout||3e4;if(!e)throw new Error("url is required");let i=await(await vf()).launch({headless:!0,args:["--no-sandbox","--disable-setuid-sandbox"]});try{let a=await i.newPage();if(await a.setUserAgent(nx),await a.setViewport({width:o?.width||1280,height:o?.height||800}),await a.goto(e,{waitUntil:"networkidle2",timeout:n}),t==="png"){let c=await a.screenshot({type:"png",fullPage:!0}),p;return Buffer.isBuffer(c)?p=c.toString("base64"):p=Buffer.from(c).toString("base64"),`data:image/png;base64,${p}`}else return await a.content()}finally{await i.close()}}var nx,zo,Xs=h(()=>{"use strict";l();xf();Cf();nx="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";zo={name:hf,displayName:yf,description:bf,parameters:Tf,category:wf,execute:rx}});var Pf={};le(Pf,{webExtractLinksTool:()=>qo,webFeedTool:()=>Bo,webFetchTool:()=>Io,webMapTool:()=>Wo,webMetadataTool:()=>Uo,webScrapeTool:()=>Fo,webScreenshotTool:()=>zo,webSearchTool:()=>jo,webSitemapTool:()=>Go,webToolsProject:()=>kf});var kf,Ys=h(()=>{"use strict";l();Ws();Gs();Bs();zs();Hs();Ks();Vs();Qs();Xs();Ws();Gs();Bs();zs();Hs();Ks();Vs();Qs();Xs();kf={manifest:{key:"web",name:"web-tools",displayName:"Web",version:"1.0.0",description:"Web intelligence tools for fetching, searching, scraping, and extracting content from the web.",author:"Sajeer",tools:["web.fetch","web.search","web.scrape","web.extract_links","web.map","web.metadata","web.sitemap","web.feed","web.screenshot"],category:"network"},tools:[Io,jo,Fo,qo,Wo,Uo,Go,Bo,zo],dependencies:{cheerio:"^1.0.0-rc.12"}}});var Sf,Rf,_f,$f,Ef,Df=h(()=>{"use strict";l();Sf="coding.find_symbol",Rf="Find Symbol",_f="Find function, class, or variable definitions in JavaScript/TypeScript files using AST parsing",$f="coding",Ef={type:"object",properties:{symbol:{type:"string",description:"Name of the symbol to find (function, class, variable, etc.)"},path:{type:"string",description:"File or directory path to search in (searches recursively if directory)"},kind:{type:"string",description:"Optional: filter by symbol kind (function, class, variable, const, let, interface, type)"}},required:["symbol","path"]}});import{extname as sx}from"path";function In(r){let e=sx(r).toLowerCase();return ix[e]||"unknown"}var ix,Zs=h(()=>{"use strict";l();ix={".js":"javascript",".mjs":"javascript",".cjs":"javascript",".jsx":"jsx",".ts":"typescript",".tsx":"tsx",".py":"python",".go":"go",".rs":"rust",".java":"java",".c":"c",".h":"c",".cpp":"cpp",".hpp":"cpp",".cc":"cpp",".rb":"ruby",".php":"php",".swift":"swift",".kt":"kotlin",".kts":"kotlin",".hs":"haskell",".ex":"elixir",".exs":"elixir",".html":"html",".htm":"html",".css":"css",".json":"json",".yaml":"yaml",".yml":"yaml",".md":"markdown",".sh":"bash",".bash":"bash"}});import*as nt from"web-tree-sitter";import*as De from"fs";import*as qe from"path";import*as Of from"os";var Mf,ei,ax,Ln,Nf=h(()=>{"use strict";l();Mf=nt.default||nt.Parser||nt,ei=qe.join(Of.homedir(),".toolpack-sdk","grammars"),ax=qe.resolve(d,"../../grammars"),Ln=class{grammars=new Map;isInitialized=!1;async init(){this.isInitialized||(await Mf.init({locateFile(e,t){return qe.join(d,"../../../../../../node_modules/web-tree-sitter",e)}}),this.isInitialized=!0)}async ensureGrammar(e){await this.init();let t=this.grammars.get(e);if(t)return t;let o=await this.resolveGrammarPath(e),s=await(nt.Language||Mf.Language).load(o);return this.grammars.set(e,s),s}async resolveGrammarPath(e){let t=`tree-sitter-${e}.wasm`,o=qe.resolve(d,"../../../../../../node_modules/tree-sitter-wasms/out",t);if(De.existsSync(o))return o;let n=qe.join(ax,t);if(De.existsSync(n))return n;let s=qe.join(ei,t);return De.existsSync(s)||await this.downloadGrammar(e,s),s}async downloadGrammar(e,t){De.existsSync(ei)||De.mkdirSync(ei,{recursive:!0});let o=`https://unpkg.com/tree-sitter-wasms@latest/out/tree-sitter-${e}.wasm`,n=await fetch(o);if(!n.ok)throw new Error(`Failed to download grammar for ${e}: ${n.statusText}`);let s=await n.arrayBuffer(),i=Buffer.from(s);De.writeFileSync(t,i)}}});import*as Ho from"web-tree-sitter";import*as Af from"fs";import*as If from"crypto";var lx,jn,Lf=h(()=>{"use strict";l();Zs();Nf();lx=Ho.default||Ho.Parser||Ho,jn=class{treeCache=new Map;maxCacheSize=50;parser=null;grammarManager;constructor(){this.grammarManager=new Ln}hash(e){return If.createHash("md5").update(e).digest("hex")}async getTree(e,t){let o=t!==void 0?t:Af.readFileSync(e,"utf-8"),n=this.hash(o),s=this.treeCache.get(e),i=In(e);if(i==="unknown")throw new Error(`Unsupported file type for ${e}`);let a=await this.grammarManager.ensureGrammar(i);if(s&&s.contentHash===n)return s.lastAccessed=Date.now(),{tree:s.tree,language:s.language,grammar:a};this.parser||(await this.grammarManager.init(),this.parser=new lx),this.parser.setLanguage(a);let c;return s?(s.tree&&s.tree.delete(),c=this.parser.parse(o)):c=this.parser.parse(o),this.treeCache.set(e,{tree:c,language:i,contentHash:n,lastAccessed:Date.now()}),this.evictIfNeeded(),{tree:c,language:i,grammar:a}}evictIfNeeded(){if(this.treeCache.size<=this.maxCacheSize)return;let e="",t=1/0;for(let[o,n]of this.treeCache.entries())n.lastAccessed<t&&(t=n.lastAccessed,e=o);if(e){let o=this.treeCache.get(e);o&&o.tree.delete(),this.treeCache.delete(e)}}}});import{parse as cx}from"@babel/parser";import*as ti from"@babel/traverse";var _e,Fn,jf=h(()=>{"use strict";l();_e=ti.default||ti,Fn=class{parseCode(e){return cx(e,{sourceType:"module",plugins:["jsx","typescript","decorators-legacy","classProperties","objectRestSpread","optionalChaining","nullishCoalescingOperator"]})}async findSymbols(e,t,o){let n=[];try{let s=this.parseCode(e.content),i=e.filePath;_e(s,{FunctionDeclaration(a){a.node.id?.name===t&&(!o||o==="function")&&n.push({file:i,line:a.node.loc?.start.line||0,column:a.node.loc?.start.column||0,kind:"function",name:t})},ClassDeclaration(a){a.node.id?.name===t&&(!o||o==="class")&&n.push({file:i,line:a.node.loc?.start.line||0,column:a.node.loc?.start.column||0,kind:"class",name:t})},VariableDeclarator(a){if(a.node.id.type==="Identifier"&&a.node.id.name===t){let c=a.parent,p=c.type==="VariableDeclaration"?c.kind:"variable";(!o||o===p||o==="variable")&&n.push({file:i,line:a.node.loc?.start.line||0,column:a.node.loc?.start.column||0,kind:p,name:t})}},TSInterfaceDeclaration(a){a.node.id.name===t&&(!o||o==="interface")&&n.push({file:i,line:a.node.loc?.start.line||0,column:a.node.loc?.start.column||0,kind:"interface",name:t})},TSTypeAliasDeclaration(a){a.node.id.name===t&&(!o||o==="type")&&n.push({file:i,line:a.node.loc?.start.line||0,column:a.node.loc?.start.column||0,kind:"type",name:t})}})}catch{}return n}async getSymbols(e,t){let o=[];try{let n=this.parseCode(e.content);_e(n,{FunctionDeclaration(s){s.node.id?.name&&(!t||t==="function")&&o.push({name:s.node.id.name,kind:"function",line:s.node.loc?.start.line||0,column:s.node.loc?.start.column||0})},ClassDeclaration(s){s.node.id?.name&&(!t||t==="class")&&o.push({name:s.node.id.name,kind:"class",line:s.node.loc?.start.line||0,column:s.node.loc?.start.column||0})},VariableDeclarator(s){if(s.node.id.type==="Identifier"){let i=s.parent,a=i.type==="VariableDeclaration"?i.kind:"variable";(!t||t===a||t==="variable")&&o.push({name:s.node.id.name,kind:a,line:s.node.loc?.start.line||0,column:s.node.loc?.start.column||0})}},TSInterfaceDeclaration(s){(!t||t==="interface")&&o.push({name:s.node.id.name,kind:"interface",line:s.node.loc?.start.line||0,column:s.node.loc?.start.column||0})},TSTypeAliasDeclaration(s){(!t||t==="type")&&o.push({name:s.node.id.name,kind:"type",line:s.node.loc?.start.line||0,column:s.node.loc?.start.column||0})}})}catch(n){throw new Error(`Failed to parse file "${e.filePath}": ${n.message}`)}return o}async getImports(e){let t=[];try{let o=this.parseCode(e.content);_e(o,{ImportDeclaration(n){let s=n.node.source.value,i=[],a="side-effect";for(let c of n.node.specifiers)if(c.type==="ImportDefaultSpecifier")i.push(c.local.name),a="default";else if(c.type==="ImportNamespaceSpecifier")i.push(`* as ${c.local.name}`),a="namespace";else if(c.type==="ImportSpecifier"){let p=c.imported.type==="Identifier"?c.imported.name:c.imported.value,m=c.local.name;i.push(p===m?p:`${p} as ${m}`),a="named"}t.push({source:s,imports:i,line:n.node.loc?.start.line||0,type:a})}})}catch(o){throw new Error(`Failed to parse file "${e.filePath}": ${o.message}`)}return t}async findReferences(e,t,o){let n=[];try{let s=e.content,i=s.split(`
143
- `),a=this.parseCode(s);_e(a,{Identifier(c){if(c.node.name===t){let p=c.isFunctionDeclaration()||c.isClassDeclaration()||c.parent.type==="VariableDeclarator"&&c.parent.id===c.node||c.parent.type==="TSInterfaceDeclaration"&&c.parent.id===c.node||c.parent.type==="TSTypeAliasDeclaration"&&c.parent.id===c.node;if(!p||o){let m=c.node.loc?.start.line||0,f=c.node.loc?.start.column||0,g=i[m-1]||"";n.push({file:e.filePath,line:m,column:f,context:g.trim(),isDeclaration:p})}}}})}catch{}return n}async getSymbolAtPosition(e,t,o){try{let n=this.parseCode(e.content),s=null;return _e(n,{Identifier(i){let a=i.node.loc;a&&a.start.line===t&&a.start.column===o&&(s=i.node.name,i.stop())}}),s}catch{return null}}async getDefinition(e,t){try{let o=this.parseCode(e.content),n=e.filePath,s=null;return _e(o,{FunctionDeclaration(i){i.node.id?.name===t&&(s={file:n,line:i.node.loc?.start.line||0,column:i.node.loc?.start.column||0,kind:"function",name:t},i.stop())},ClassDeclaration(i){i.node.id?.name===t&&(s={file:n,line:i.node.loc?.start.line||0,column:i.node.loc?.start.column||0,kind:"class",name:t},i.stop())},VariableDeclarator(i){if(i.node.id.type==="Identifier"&&i.node.id.name===t){let a=i.parent,c=a.type==="VariableDeclaration"?a.kind:"variable";s={file:n,line:i.node.loc?.start.line||0,column:i.node.loc?.start.column||0,kind:c,name:t},i.stop()}},TSInterfaceDeclaration(i){i.node.id.name===t&&(s={file:n,line:i.node.loc?.start.line||0,column:i.node.loc?.start.column||0,kind:"interface",name:t},i.stop())},TSTypeAliasDeclaration(i){i.node.id.name===t&&(s={file:n,line:i.node.loc?.start.line||0,column:i.node.loc?.start.column||0,kind:"type",name:t},i.stop())}}),s}catch{return null}}async getDiagnostics(e){try{return this.parseCode(e.content),[]}catch(t){return[{message:t.message,line:t.loc?.line||0,column:t.loc?.column||0,severity:"error"}]}}async getExports(e){let t=[];try{let o=this.parseCode(e.content);_e(o,{ExportNamedDeclaration(n){if(n.node.declaration)if(n.node.declaration.type==="VariableDeclaration")for(let s of n.node.declaration.declarations)s.id.type==="Identifier"&&t.push({name:s.id.name,kind:"variable",line:s.loc?.start.line||0,column:s.loc?.start.column||0});else n.node.declaration.type==="FunctionDeclaration"&&n.node.declaration.id?t.push({name:n.node.declaration.id.name,kind:"function",line:n.node.declaration.loc?.start.line||0,column:n.node.declaration.loc?.start.column||0}):n.node.declaration.type==="ClassDeclaration"&&n.node.declaration.id&&t.push({name:n.node.declaration.id.name,kind:"class",line:n.node.declaration.loc?.start.line||0,column:n.node.declaration.loc?.start.column||0});else if(n.node.specifiers)for(let s of n.node.specifiers)s.exported.type==="Identifier"&&t.push({name:s.exported.name,kind:"export",line:s.loc?.start.line||0,column:s.loc?.start.column||0})},ExportDefaultDeclaration(n){let s="default",i="default";n.node.declaration.type==="ClassDeclaration"&&n.node.declaration.id?(s=n.node.declaration.id.name,i="class"):n.node.declaration.type==="FunctionDeclaration"&&n.node.declaration.id?(s=n.node.declaration.id.name,i="function"):n.node.declaration.type==="Identifier"&&(s=n.node.declaration.name,i="variable"),t.push({name:s,kind:i,line:n.node.loc?.start.line||0,column:n.node.loc?.start.column||0})}})}catch{}return t}async getOutline(e){let t=[];try{return(await this.getSymbols(e)).map(n=>({name:n.name,kind:n.kind,line:n.line,column:n.column,children:[]}))}catch{}return t}async extractFunction(e,t,o,n,s,i){let a=e.content.split(`
144
- `),c=Math.max(0,t-1),p=Math.min(a.length,n),m=a.slice(c,p).join(`
140
+ `;for(let m of l){let f=" ".repeat(m.level-1);p+=`${f}${"#".repeat(m.level)} ${m.text}
141
+ `}return p}var YT,Uo,Ks=h(()=>{"use strict";c();Ku();YT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";Uo={name:Uu,displayName:Gu,description:Bu,parameters:Hu,category:zu,execute:ZT}});var Vu,Qu,Xu,Yu,Zu,ef=h(()=>{"use strict";c();Vu="web.metadata",Qu="Extract Metadata",Xu="Extract Open Graph, Twitter Cards, JSON-LD, and meta tags from a URL.",Yu="network",Zu={type:"object",properties:{url:{type:"string",description:"The URL to extract metadata from"},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as tf from"cheerio";async function tx(r){let e=r.url,t=r.timeout||3e4;if(!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let o=new AbortController,n=setTimeout(()=>o.abort(),t),s;try{s=await fetch(e,{method:"GET",headers:{"User-Agent":ex},signal:o.signal})}catch(p){throw p.name==="AbortError"?new Error(`Request timed out after ${t}ms`):p}finally{clearTimeout(n)}if(!s.ok)throw new Error(`Failed to fetch ${e}: HTTP ${s.status} ${s.statusText}`);let i=await s.text(),a=tf.load(i),l={title:a("title").text()||"",description:a('meta[name="description"]').attr("content")||a('meta[property="og:description"]').attr("content")||"",author:a('meta[name="author"]').attr("content")||"",openGraph:{},twitter:{},jsonLd:[]};return a('meta[property^="og:"]').each((p,m)=>{let f=a(m).attr("property")?.replace("og:",""),g=a(m).attr("content");f&&g&&(l.openGraph[f]=g)}),a('meta[name^="twitter:"]').each((p,m)=>{let f=a(m).attr("name")?.replace("twitter:",""),g=a(m).attr("content");f&&g&&(l.twitter[f]=g)}),a('script[type="application/ld+json"]').each((p,m)=>{let f=a(m).html();if(f)try{l.jsonLd.push(JSON.parse(f))}catch{}}),JSON.stringify(l,null,2)}var ex,Go,Js=h(()=>{"use strict";c();ef();ex="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";Go={name:Vu,displayName:Qu,description:Xu,parameters:Zu,category:Yu,execute:tx}});var of,nf,rf,sf,af,lf=h(()=>{"use strict";c();of="web.sitemap",nf="Extract Sitemap",rf="Parse sitemap.xml or robots.txt to discover all pages on a site. Returns an array of URLs with lastmod/priority if available.",sf="network",af={type:"object",properties:{url:{type:"string",description:"The base URL or direct sitemap.xml / robots.txt URL"},max_urls:{type:"integer",description:"Maximum number of URLs to return (default: 100)",default:100},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});import*as cf from"cheerio";async function Vs(r,e){let t=new AbortController,o=setTimeout(()=>t.abort(),e);try{return await fetch(r,{method:"GET",headers:{"User-Agent":ox},signal:t.signal})}catch(n){throw n.name==="AbortError"?new Error(`Request timed out after ${e}ms`):n}finally{clearTimeout(o)}}async function nx(r){let e=r.url,t=r.max_urls||100,o=r.timeout||3e4;if(!e)throw new Error("url is required");if(!e.startsWith("http://")&&!e.startsWith("https://"))throw new Error("url must start with http:// or https://");let n=e,s=!1;!e.endsWith(".xml")&&!e.endsWith(".txt")&&(n=new URL(e.endsWith("/")?"sitemap.xml":"/sitemap.xml",e).toString(),s=!0);let i;try{i=await Vs(n,o),!i.ok&&s&&(n=new URL(e.endsWith("/")?"robots.txt":"/robots.txt",e).toString(),i=await Vs(n,o))}catch(p){if(s)n=new URL(e.endsWith("/")?"robots.txt":"/robots.txt",e).toString(),i=await Vs(n,o);else throw p}if(!i||!i.ok)throw new Error(`Failed to fetch sitemap or robots.txt from ${e}`);let a=await i.text(),l=[];if(n.endsWith(".xml")||a.trim().startsWith("<")){let p=cf.load(a,{xmlMode:!0}),m=p("sitemap > loc");if(m.length>0)return m.each((g,w)=>{l.length>=t||l.push({loc:p(w).text()})}),JSON.stringify({type:"sitemapindex",urls:l},null,2);p("urlset > url").each((g,w)=>{if(l.length>=t)return;let b=p(w);l.push({loc:b.children("loc").text(),lastmod:b.children("lastmod").text()||void 0,priority:b.children("priority").text()||void 0})})}else{let p=a.split(`
142
+ `);for(let m of p){if(l.length>=t)break;let f=m.trim();if(f.toLowerCase().startsWith("sitemap:"))l.push({loc:f.substring(8).trim()});else if(f.toLowerCase().startsWith("allow:")){let g=f.substring(6).trim();l.push({loc:new URL(g,n).toString()})}}}return JSON.stringify(l,null,2)}var ox,Bo,Qs=h(()=>{"use strict";c();lf();ox="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";Bo={name:of,displayName:nf,description:rf,parameters:af,category:sf,execute:nx}});var pf,mf,df,uf,ff,gf=h(()=>{"use strict";c();pf="web.feed",mf="Extract Feed",df="Parse RSS/Atom feeds and return structured entries. Requires rss-parser library to be installed.",uf="network",ff={type:"object",properties:{url:{type:"string",description:"The URL of the RSS/Atom feed"},max_entries:{type:"integer",description:"Maximum number of entries to return (default: 10)",default:10},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});async function hf(){try{let r=await import("rss-parser");return new(r.default||r)}catch{throw new Error("rss-parser is not installed. Please install it using `npm install rss-parser` to use this feature.")}}var yf=h(()=>{"use strict";c()});async function rx(r){let e=r.url,t=r.max_entries||10,o=r.timeout||3e4;if(!e)throw new Error("url is required");let n=await hf();n.options={...n.options,timeout:o};try{let s=await n.parseURL(e),i=s.items.slice(0,t).map(a=>({title:a.title,link:a.link,published:a.pubDate||a.isoDate,summary:a.contentSnippet||a.content}));return JSON.stringify({feedTitle:s.title,feedDescription:s.description,entries:i},null,2)}catch(s){throw new Error(`Failed to parse feed from ${e}: ${s.message}`)}}var zo,Xs=h(()=>{"use strict";c();gf();yf();zo={name:pf,displayName:mf,description:df,parameters:ff,category:uf,execute:rx}});var bf,wf,Tf,xf,vf,Cf=h(()=>{"use strict";c();bf="web.screenshot",wf="Screenshot",Tf="Render a page with headless browser and return screenshot Base64 PNG or rendered HTML.",xf="network",vf={type:"object",properties:{url:{type:"string",description:"The URL to capture"},format:{type:"string",description:'Output format: "html" or "png" (default: "html")',enum:["html","png"],default:"html"},viewport:{type:"object",description:"Optional viewport { width, height } (default: { width: 1280, height: 800 })",properties:{width:{type:"integer"},height:{type:"integer"}}},timeout:{type:"integer",description:"Timeout in milliseconds (default: 30000)",default:3e4}},required:["url"]}});async function Pf(){try{let r=await import("puppeteer");return r.default||r}catch{throw new Error("Puppeteer is not installed. Please install it using `npm install puppeteer` to use this feature.")}}var kf=h(()=>{"use strict";c()});async function ix(r){let e=r.url,t=r.format||"html",o=r.viewport,n=r.timeout||3e4;if(!e)throw new Error("url is required");let i=await(await Pf()).launch({headless:!0,args:["--no-sandbox","--disable-setuid-sandbox"]});try{let a=await i.newPage();if(await a.setUserAgent(sx),await a.setViewport({width:o?.width||1280,height:o?.height||800}),await a.goto(e,{waitUntil:"networkidle2",timeout:n}),t==="png"){let l=await a.screenshot({type:"png",fullPage:!0}),p;return Buffer.isBuffer(l)?p=l.toString("base64"):p=Buffer.from(l).toString("base64"),`data:image/png;base64,${p}`}else return await a.content()}finally{await i.close()}}var sx,Ho,Ys=h(()=>{"use strict";c();Cf();kf();sx="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";Ho={name:bf,displayName:wf,description:Tf,parameters:vf,category:xf,execute:ix}});var Rf={};ue(Rf,{webExtractLinksTool:()=>Wo,webFeedTool:()=>zo,webFetchTool:()=>Lo,webMapTool:()=>Uo,webMetadataTool:()=>Go,webScrapeTool:()=>qo,webScreenshotTool:()=>Ho,webSearchTool:()=>Fo,webSitemapTool:()=>Bo,webToolsProject:()=>Sf});var Sf,Zs=h(()=>{"use strict";c();Us();Bs();zs();Hs();Ks();Js();Qs();Xs();Ys();Us();Bs();zs();Hs();Ks();Js();Qs();Xs();Ys();Sf={manifest:{key:"web",name:"web-tools",displayName:"Web",version:"1.0.0",description:"Web intelligence tools for fetching, searching, scraping, and extracting content from the web.",author:"Sajeer",tools:["web.fetch","web.search","web.scrape","web.extract_links","web.map","web.metadata","web.sitemap","web.feed","web.screenshot"],category:"network"},tools:[Lo,Fo,qo,Wo,Uo,Go,Bo,zo,Ho],dependencies:{cheerio:"^1.0.0-rc.12"}}});var _f,$f,Ef,Df,Mf,Of=h(()=>{"use strict";c();_f="coding.find_symbol",$f="Find Symbol",Ef="Find function, class, or variable definitions in JavaScript/TypeScript files using AST parsing",Df="coding",Mf={type:"object",properties:{symbol:{type:"string",description:"Name of the symbol to find (function, class, variable, etc.)"},path:{type:"string",description:"File or directory path to search in (searches recursively if directory)"},kind:{type:"string",description:"Optional: filter by symbol kind (function, class, variable, const, let, interface, type)"}},required:["symbol","path"]}});import{extname as ax}from"path";function Ln(r){let e=ax(r).toLowerCase();return lx[e]||"unknown"}var lx,ei=h(()=>{"use strict";c();lx={".js":"javascript",".mjs":"javascript",".cjs":"javascript",".jsx":"jsx",".ts":"typescript",".tsx":"tsx",".py":"python",".go":"go",".rs":"rust",".java":"java",".c":"c",".h":"c",".cpp":"cpp",".hpp":"cpp",".cc":"cpp",".rb":"ruby",".php":"php",".swift":"swift",".kt":"kotlin",".kts":"kotlin",".hs":"haskell",".ex":"elixir",".exs":"elixir",".html":"html",".htm":"html",".css":"css",".json":"json",".yaml":"yaml",".yml":"yaml",".md":"markdown",".sh":"bash",".bash":"bash"}});import*as ot from"web-tree-sitter";import*as Me from"fs";import*as qe from"path";import*as Af from"os";var Nf,ti,cx,jn,If=h(()=>{"use strict";c();Nf=ot.default||ot.Parser||ot,ti=qe.join(Af.homedir(),".toolpack-sdk","grammars"),cx=qe.resolve(d,"../../grammars"),jn=class{grammars=new Map;isInitialized=!1;async init(){this.isInitialized||(await Nf.init({locateFile(e,t){return qe.join(d,"../../../../../../node_modules/web-tree-sitter",e)}}),this.isInitialized=!0)}async ensureGrammar(e){await this.init();let t=this.grammars.get(e);if(t)return t;let o=await this.resolveGrammarPath(e),s=await(ot.Language||Nf.Language).load(o);return this.grammars.set(e,s),s}async resolveGrammarPath(e){let t=`tree-sitter-${e}.wasm`,o=qe.resolve(d,"../../../../../../node_modules/tree-sitter-wasms/out",t);if(Me.existsSync(o))return o;let n=qe.join(cx,t);if(Me.existsSync(n))return n;let s=qe.join(ti,t);return Me.existsSync(s)||await this.downloadGrammar(e,s),s}async downloadGrammar(e,t){Me.existsSync(ti)||Me.mkdirSync(ti,{recursive:!0});let o=`https://unpkg.com/tree-sitter-wasms@latest/out/tree-sitter-${e}.wasm`,n=await fetch(o);if(!n.ok)throw new Error(`Failed to download grammar for ${e}: ${n.statusText}`);let s=await n.arrayBuffer(),i=Buffer.from(s);Me.writeFileSync(t,i)}}});import*as Ko from"web-tree-sitter";import*as Lf from"fs";import*as jf from"crypto";var px,Fn,Ff=h(()=>{"use strict";c();ei();If();px=Ko.default||Ko.Parser||Ko,Fn=class{treeCache=new Map;maxCacheSize=50;parser=null;grammarManager;constructor(){this.grammarManager=new jn}hash(e){return jf.createHash("md5").update(e).digest("hex")}async getTree(e,t){let o=t!==void 0?t:Lf.readFileSync(e,"utf-8"),n=this.hash(o),s=this.treeCache.get(e),i=Ln(e);if(i==="unknown")throw new Error(`Unsupported file type for ${e}`);let a=await this.grammarManager.ensureGrammar(i);if(s&&s.contentHash===n)return s.lastAccessed=Date.now(),{tree:s.tree,language:s.language,grammar:a};this.parser||(await this.grammarManager.init(),this.parser=new px),this.parser.setLanguage(a);let l;return s?(s.tree&&s.tree.delete(),l=this.parser.parse(o)):l=this.parser.parse(o),this.treeCache.set(e,{tree:l,language:i,contentHash:n,lastAccessed:Date.now()}),this.evictIfNeeded(),{tree:l,language:i,grammar:a}}evictIfNeeded(){if(this.treeCache.size<=this.maxCacheSize)return;let e="",t=1/0;for(let[o,n]of this.treeCache.entries())n.lastAccessed<t&&(t=n.lastAccessed,e=o);if(e){let o=this.treeCache.get(e);o&&o.tree.delete(),this.treeCache.delete(e)}}}});import{parse as mx}from"@babel/parser";import*as oi from"@babel/traverse";var $e,qn,qf=h(()=>{"use strict";c();$e=oi.default||oi,qn=class{parseCode(e){return mx(e,{sourceType:"module",plugins:["jsx","typescript","decorators-legacy","classProperties","objectRestSpread","optionalChaining","nullishCoalescingOperator"]})}async findSymbols(e,t,o){let n=[];try{let s=this.parseCode(e.content),i=e.filePath;$e(s,{FunctionDeclaration(a){a.node.id?.name===t&&(!o||o==="function")&&n.push({file:i,line:a.node.loc?.start.line||0,column:a.node.loc?.start.column||0,kind:"function",name:t})},ClassDeclaration(a){a.node.id?.name===t&&(!o||o==="class")&&n.push({file:i,line:a.node.loc?.start.line||0,column:a.node.loc?.start.column||0,kind:"class",name:t})},VariableDeclarator(a){if(a.node.id.type==="Identifier"&&a.node.id.name===t){let l=a.parent,p=l.type==="VariableDeclaration"?l.kind:"variable";(!o||o===p||o==="variable")&&n.push({file:i,line:a.node.loc?.start.line||0,column:a.node.loc?.start.column||0,kind:p,name:t})}},TSInterfaceDeclaration(a){a.node.id.name===t&&(!o||o==="interface")&&n.push({file:i,line:a.node.loc?.start.line||0,column:a.node.loc?.start.column||0,kind:"interface",name:t})},TSTypeAliasDeclaration(a){a.node.id.name===t&&(!o||o==="type")&&n.push({file:i,line:a.node.loc?.start.line||0,column:a.node.loc?.start.column||0,kind:"type",name:t})}})}catch{}return n}async getSymbols(e,t){let o=[];try{let n=this.parseCode(e.content);$e(n,{FunctionDeclaration(s){s.node.id?.name&&(!t||t==="function")&&o.push({name:s.node.id.name,kind:"function",line:s.node.loc?.start.line||0,column:s.node.loc?.start.column||0})},ClassDeclaration(s){s.node.id?.name&&(!t||t==="class")&&o.push({name:s.node.id.name,kind:"class",line:s.node.loc?.start.line||0,column:s.node.loc?.start.column||0})},VariableDeclarator(s){if(s.node.id.type==="Identifier"){let i=s.parent,a=i.type==="VariableDeclaration"?i.kind:"variable";(!t||t===a||t==="variable")&&o.push({name:s.node.id.name,kind:a,line:s.node.loc?.start.line||0,column:s.node.loc?.start.column||0})}},TSInterfaceDeclaration(s){(!t||t==="interface")&&o.push({name:s.node.id.name,kind:"interface",line:s.node.loc?.start.line||0,column:s.node.loc?.start.column||0})},TSTypeAliasDeclaration(s){(!t||t==="type")&&o.push({name:s.node.id.name,kind:"type",line:s.node.loc?.start.line||0,column:s.node.loc?.start.column||0})}})}catch(n){throw new Error(`Failed to parse file "${e.filePath}": ${n.message}`)}return o}async getImports(e){let t=[];try{let o=this.parseCode(e.content);$e(o,{ImportDeclaration(n){let s=n.node.source.value,i=[],a="side-effect";for(let l of n.node.specifiers)if(l.type==="ImportDefaultSpecifier")i.push(l.local.name),a="default";else if(l.type==="ImportNamespaceSpecifier")i.push(`* as ${l.local.name}`),a="namespace";else if(l.type==="ImportSpecifier"){let p=l.imported.type==="Identifier"?l.imported.name:l.imported.value,m=l.local.name;i.push(p===m?p:`${p} as ${m}`),a="named"}t.push({source:s,imports:i,line:n.node.loc?.start.line||0,type:a})}})}catch(o){throw new Error(`Failed to parse file "${e.filePath}": ${o.message}`)}return t}async findReferences(e,t,o){let n=[];try{let s=e.content,i=s.split(`
143
+ `),a=this.parseCode(s);$e(a,{Identifier(l){if(l.node.name===t){let p=l.isFunctionDeclaration()||l.isClassDeclaration()||l.parent.type==="VariableDeclarator"&&l.parent.id===l.node||l.parent.type==="TSInterfaceDeclaration"&&l.parent.id===l.node||l.parent.type==="TSTypeAliasDeclaration"&&l.parent.id===l.node;if(!p||o){let m=l.node.loc?.start.line||0,f=l.node.loc?.start.column||0,g=i[m-1]||"";n.push({file:e.filePath,line:m,column:f,context:g.trim(),isDeclaration:p})}}}})}catch{}return n}async getSymbolAtPosition(e,t,o){try{let n=this.parseCode(e.content),s=null;return $e(n,{Identifier(i){let a=i.node.loc;a&&a.start.line===t&&a.start.column===o&&(s=i.node.name,i.stop())}}),s}catch{return null}}async getDefinition(e,t){try{let o=this.parseCode(e.content),n=e.filePath,s=null;return $e(o,{FunctionDeclaration(i){i.node.id?.name===t&&(s={file:n,line:i.node.loc?.start.line||0,column:i.node.loc?.start.column||0,kind:"function",name:t},i.stop())},ClassDeclaration(i){i.node.id?.name===t&&(s={file:n,line:i.node.loc?.start.line||0,column:i.node.loc?.start.column||0,kind:"class",name:t},i.stop())},VariableDeclarator(i){if(i.node.id.type==="Identifier"&&i.node.id.name===t){let a=i.parent,l=a.type==="VariableDeclaration"?a.kind:"variable";s={file:n,line:i.node.loc?.start.line||0,column:i.node.loc?.start.column||0,kind:l,name:t},i.stop()}},TSInterfaceDeclaration(i){i.node.id.name===t&&(s={file:n,line:i.node.loc?.start.line||0,column:i.node.loc?.start.column||0,kind:"interface",name:t},i.stop())},TSTypeAliasDeclaration(i){i.node.id.name===t&&(s={file:n,line:i.node.loc?.start.line||0,column:i.node.loc?.start.column||0,kind:"type",name:t},i.stop())}}),s}catch{return null}}async getDiagnostics(e){try{return this.parseCode(e.content),[]}catch(t){return[{message:t.message,line:t.loc?.line||0,column:t.loc?.column||0,severity:"error"}]}}async getExports(e){let t=[];try{let o=this.parseCode(e.content);$e(o,{ExportNamedDeclaration(n){if(n.node.declaration)if(n.node.declaration.type==="VariableDeclaration")for(let s of n.node.declaration.declarations)s.id.type==="Identifier"&&t.push({name:s.id.name,kind:"variable",line:s.loc?.start.line||0,column:s.loc?.start.column||0});else n.node.declaration.type==="FunctionDeclaration"&&n.node.declaration.id?t.push({name:n.node.declaration.id.name,kind:"function",line:n.node.declaration.loc?.start.line||0,column:n.node.declaration.loc?.start.column||0}):n.node.declaration.type==="ClassDeclaration"&&n.node.declaration.id&&t.push({name:n.node.declaration.id.name,kind:"class",line:n.node.declaration.loc?.start.line||0,column:n.node.declaration.loc?.start.column||0});else if(n.node.specifiers)for(let s of n.node.specifiers)s.exported.type==="Identifier"&&t.push({name:s.exported.name,kind:"export",line:s.loc?.start.line||0,column:s.loc?.start.column||0})},ExportDefaultDeclaration(n){let s="default",i="default";n.node.declaration.type==="ClassDeclaration"&&n.node.declaration.id?(s=n.node.declaration.id.name,i="class"):n.node.declaration.type==="FunctionDeclaration"&&n.node.declaration.id?(s=n.node.declaration.id.name,i="function"):n.node.declaration.type==="Identifier"&&(s=n.node.declaration.name,i="variable"),t.push({name:s,kind:i,line:n.node.loc?.start.line||0,column:n.node.loc?.start.column||0})}})}catch{}return t}async getOutline(e){let t=[];try{return(await this.getSymbols(e)).map(n=>({name:n.name,kind:n.kind,line:n.line,column:n.column,children:[]}))}catch{}return t}async extractFunction(e,t,o,n,s,i){let a=e.content.split(`
144
+ `),l=Math.max(0,t-1),p=Math.min(a.length,n),m=a.slice(l,p).join(`
145
145
  `),f=`
146
146
  function ${i}() {
147
147
  ${m}
148
148
  }
149
- `,g=`${i}();`;return{newFunction:f,replacementCall:g}}async getCallHierarchy(e,t,o){try{let n=this.parseCode(e.content),s=e.filePath,i=null,a="",c=0,p=0;if(_e(n,{Function(b){let T=b.node.loc;T&&T.start.line<=t&&T.end&&T.end.line>=t&&(i=b,c=T.start.line,p=T.start.column,b.node.type==="FunctionDeclaration"&&b.node.id?a=b.node.id.name:b.parent.type==="VariableDeclarator"&&b.parent.id.type==="Identifier"?a=b.parent.id.name:b.parent.type==="ClassMethod"||b.parent.type==="ObjectMethod"?b.parent.key.type==="Identifier"&&(a=b.parent.key.name):a="<anonymous>")}}),!i||a==="<anonymous>")return null;let m=[],f=[];_e(n,{CallExpression(b){let T=b.node.loc;if(!T||T.start.line<c||T.end&&T.end.line>c+1e3)return;let v=!1,C=b;for(;C;){if(C.isFunction()&&C.node.type==="FunctionDeclaration"&&C.node.id?.name===a){v=!0;break}C=C.parentPath}if(!v)return;let x=b.node.callee,R="<unknown>";x.type==="Identifier"?R=x.name:x.type==="MemberExpression"&&x.property.type==="Identifier"&&(R=x.property.name),R!=="<unknown>"&&f.push({file:s,name:R,line:b.node.loc?.start.line||0,column:b.node.loc?.start.column||0})}}),_e(n,{CallExpression(b){let T=b.node.callee,v=!1;if((T.type==="Identifier"&&T.name===a||T.type==="MemberExpression"&&T.property.type==="Identifier"&&T.property.name===a)&&(v=!0),v){let C="<global>",x=b;for(;x;){if(x.isFunction()){x.node.type==="FunctionDeclaration"&&x.node.id?C=x.node.id.name:x.parent.type==="VariableDeclarator"&&x.parent.id.type==="Identifier"?C=x.parent.id.name:(x.parent.type==="ClassMethod"||x.parent.type==="ObjectMethod")&&x.parent.key.type==="Identifier"&&(C=x.parent.key.name);break}x=x.parentPath}m.push({file:s,name:C,line:b.node.loc?.start.line||0,column:b.node.loc?.start.column||0})}}});let g=[...new Map(m.map(b=>[`${b.name}:${b.line}`,b])).values()],w=[...new Map(f.map(b=>[`${b.name}:${b.line}`,b])).values()];return{file:s,name:a,line:c,column:p,callers:g,callees:w}}catch{return null}}}});function ve(r,e){oi[r]=e}var oi,rt=h(()=>{"use strict";l();oi={}});var px,Ff=h(()=>{"use strict";l();rt();px={symbols:`
149
+ `,g=`${i}();`;return{newFunction:f,replacementCall:g}}async getCallHierarchy(e,t,o){try{let n=this.parseCode(e.content),s=e.filePath,i=null,a="",l=0,p=0;if($e(n,{Function(b){let T=b.node.loc;T&&T.start.line<=t&&T.end&&T.end.line>=t&&(i=b,l=T.start.line,p=T.start.column,b.node.type==="FunctionDeclaration"&&b.node.id?a=b.node.id.name:b.parent.type==="VariableDeclarator"&&b.parent.id.type==="Identifier"?a=b.parent.id.name:b.parent.type==="ClassMethod"||b.parent.type==="ObjectMethod"?b.parent.key.type==="Identifier"&&(a=b.parent.key.name):a="<anonymous>")}}),!i||a==="<anonymous>")return null;let m=[],f=[];$e(n,{CallExpression(b){let T=b.node.loc;if(!T||T.start.line<l||T.end&&T.end.line>l+1e3)return;let x=!1,C=b;for(;C;){if(C.isFunction()&&C.node.type==="FunctionDeclaration"&&C.node.id?.name===a){x=!0;break}C=C.parentPath}if(!x)return;let v=b.node.callee,$="<unknown>";v.type==="Identifier"?$=v.name:v.type==="MemberExpression"&&v.property.type==="Identifier"&&($=v.property.name),$!=="<unknown>"&&f.push({file:s,name:$,line:b.node.loc?.start.line||0,column:b.node.loc?.start.column||0})}}),$e(n,{CallExpression(b){let T=b.node.callee,x=!1;if((T.type==="Identifier"&&T.name===a||T.type==="MemberExpression"&&T.property.type==="Identifier"&&T.property.name===a)&&(x=!0),x){let C="<global>",v=b;for(;v;){if(v.isFunction()){v.node.type==="FunctionDeclaration"&&v.node.id?C=v.node.id.name:v.parent.type==="VariableDeclarator"&&v.parent.id.type==="Identifier"?C=v.parent.id.name:(v.parent.type==="ClassMethod"||v.parent.type==="ObjectMethod")&&v.parent.key.type==="Identifier"&&(C=v.parent.key.name);break}v=v.parentPath}m.push({file:s,name:C,line:b.node.loc?.start.line||0,column:b.node.loc?.start.column||0})}}});let g=[...new Map(m.map(b=>[`${b.name}:${b.line}`,b])).values()],w=[...new Map(f.map(b=>[`${b.name}:${b.line}`,b])).values()];return{file:s,name:a,line:l,column:p,callers:g,callees:w}}catch{return null}}}});function Pe(r,e){ni[r]=e}var ni,nt=h(()=>{"use strict";c();ni={}});var dx,Wf=h(()=>{"use strict";c();nt();dx={symbols:`
150
150
  (function_definition
151
151
  name: (identifier) @name.function) @definition.function
152
152
 
@@ -164,7 +164,7 @@ ${m}
164
164
  name: (dotted_name) @name) @import
165
165
  `,references:`
166
166
  (identifier) @reference
167
- `};ve("python",px)});var mx,qf=h(()=>{"use strict";l();rt();mx={symbols:`
167
+ `};Pe("python",dx)});var ux,Uf=h(()=>{"use strict";c();nt();ux={symbols:`
168
168
  (function_declaration
169
169
  name: (identifier) @name.function) @definition.function
170
170
 
@@ -192,7 +192,7 @@ ${m}
192
192
  (identifier) @reference
193
193
  (field_identifier) @reference
194
194
  (type_identifier) @reference
195
- `};ve("go",mx)});var dx,Wf=h(()=>{"use strict";l();rt();dx={symbols:`
195
+ `};Pe("go",ux)});var fx,Gf=h(()=>{"use strict";c();nt();fx={symbols:`
196
196
  (function_item
197
197
  name: (identifier) @name.function) @definition.function
198
198
 
@@ -214,7 +214,7 @@ ${m}
214
214
  (identifier) @reference
215
215
  (type_identifier) @reference
216
216
  (field_identifier) @reference
217
- `};ve("rust",dx)});var ux,Uf=h(()=>{"use strict";l();rt();ux={symbols:`
217
+ `};Pe("rust",fx)});var gx,Bf=h(()=>{"use strict";c();nt();gx={symbols:`
218
218
  (method_declaration
219
219
  name: (identifier) @name.method) @definition.method
220
220
 
@@ -235,7 +235,7 @@ ${m}
235
235
  `,references:`
236
236
  (identifier) @reference
237
237
  (type_identifier) @reference
238
- `};ve("java",ux)});var Gf,Bf=h(()=>{"use strict";l();rt();Gf={symbols:`
238
+ `};Pe("java",gx)});var zf,Hf=h(()=>{"use strict";c();nt();zf={symbols:`
239
239
  (function_definition
240
240
  declarator: (function_declarator
241
241
  declarator: (identifier) @name.function)) @definition.function
@@ -256,9 +256,9 @@ ${m}
256
256
  (identifier) @reference
257
257
  (type_identifier) @reference
258
258
  (field_identifier) @reference
259
- `};ve("cpp",Gf);ve("c",Gf)});var qn,zf=h(()=>{"use strict";l();rt();Ff();qf();Wf();Uf();Bf();qn=class{constructor(e){this.context=e}context;async executeQuery(e,t){let{tree:o,language:n,grammar:s}=await this.context.getTree(e.filePath,e.content),i=oi[n];if(!i||!i[t])throw new Error(`Query ${t} not found for language ${n}`);let a=i[t],c=s.query(a);return{tree:o,captures:c.captures(o.rootNode)}}async findSymbols(e,t,o){return(await this.getSymbols(e,o)).filter(s=>s.name===t).map(s=>({file:e.filePath,line:s.line,column:s.column,kind:s.kind,name:s.name}))}async getSymbols(e,t){let{captures:o}=await this.executeQuery(e,"symbols"),n=[];for(let s of o)if(s.name.startsWith("name.")){let i=s.name.split(".")[1];(!t||t===i)&&n.push({name:s.node.text,kind:i,line:s.node.startPosition.row+1,column:s.node.startPosition.column})}return n}async getImports(e){let{captures:t}=await this.executeQuery(e,"imports"),o=t.filter(s=>s.name==="import").map(s=>s.node),n=[];for(let s of o)n.push({source:s.text,imports:[s.text],line:s.startPosition.row+1,type:"side-effect"});return n}async findReferences(e,t,o){let{captures:n}=await this.executeQuery(e,"references"),s=e.content.split(`
260
- `),i=[];for(let a of n)if(a.node.text===t){let c=a.node.parent?.type.includes("definition")||a.node.parent?.type.includes("declaration");if(!c||o){let p=a.node.startPosition.row+1;i.push({file:e.filePath,line:p,column:a.node.startPosition.column,context:s[p-1].trim(),isDeclaration:!!c})}}return i}async getSymbolAtPosition(e,t,o){let{tree:n}=await this.context.getTree(e.filePath,e.content),s=n.rootNode.descendantForPosition({row:t-1,column:o});return s&&s.type==="identifier"?s.text:null}async getDefinition(e,t){let o=await this.findSymbols(e,t);return o.length>0?o[0]:null}async getDiagnostics(e){let{tree:t}=await this.context.getTree(e.filePath,e.content),o=[];function n(s){if(s.hasError()){s.type==="ERROR"&&o.push({message:`Syntax error at line ${s.startPosition.row+1}`,line:s.startPosition.row+1,column:s.startPosition.column,severity:"error"});for(let i of s.children)n(i)}else s.isMissing&&s.isMissing()&&o.push({message:`Missing ${s.type} at line ${s.startPosition.row+1}`,line:s.startPosition.row+1,column:s.startPosition.column,severity:"error"})}return n(t.rootNode),o}async getExports(e){return[]}async getOutline(e){return(await this.getSymbols(e)).map(o=>({name:o.name,kind:o.kind,line:o.line,column:o.column,children:[]}))}async extractFunction(e,t,o,n,s,i){let a=e.content.split(`
261
- `),c=Math.max(0,t-1),p=Math.min(a.length,n),m=a.slice(c,p).join(`
259
+ `};Pe("cpp",zf);Pe("c",zf)});var Wn,Kf=h(()=>{"use strict";c();nt();Wf();Uf();Gf();Bf();Hf();Wn=class{constructor(e){this.context=e}context;async executeQuery(e,t){let{tree:o,language:n,grammar:s}=await this.context.getTree(e.filePath,e.content),i=ni[n];if(!i||!i[t])throw new Error(`Query ${t} not found for language ${n}`);let a=i[t],l=s.query(a);return{tree:o,captures:l.captures(o.rootNode)}}async findSymbols(e,t,o){return(await this.getSymbols(e,o)).filter(s=>s.name===t).map(s=>({file:e.filePath,line:s.line,column:s.column,kind:s.kind,name:s.name}))}async getSymbols(e,t){let{captures:o}=await this.executeQuery(e,"symbols"),n=[];for(let s of o)if(s.name.startsWith("name.")){let i=s.name.split(".")[1];(!t||t===i)&&n.push({name:s.node.text,kind:i,line:s.node.startPosition.row+1,column:s.node.startPosition.column})}return n}async getImports(e){let{captures:t}=await this.executeQuery(e,"imports"),o=t.filter(s=>s.name==="import").map(s=>s.node),n=[];for(let s of o)n.push({source:s.text,imports:[s.text],line:s.startPosition.row+1,type:"side-effect"});return n}async findReferences(e,t,o){let{captures:n}=await this.executeQuery(e,"references"),s=e.content.split(`
260
+ `),i=[];for(let a of n)if(a.node.text===t){let l=a.node.parent?.type.includes("definition")||a.node.parent?.type.includes("declaration");if(!l||o){let p=a.node.startPosition.row+1;i.push({file:e.filePath,line:p,column:a.node.startPosition.column,context:s[p-1].trim(),isDeclaration:!!l})}}return i}async getSymbolAtPosition(e,t,o){let{tree:n}=await this.context.getTree(e.filePath,e.content),s=n.rootNode.descendantForPosition({row:t-1,column:o});return s&&s.type==="identifier"?s.text:null}async getDefinition(e,t){let o=await this.findSymbols(e,t);return o.length>0?o[0]:null}async getDiagnostics(e){let{tree:t}=await this.context.getTree(e.filePath,e.content),o=[];function n(s){if(s.hasError()){s.type==="ERROR"&&o.push({message:`Syntax error at line ${s.startPosition.row+1}`,line:s.startPosition.row+1,column:s.startPosition.column,severity:"error"});for(let i of s.children)n(i)}else s.isMissing&&s.isMissing()&&o.push({message:`Missing ${s.type} at line ${s.startPosition.row+1}`,line:s.startPosition.row+1,column:s.startPosition.column,severity:"error"})}return n(t.rootNode),o}async getExports(e){return[]}async getOutline(e){return(await this.getSymbols(e)).map(o=>({name:o.name,kind:o.kind,line:o.line,column:o.column,children:[]}))}async extractFunction(e,t,o,n,s,i){let a=e.content.split(`
261
+ `),l=Math.max(0,t-1),p=Math.min(a.length,n),m=a.slice(l,p).join(`
262
262
  `),f="",g="",w=e.filePath.split(".").pop()?.toLowerCase();return w==="py"||w==="pyi"?(f=`
263
263
  def ${i}():
264
264
  ${m.split(`
@@ -280,24 +280,24 @@ ${m}
280
280
  void ${i}() {
281
281
  ${m}
282
282
  }
283
- `,g=`${i}();`),{newFunction:f,replacementCall:g}}async getCallHierarchy(e,t,o){let n=await this.getSymbolAtPosition(e,t,o);if(!n)return null;let i=(await this.findReferences(e,n,!1)).map(a=>({file:a.file,name:a.context.trim()||"<anonymous>",line:a.line,column:a.column}));return{file:e.filePath,name:n,line:t,column:o,callers:i,callees:[]}}}});var Wn,Hf=h(()=>{"use strict";l();Zs();jf();zf();Wn=class{constructor(e){this.context=e;this.babelParser=new Fn,this.treeSitterParser=new qn(this.context)}context;babelParser;treeSitterParser;getParser(e){switch(In(e)){case"javascript":case"typescript":case"tsx":case"jsx":return this.babelParser;case"python":case"go":case"rust":case"java":case"c":case"cpp":return this.treeSitterParser;default:throw new Error(`Unsupported or unknown language for file: ${e}`)}}}});import{readFileSync as fx,statSync as gx,readdirSync as hx}from"fs";import{join as yx,extname as bx}from"path";var Un,Kf=h(()=>{"use strict";l();de();Un=class{isBuilt=!1;isBuilding=!1;data={symbolLocations:new Map};fileMtimes=new Map;supportedExtensions=[".js",".jsx",".ts",".tsx",".mjs",".cjs",".py",".go",".rs",".java",".c",".cpp",".h",".hpp"];async getAllSupportedFiles(e){let t=[];try{let o=hx(e,{withFileTypes:!0});for(let n of o){let s=yx(e,n.name);n.name==="node_modules"||n.name===".git"||n.name==="dist"||n.name==="build"||(n.isDirectory()?t.push(...await this.getAllSupportedFiles(s)):n.isFile()&&this.supportedExtensions.includes(bx(n.name).toLowerCase())&&t.push(s))}}catch{}return t}async buildIndex(e){if(!(this.isBuilt||this.isBuilding)){this.isBuilding=!0;try{let t=await this.getAllSupportedFiles(e);for(let o of t)await this.updateFile(o);this.isBuilt=!0}finally{this.isBuilding=!1}}}async updateFile(e){try{let o=gx(e).mtimeMs;if(this.fileMtimes.get(e)===o)return;let n=fx(e,"utf-8"),s=q.getParser(e);this.removeFileFromIndex(e);let i=await s.getSymbols({filePath:e,content:n});for(let a of i){let c=this.data.symbolLocations.get(a.name);c?c.add(e):this.data.symbolLocations.set(a.name,new Set([e]))}this.fileMtimes.set(e,o)}catch{this.removeFileFromIndex(e)}}removeFileFromIndex(e){for(let[t,o]of this.data.symbolLocations.entries())o.delete(e),o.size===0&&this.data.symbolLocations.delete(t);this.fileMtimes.delete(e)}async getDefinitionFiles(e,t){await this.buildIndex(t);let o=this.data.symbolLocations.get(e);return o?Array.from(o):[]}}});var wx,q,Pt,de=h(()=>{"use strict";l();Lf();Hf();Kf();wx=new jn,q=new Wn(wx),Pt=new Un});import{readFileSync as Tx,statSync as xx,readdirSync as vx}from"fs";import{join as Cx,extname as kx}from"path";async function Jf(r,e,t){try{let o=Tx(r,"utf-8");return await q.getParser(r).findSymbols({filePath:r,content:o},e,t)}catch{return[]}}async function Vf(r,e,t){let o=[];try{let n=vx(r,{withFileTypes:!0});for(let s of n){let i=Cx(r,s.name);if(!(s.name==="node_modules"||s.name===".git"||s.name==="dist")){if(s.isDirectory()){let a=await Vf(i,e,t);o.push(...a)}else if(s.isFile()&&Px.includes(kx(s.name))){let a=await Jf(i,e,t);o.push(...a)}}}}catch{}return o}async function Sx(r){let e=r.symbol,t=r.path,o=r.kind;if(y(`[coding.find-symbol] execute symbol="${e}" path="${t}" kind=${o??"all"}`),!e)throw new Error("symbol is required");if(!t)throw new Error("path is required");let n=xx(t),s;if(n.isDirectory())s=await Vf(t,e,o);else if(n.isFile())s=await Jf(t,e,o);else throw new Error(`Path is neither a file nor directory: ${t}`);return JSON.stringify({symbol:e,found:s.length,locations:s},null,2)}var Px,Ko,ni=h(()=>{"use strict";l();Df();de();k();Px=[".js",".jsx",".ts",".tsx",".mjs",".cjs",".py",".go",".rs",".java",".c",".cpp",".h",".hpp"];Ko={name:Sf,displayName:Rf,description:_f,parameters:Ef,category:$f,execute:Sx}});var Qf,Xf,Yf,Zf,eg,tg=h(()=>{"use strict";l();Qf="coding.get_symbols",Xf="Get Symbols",Yf="List all symbols (functions, classes, variables, etc.) in a JavaScript/TypeScript file",Zf="coding",eg={type:"object",properties:{file:{type:"string",description:"Path to the file to analyze"},kind:{type:"string",description:"Optional: filter by symbol kind (function, class, variable, const, let, interface, type)"}},required:["file"]}});import{readFileSync as Rx}from"fs";async function _x(r){let e=r.file,t=r.kind;if(y(`[coding.get-symbols] execute file="${e}" kind=${t??"all"}`),!e)throw new Error("file is required");try{let o=Rx(e,"utf-8"),s=await q.getParser(e).getSymbols({filePath:e,content:o},t);return JSON.stringify({file:e,count:s.length,symbols:s},null,2)}catch(o){throw new Error(`Failed to parse file "${e}": ${o.message}`)}}var Jo,ri=h(()=>{"use strict";l();tg();de();k();Jo={name:Qf,displayName:Xf,description:Yf,parameters:eg,category:Zf,execute:_x}});var og,ng,rg,sg,ig,ag=h(()=>{"use strict";l();og="coding.get_imports",ng="Get Imports",rg="List all import statements in a JavaScript/TypeScript file",sg="coding",ig={type:"object",properties:{file:{type:"string",description:"Path to the file to analyze"}},required:["file"]}});import{readFileSync as $x}from"fs";async function Ex(r){let e=r.file;if(y(`[coding.get-imports] execute file="${e}"`),!e)throw new Error("file is required");try{let t=$x(e,"utf-8"),n=await q.getParser(e).getImports({filePath:e,content:t});return JSON.stringify({file:e,count:n.length,imports:n},null,2)}catch(t){throw new Error(`Failed to map explicit imports in file "${e}": ${t.message}`)}}var Vo,si=h(()=>{"use strict";l();ag();de();k();Vo={name:og,displayName:ng,description:rg,parameters:ig,category:sg,execute:Ex}});var lg,cg,pg,mg,dg,ug=h(()=>{"use strict";l();lg="coding.find_references",cg="Find References",pg="Find all references to a symbol across JavaScript/TypeScript files",mg="coding",dg={type:"object",properties:{symbol:{type:"string",description:"Name of the symbol to find references for"},path:{type:"string",description:"File or directory path to search in (searches recursively if directory)"},includeDeclaration:{type:"boolean",description:"Include the symbol declaration in results (default: false)"}},required:["symbol","path"]}});import{readFileSync as Dx,statSync as Mx}from"fs";async function fg(r,e,t){try{let o=Dx(r,"utf-8");return await q.getParser(r).findReferences({filePath:r,content:o},e,t)}catch{return[]}}async function Ox(r,e,t){let o=[];await Pt.buildIndex(r);let n=await Pt.getDefinitionFiles(e,r);for(let s of n)if(s.startsWith(r)){let i=await fg(s,e,t);o.push(...i)}return o}async function Nx(r){let e=r.symbol,t=r.path,o=r.includeDeclaration===!0;if(y(`[coding.find-references] execute symbol="${e}" path="${t}" includeDecl=${o}`),!e)throw new Error("symbol is required");if(!t)throw new Error("path is required");let n=Mx(t),s;if(n.isDirectory())s=await Ox(t,e,o);else if(n.isFile())s=await fg(t,e,o);else throw new Error(`Path is neither a file nor directory: ${t}`);return JSON.stringify({symbol:e,found:s.length,references:s},null,2)}var Qo,ii=h(()=>{"use strict";l();ug();de();k();Qo={name:lg,displayName:cg,description:pg,parameters:dg,category:mg,execute:Nx}});var gg,hg,yg,bg,wg,Tg=h(()=>{"use strict";l();gg="coding.go_to_definition",hg="Go To Definition",yg="Jump to the definition of a symbol at a specific location in a file",bg="coding",wg={type:"object",properties:{file:{type:"string",description:"Path to the file containing the symbol reference"},line:{type:"integer",description:"Line number where the symbol is referenced (1-indexed)"},column:{type:"integer",description:"Column number where the symbol is referenced (0-indexed)"},searchPath:{type:"string",description:"Optional: directory to search for the definition (defaults to file directory)"}},required:["file","line","column"]}});import{readFileSync as xg,statSync as Ax}from"fs";import{dirname as Ix}from"path";async function Lx(r,e,t){try{let o=xg(r,"utf-8");return await q.getParser(r).getSymbolAtPosition({filePath:r,content:o},e,t)}catch{return null}}async function vg(r,e){try{let t=xg(r,"utf-8");return await q.getParser(r).getDefinition({filePath:r,content:t},e)}catch{return null}}async function jx(r,e){await Pt.buildIndex(r);let t=await Pt.getDefinitionFiles(e,r);for(let o of t)if(o.startsWith(r)){let n=await vg(o,e);if(n)return n}return null}async function Fx(r){let e=r.file,t=r.line,o=r.column,n=r.searchPath;if(!e)throw new Error("file is required");if(t===void 0)throw new Error("line is required");if(o===void 0)throw new Error("column is required");let s=await Lx(e,t,o);if(!s)return JSON.stringify({found:!1,message:`No symbol found at ${e}:${t}:${o}`},null,2);let i=await vg(e,s);if(!i){let a=n||Ix(e);Ax(a).isDirectory()&&(i=await jx(a,s))}return JSON.stringify(i?{found:!0,symbol:s,definition:i}:{found:!1,symbol:s,message:`Definition not found for symbol "${s}"`},null,2)}var Xo,ai=h(()=>{"use strict";l();Tg();de();Xo={name:gg,displayName:hg,description:yg,parameters:wg,category:bg,execute:Fx}});var Cg,kg,Pg,Sg,Rg,_g=h(()=>{"use strict";l();Cg="coding.multi_file_edit",kg="Multi-File Edit",Pg="Edit multiple files atomically with rollback on failure",Sg="coding",Rg={type:"object",properties:{edits:{type:"array",items:{type:"object",properties:{file:{type:"string"},changes:{type:"array",items:{type:"object",properties:{oldText:{type:"string"},newText:{type:"string"}}}}}},description:"Array of file edits, each with file path and array of text replacements"},atomic:{type:"boolean",description:"Atomic mode: rollback all edits if any fails (default: true)"}},required:["edits"]}});import{readFileSync as qx,writeFileSync as $g,existsSync as Wx}from"fs";async function Ux(r){let e=r.edits,t=r.atomic!==!1;if(!e||!Array.isArray(e)||e.length===0)throw new Error("edits array is required and must not be empty");for(let s of e){if(!s.file)throw new Error("Each edit must have a file property");if(!s.changes||!Array.isArray(s.changes))throw new Error("Each edit must have a changes array");if(!Wx(s.file))throw new Error(`File does not exist: ${s.file}`)}let o=[],n=[];try{for(let s of e){let i=qx(s.file,"utf-8");t&&o.push({file:s.file,content:i});let a=i;for(let c of s.changes){if(!c.oldText)throw new Error("Each change must have oldText property");if(c.newText===void 0)throw new Error("Each change must have newText property");let p=(a.match(new RegExp(Gx(c.oldText),"g"))||[]).length;if(p===0)throw new Error(`Text not found in ${s.file}: "${c.oldText.substring(0,50)}..."`);if(p>1)throw new Error(`Ambiguous replacement in ${s.file}: "${c.oldText.substring(0,50)}..." appears ${p} times`);a=a.replace(c.oldText,c.newText)}$g(s.file,a,"utf-8"),n.push(s.file)}return JSON.stringify({success:!0,filesModified:n.length,files:n},null,2)}catch(s){if(t&&o.length>0){for(let i of o)try{$g(i.file,i.content,"utf-8")}catch{}throw new Error(`Multi-file edit failed and rolled back: ${s.message}`)}throw new Error(`Multi-file edit failed: ${s.message}`)}}function Gx(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Yo,li=h(()=>{"use strict";l();_g();Yo={name:Cg,displayName:kg,description:Pg,parameters:Rg,category:Sg,execute:Ux,confirmation:{level:"high",reason:"This will modify multiple source code files atomically.",showArgs:["edits"]}}});var Eg,Dg,Mg,Og,Ng,Ag=h(()=>{"use strict";l();Eg="coding.refactor_rename",Dg="Refactor Rename",Mg="Rename a symbol across the entire codebase intelligently",Og="coding",Ng={type:"object",properties:{symbol:{type:"string",description:"Current name of the symbol to rename"},newName:{type:"string",description:"New name for the symbol"},path:{type:"string",description:"Directory path to search and rename in"},dryRun:{type:"boolean",description:"Preview changes without applying them (default: false)"}},required:["symbol","newName","path"]}});import{readFileSync as Bx,writeFileSync as zx,readdirSync as Hx}from"fs";import{join as Kx,extname as Jx}from"path";import{parse as Vx}from"@babel/parser";import*as ci from"@babel/traverse";function Yx(r,e,t,o){let n=[];try{let s=Bx(r,"utf-8"),i=s.split(`
284
- `),a=Vx(s,{sourceType:"module",plugins:["jsx","typescript","decorators-legacy","classProperties","objectRestSpread","optionalChaining","nullishCoalescingOperator"]}),c=[];if(Qx(a,{Identifier(p){if(p.node.name===e){let m=p.node.loc?.start.line||0,f=p.node.loc?.start.column||0;c.push({line:m,column:f,length:e.length}),n.push({file:r,line:m,column:f,oldName:e,newName:t})}}}),!o&&c.length>0){c.sort((m,f)=>m.line!==f.line?f.line-m.line:f.column-m.column);let p=[...i];for(let m of c){let f=m.line-1;if(f>=0&&f<p.length){let g=p[f],w=g.substring(0,m.column),b=g.substring(m.column+m.length);p[f]=w+t+b}}zx(r,p.join(`
285
- `),"utf-8")}}catch{}return{file:r,occurrences:n.length,changes:n}}function Ig(r,e,t,o){let n=[];try{let s=Hx(r,{withFileTypes:!0});for(let i of s){let a=Kx(r,i.name);if(!(i.name==="node_modules"||i.name===".git"||i.name==="dist")){if(i.isDirectory())n.push(...Ig(a,e,t,o));else if(i.isFile()&&Xx.includes(Jx(i.name))){let c=Yx(a,e,t,o);c.occurrences>0&&n.push(c)}}}}catch{}return n}async function Zx(r){let e=r.symbol,t=r.newName,o=r.path,n=r.dryRun===!0;if(!e)throw new Error("symbol is required");if(!t)throw new Error("newName is required");if(!o)throw new Error("path is required");if(e===t)throw new Error("New name must be different from old name");let s=Ig(o,e,t,n),i=s.reduce((c,p)=>c+p.occurrences,0),a=s.length;return JSON.stringify({success:!0,dryRun:n,oldName:e,newName:t,filesAffected:a,totalOccurrences:i,changes:s},null,2)}var Qx,Xx,Zo,pi=h(()=>{"use strict";l();Ag();Qx=ci.default||ci,Xx=[".js",".jsx",".ts",".tsx",".mjs",".cjs"];Zo={name:Eg,displayName:Dg,description:Mg,parameters:Ng,category:Og,execute:Zx,confirmation:{level:"high",reason:"This will rename a symbol across multiple files, rewriting source code without backup.",showArgs:["symbol","newName"]}}});var Lg,jg,Fg,qg,Wg,Ug=h(()=>{"use strict";l();Lg="coding.get_outline",jg="Get File Outline",Fg="Gets a hierarchical outline of symbols (classes, functions, methods) in a specified file.",qg="coding",Wg={type:"object",properties:{file:{type:"string",description:"The absolute path to the file to outline"}},required:["file"]}});import{readFileSync as ev,statSync as tv}from"fs";async function ov(r){let e=r.file;if(y(`[coding.get-outline] execute file="${e}"`),!e)throw new Error("file is required");try{if(!tv(e).isFile())throw new Error(`Path is not a file: ${e}`)}catch{throw new Error(`File not found: ${e}`)}try{let t=ev(e,"utf-8"),o=q.getParser(e);if(!o.getOutline)return JSON.stringify({file:e,error:"Outline extraction is not specifically implemented for this language yet."});let n=await o.getOutline({filePath:e,content:t});return JSON.stringify({file:e,outline:n},null,2)}catch(t){throw new Error(`Failed to safely extract outline from file "${e}": ${t.message}`)}}var en,mi=h(()=>{"use strict";l();Ug();de();k();en={name:Lg,displayName:jg,description:Fg,parameters:Wg,category:qg,execute:ov}});var Gg,Bg,zg,Hg,Kg,Jg=h(()=>{"use strict";l();Gg="coding.get_diagnostics",Bg="Get File Diagnostics",zg="Gets syntax errors and warnings for a file utilizing AST parsing.",Hg="coding",Kg={type:"object",properties:{file:{type:"string",description:"The absolute path to the file to check for diagnostics"}},required:["file"]}});import{readFileSync as nv,statSync as rv}from"fs";async function sv(r){let e=r.file;if(!e)throw new Error("file is required");try{if(!rv(e).isFile())throw new Error(`Path is not a file: ${e}`)}catch{throw new Error(`File not found: ${e}`)}try{let t=nv(e,"utf-8"),o=q.getParser(e);if(!o.getDiagnostics)return JSON.stringify({file:e,error:"Diagnostics extraction is not specifically implemented for this language yet."});let n=await o.getDiagnostics({filePath:e,content:t});return JSON.stringify({file:e,diagnostics:n},null,2)}catch(t){throw new Error(`Failed to get diagnostics from file "${e}": ${t.message}`)}}var tn,di=h(()=>{"use strict";l();Jg();de();tn={name:Gg,displayName:Bg,description:zg,parameters:Kg,category:Hg,execute:sv}});var Vg,Qg,Xg,Yg,Zg,eh=h(()=>{"use strict";l();Vg="coding.get_exports",Qg="Get File Exports",Xg="Lists all symbols exported by a file.",Yg="coding",Zg={type:"object",properties:{file:{type:"string",description:"The absolute path to the file"}},required:["file"]}});import{readFileSync as iv,statSync as av}from"fs";async function lv(r){let e=r.file;if(y(`[coding.get-exports] execute file="${e}"`),!e)throw new Error("file is required");try{if(!av(e).isFile())throw new Error(`Path is not a file: ${e}`)}catch{throw new Error(`File not found: ${e}`)}try{let t=iv(e,"utf-8"),o=q.getParser(e);if(!o.getExports)return JSON.stringify({file:e,error:"Exports extraction is not specifically implemented for this language yet."});let n=await o.getExports({filePath:e,content:t});return JSON.stringify({file:e,exports:n},null,2)}catch(t){throw new Error(`Failed to extract exports from file "${e}": ${t.message}`)}}var on,ui=h(()=>{"use strict";l();eh();de();k();on={name:Vg,displayName:Qg,description:Xg,parameters:Zg,category:Yg,execute:lv}});var th,oh,nh,rh,sh,ih=h(()=>{"use strict";l();th="coding.extract_function",oh="Extract Function",nh="Extracts a selected code region into a new function, automatically detecting required parameters and return values.",rh="coding",sh={type:"object",properties:{file:{type:"string",description:"The absolute path to the file"},startLine:{type:"number",description:"1-indexed start line of the code to extract"},startColumn:{type:"number",description:"0-indexed start column of the code to extract"},endLine:{type:"number",description:"1-indexed end line of the code to extract"},endColumn:{type:"number",description:"0-indexed end column of the code to extract"},newFunctionName:{type:"string",description:"The name for the newly extracted function"}},required:["file","startLine","startColumn","endLine","endColumn","newFunctionName"]}});import{readFileSync as cv,statSync as pv}from"fs";async function mv(r){let e=r.file,t=r.startLine,o=r.startColumn,n=r.endLine,s=r.endColumn,i=r.newFunctionName;if(!e)throw new Error("file is required");if(t===void 0)throw new Error("startLine is required");if(o===void 0)throw new Error("startColumn is required");if(n===void 0)throw new Error("endLine is required");if(s===void 0)throw new Error("endColumn is required");if(!i)throw new Error("newFunctionName is required");try{if(!pv(e).isFile())throw new Error(`Path is not a file: ${e}`)}catch{throw new Error(`File not found: ${e}`)}try{let a=cv(e,"utf-8"),c=q.getParser(e);if(!c.extractFunction)return JSON.stringify({file:e,error:"Function extraction is not specifically implemented for this language yet."});let p=await c.extractFunction({filePath:e,content:a},t,o,n,s,i);return JSON.stringify({file:e,result:p},null,2)}catch(a){throw new Error(`Failed to extract function from file "${e}": ${a.message}`)}}var nn,fi=h(()=>{"use strict";l();ih();de();nn={name:th,displayName:oh,description:nh,parameters:sh,category:rh,execute:mv}});var ah,lh,ch,ph,mh,dh=h(()=>{"use strict";l();ah="coding.get_call_hierarchy",lh="Get Call Hierarchy",ch="Shows callers and callees of a specific function or method.",ph="coding",mh={type:"object",properties:{file:{type:"string",description:"The absolute path to the file containing the function"},line:{type:"number",description:"1-indexed line number where the function is defined or called"},column:{type:"number",description:"0-indexed column number where the function is defined or called"}},required:["file","line","column"]}});import{readFileSync as dv,statSync as uv}from"fs";async function fv(r){let e=r.file,t=r.line,o=r.column;if(!e)throw new Error("file is required");if(t===void 0)throw new Error("line is required");if(o===void 0)throw new Error("column is required");try{if(!uv(e).isFile())throw new Error(`Path is not a file: ${e}`)}catch{throw new Error(`File not found: ${e}`)}try{let n=dv(e,"utf-8"),s=q.getParser(e);if(!s.getCallHierarchy)return JSON.stringify({file:e,error:"Call hierarchy is not specifically implemented for this language yet."});let i=await s.getCallHierarchy({filePath:e,content:n},t,o);return JSON.stringify({file:e,hierarchy:i},null,2)}catch(n){throw new Error(`Failed to get call hierarchy from file "${e}": ${n.message}`)}}var rn,gi=h(()=>{"use strict";l();dh();de();rn={name:ah,displayName:lh,description:ch,parameters:mh,category:ph,execute:fv}});var fh={};le(fh,{codingExtractFunctionTool:()=>nn,codingFindReferencesTool:()=>Qo,codingFindSymbolTool:()=>Ko,codingGetCallHierarchyTool:()=>rn,codingGetDiagnosticsTool:()=>tn,codingGetExportsTool:()=>on,codingGetImportsTool:()=>Vo,codingGetOutlineTool:()=>en,codingGetSymbolsTool:()=>Jo,codingGoToDefinitionTool:()=>Xo,codingMultiFileEditTool:()=>Yo,codingRefactorRenameTool:()=>Zo,codingToolsProject:()=>uh});var uh,hi=h(()=>{"use strict";l();ni();ri();si();ii();ai();li();pi();mi();di();ui();fi();gi();ni();ri();si();ii();ai();li();pi();mi();di();ui();fi();gi();uh={manifest:{key:"coding",name:"coding-tools",displayName:"Code Intelligence",version:"1.0.0",description:"AST-aware code intelligence tools for finding symbols, references, and analyzing code structure.",author:"Sajeer",tools:["coding.find_symbol","coding.get_symbols","coding.get_imports","coding.find_references","coding.go_to_definition","coding.get_outline","coding.get_diagnostics","coding.get_exports","coding.extract_function","coding.get_call_hierarchy","coding.multi_file_edit","coding.refactor_rename"],category:"coding"},tools:[Ko,Jo,Vo,Qo,Xo,en,tn,on,nn,rn,Yo,Zo],dependencies:{"@babel/parser":"^7.24.0","@babel/traverse":"^7.24.0","@babel/types":"^7.24.0"}}});var gh,hh=h(()=>{"use strict";l();gh={type:"object",properties:{path:{type:"string",description:"Optional path or directory to check the status for. If omitted, checks the entire repository."}}}});import{simpleGit as gv}from"simple-git";function U(r){let e={baseDir:r||process.cwd(),binary:"git",maxConcurrentProcesses:6};return gv(e)}var Ce=h(()=>{"use strict";l()});var Gn,yh=h(()=>{"use strict";l();hh();Ce();Gn={name:"git.status",displayName:"Git Status",description:"Get the working tree status, including modified, staged, and untracked files.",category:"version-control",parameters:gh,execute:async r=>{let e=r.path;try{let o=await U().status(e?[e]:[]);if(o.isClean())return"Working tree clean";let n=[];return n.push(`Branch: ${o.current}`),o.tracking&&n.push(`Tracking: ${o.tracking}`),o.ahead>0&&n.push(`Ahead: ${o.ahead}`),o.behind>0&&n.push(`Behind: ${o.behind}`),n.push("---"),o.conflicted.length>0&&n.push(`Conflicted: ${o.conflicted.join(", ")}`),o.created.length>0&&n.push(`Created: ${o.created.join(", ")}`),o.deleted.length>0&&n.push(`Deleted: ${o.deleted.join(", ")}`),o.modified.length>0&&n.push(`Modified: ${o.modified.join(", ")}`),o.renamed.length>0&&n.push(`Renamed: ${o.renamed.map(s=>`${s.from} -> ${s.to}`).join(", ")}`),o.staged.length>0&&n.push(`Staged: ${o.staged.join(", ")}`),o.not_added.length>0&&n.push(`Untracked: ${o.not_added.join(", ")}`),n.join(`
286
- `)}catch(t){return`Error getting git status: ${t instanceof Error?t.message:String(t)}`}}}});var bh,wh=h(()=>{"use strict";l();bh={type:"object",properties:{path:{type:"string",description:"Optional path to get the diff for. If omitted, gets the diff for the entire repository."},base:{type:"string",description:"Optional base commit/ref for comparing two revisions. When used with head, runs git diff base...head."},head:{type:"string",description:"Optional head commit/ref for comparing two revisions. When used with base, runs git diff base...head."},staged:{type:"boolean",description:"If true, gets the diff of staged changes instead of unstaged changes.",default:!1},cloneDir:{type:"string",description:"Optional local repository directory, typically the cloneDir returned by git.clone. When provided, this tool runs in that repository instead of the current working directory."}}}});var Bn,Th=h(()=>{"use strict";l();wh();Ce();Bn={name:"git.diff",displayName:"Git Diff",description:"Show changes between commits, commit and working tree, etc.",category:"version-control",parameters:bh,execute:async r=>{let e=r.path,t=r.base,o=r.head,n=r.staged,s=r.cloneDir;try{let i=U(s),a=[];if(t||o){if(!t||!o)return"Error getting git diff: both base and head are required when comparing revisions.";a.push(`${t}...${o}`)}n&&a.push("--cached"),e&&a.push("--",e);let c=await i.diff(a);return c||"No changes found."}catch(i){return`Error getting git diff: ${i instanceof Error?i.message:String(i)}`}}}});var xh,vh=h(()=>{"use strict";l();xh={type:"object",properties:{maxCount:{type:"number",description:"Maximum number of commits to return. Defaults to 10 to prevent large outputs.",default:10},path:{type:"string",description:"Optional path to get the log for specific file or directory."},cloneDir:{type:"string",description:"Optional local repository directory, typically the cloneDir returned by git.clone. When provided, this tool runs in that repository instead of the current working directory."}}}});var zn,Ch=h(()=>{"use strict";l();vh();Ce();zn={name:"git.log",displayName:"Git Log",description:"Show commit logs.",category:"version-control",parameters:xh,execute:async r=>{let e=r.maxCount||10,t=r.path,o=r.cloneDir;try{let n=U(o),s={maxCount:e};t&&(s.file=t);let i=await n.log(s);return i.all.length===0?"No commits found.":i.all.map(a=>`Commit: ${a.hash}
283
+ `,g=`${i}();`),{newFunction:f,replacementCall:g}}async getCallHierarchy(e,t,o){let n=await this.getSymbolAtPosition(e,t,o);if(!n)return null;let i=(await this.findReferences(e,n,!1)).map(a=>({file:a.file,name:a.context.trim()||"<anonymous>",line:a.line,column:a.column}));return{file:e.filePath,name:n,line:t,column:o,callers:i,callees:[]}}}});var Un,Jf=h(()=>{"use strict";c();ei();qf();Kf();Un=class{constructor(e){this.context=e;this.babelParser=new qn,this.treeSitterParser=new Wn(this.context)}context;babelParser;treeSitterParser;getParser(e){switch(Ln(e)){case"javascript":case"typescript":case"tsx":case"jsx":return this.babelParser;case"python":case"go":case"rust":case"java":case"c":case"cpp":return this.treeSitterParser;default:throw new Error(`Unsupported or unknown language for file: ${e}`)}}}});import{readFileSync as hx,statSync as yx,readdirSync as bx}from"fs";import{join as wx,extname as Tx}from"path";var Gn,Vf=h(()=>{"use strict";c();he();Gn=class{isBuilt=!1;isBuilding=!1;data={symbolLocations:new Map};fileMtimes=new Map;supportedExtensions=[".js",".jsx",".ts",".tsx",".mjs",".cjs",".py",".go",".rs",".java",".c",".cpp",".h",".hpp"];async getAllSupportedFiles(e){let t=[];try{let o=bx(e,{withFileTypes:!0});for(let n of o){let s=wx(e,n.name);n.name==="node_modules"||n.name===".git"||n.name==="dist"||n.name==="build"||(n.isDirectory()?t.push(...await this.getAllSupportedFiles(s)):n.isFile()&&this.supportedExtensions.includes(Tx(n.name).toLowerCase())&&t.push(s))}}catch{}return t}async buildIndex(e){if(!(this.isBuilt||this.isBuilding)){this.isBuilding=!0;try{let t=await this.getAllSupportedFiles(e);for(let o of t)await this.updateFile(o);this.isBuilt=!0}finally{this.isBuilding=!1}}}async updateFile(e){try{let o=yx(e).mtimeMs;if(this.fileMtimes.get(e)===o)return;let n=hx(e,"utf-8"),s=F.getParser(e);this.removeFileFromIndex(e);let i=await s.getSymbols({filePath:e,content:n});for(let a of i){let l=this.data.symbolLocations.get(a.name);l?l.add(e):this.data.symbolLocations.set(a.name,new Set([e]))}this.fileMtimes.set(e,o)}catch{this.removeFileFromIndex(e)}}removeFileFromIndex(e){for(let[t,o]of this.data.symbolLocations.entries())o.delete(e),o.size===0&&this.data.symbolLocations.delete(t);this.fileMtimes.delete(e)}async getDefinitionFiles(e,t){await this.buildIndex(t);let o=this.data.symbolLocations.get(e);return o?Array.from(o):[]}}});var xx,F,St,he=h(()=>{"use strict";c();Ff();Jf();Vf();xx=new Fn,F=new Un(xx),St=new Gn});import{readFileSync as vx,statSync as Cx,readdirSync as Px}from"fs";import{join as kx,extname as Sx}from"path";async function Qf(r,e,t){try{let o=vx(r,"utf-8");return await F.getParser(r).findSymbols({filePath:r,content:o},e,t)}catch{return[]}}async function Xf(r,e,t){let o=[];try{let n=Px(r,{withFileTypes:!0});for(let s of n){let i=kx(r,s.name);if(!(s.name==="node_modules"||s.name===".git"||s.name==="dist")){if(s.isDirectory()){let a=await Xf(i,e,t);o.push(...a)}else if(s.isFile()&&Rx.includes(Sx(s.name))){let a=await Qf(i,e,t);o.push(...a)}}}}catch{}return o}async function _x(r){let e=r.symbol,t=r.path,o=r.kind;if(y(`[coding.find-symbol] execute symbol="${e}" path="${t}" kind=${o??"all"}`),!e)throw new Error("symbol is required");if(!t)throw new Error("path is required");let n=Cx(t),s;if(n.isDirectory())s=await Xf(t,e,o);else if(n.isFile())s=await Qf(t,e,o);else throw new Error(`Path is neither a file nor directory: ${t}`);return JSON.stringify({symbol:e,found:s.length,locations:s},null,2)}var Rx,Jo,ri=h(()=>{"use strict";c();Of();he();k();Rx=[".js",".jsx",".ts",".tsx",".mjs",".cjs",".py",".go",".rs",".java",".c",".cpp",".h",".hpp"];Jo={name:_f,displayName:$f,description:Ef,parameters:Mf,category:Df,execute:_x}});var Yf,Zf,eg,tg,og,ng=h(()=>{"use strict";c();Yf="coding.get_symbols",Zf="Get Symbols",eg="List all symbols (functions, classes, variables, etc.) in a JavaScript/TypeScript file",tg="coding",og={type:"object",properties:{file:{type:"string",description:"Path to the file to analyze"},kind:{type:"string",description:"Optional: filter by symbol kind (function, class, variable, const, let, interface, type)"}},required:["file"]}});import{readFileSync as $x}from"fs";async function Ex(r){let e=r.file,t=r.kind;if(y(`[coding.get-symbols] execute file="${e}" kind=${t??"all"}`),!e)throw new Error("file is required");try{let o=$x(e,"utf-8"),s=await F.getParser(e).getSymbols({filePath:e,content:o},t);return JSON.stringify({file:e,count:s.length,symbols:s},null,2)}catch(o){throw new Error(`Failed to parse file "${e}": ${o.message}`)}}var Vo,si=h(()=>{"use strict";c();ng();he();k();Vo={name:Yf,displayName:Zf,description:eg,parameters:og,category:tg,execute:Ex}});var rg,sg,ig,ag,lg,cg=h(()=>{"use strict";c();rg="coding.get_imports",sg="Get Imports",ig="List all import statements in a JavaScript/TypeScript file",ag="coding",lg={type:"object",properties:{file:{type:"string",description:"Path to the file to analyze"}},required:["file"]}});import{readFileSync as Dx}from"fs";async function Mx(r){let e=r.file;if(y(`[coding.get-imports] execute file="${e}"`),!e)throw new Error("file is required");try{let t=Dx(e,"utf-8"),n=await F.getParser(e).getImports({filePath:e,content:t});return JSON.stringify({file:e,count:n.length,imports:n},null,2)}catch(t){throw new Error(`Failed to map explicit imports in file "${e}": ${t.message}`)}}var Qo,ii=h(()=>{"use strict";c();cg();he();k();Qo={name:rg,displayName:sg,description:ig,parameters:lg,category:ag,execute:Mx}});var pg,mg,dg,ug,fg,gg=h(()=>{"use strict";c();pg="coding.find_references",mg="Find References",dg="Find all references to a symbol across JavaScript/TypeScript files",ug="coding",fg={type:"object",properties:{symbol:{type:"string",description:"Name of the symbol to find references for"},path:{type:"string",description:"File or directory path to search in (searches recursively if directory)"},includeDeclaration:{type:"boolean",description:"Include the symbol declaration in results (default: false)"}},required:["symbol","path"]}});import{readFileSync as Ox,statSync as Nx}from"fs";async function hg(r,e,t){try{let o=Ox(r,"utf-8");return await F.getParser(r).findReferences({filePath:r,content:o},e,t)}catch{return[]}}async function Ax(r,e,t){let o=[];await St.buildIndex(r);let n=await St.getDefinitionFiles(e,r);for(let s of n)if(s.startsWith(r)){let i=await hg(s,e,t);o.push(...i)}return o}async function Ix(r){let e=r.symbol,t=r.path,o=r.includeDeclaration===!0;if(y(`[coding.find-references] execute symbol="${e}" path="${t}" includeDecl=${o}`),!e)throw new Error("symbol is required");if(!t)throw new Error("path is required");let n=Nx(t),s;if(n.isDirectory())s=await Ax(t,e,o);else if(n.isFile())s=await hg(t,e,o);else throw new Error(`Path is neither a file nor directory: ${t}`);return JSON.stringify({symbol:e,found:s.length,references:s},null,2)}var Xo,ai=h(()=>{"use strict";c();gg();he();k();Xo={name:pg,displayName:mg,description:dg,parameters:fg,category:ug,execute:Ix}});var yg,bg,wg,Tg,xg,vg=h(()=>{"use strict";c();yg="coding.go_to_definition",bg="Go To Definition",wg="Jump to the definition of a symbol at a specific location in a file",Tg="coding",xg={type:"object",properties:{file:{type:"string",description:"Path to the file containing the symbol reference"},line:{type:"integer",description:"Line number where the symbol is referenced (1-indexed)"},column:{type:"integer",description:"Column number where the symbol is referenced (0-indexed)"},searchPath:{type:"string",description:"Optional: directory to search for the definition (defaults to file directory)"}},required:["file","line","column"]}});import{readFileSync as Cg,statSync as Lx}from"fs";import{dirname as jx}from"path";async function Fx(r,e,t){try{let o=Cg(r,"utf-8");return await F.getParser(r).getSymbolAtPosition({filePath:r,content:o},e,t)}catch{return null}}async function Pg(r,e){try{let t=Cg(r,"utf-8");return await F.getParser(r).getDefinition({filePath:r,content:t},e)}catch{return null}}async function qx(r,e){await St.buildIndex(r);let t=await St.getDefinitionFiles(e,r);for(let o of t)if(o.startsWith(r)){let n=await Pg(o,e);if(n)return n}return null}async function Wx(r){let e=r.file,t=r.line,o=r.column,n=r.searchPath;if(!e)throw new Error("file is required");if(t===void 0)throw new Error("line is required");if(o===void 0)throw new Error("column is required");let s=await Fx(e,t,o);if(!s)return JSON.stringify({found:!1,message:`No symbol found at ${e}:${t}:${o}`},null,2);let i=await Pg(e,s);if(!i){let a=n||jx(e);Lx(a).isDirectory()&&(i=await qx(a,s))}return JSON.stringify(i?{found:!0,symbol:s,definition:i}:{found:!1,symbol:s,message:`Definition not found for symbol "${s}"`},null,2)}var Yo,li=h(()=>{"use strict";c();vg();he();Yo={name:yg,displayName:bg,description:wg,parameters:xg,category:Tg,execute:Wx}});var kg,Sg,Rg,_g,$g,Eg=h(()=>{"use strict";c();kg="coding.multi_file_edit",Sg="Multi-File Edit",Rg="Edit multiple files atomically with rollback on failure",_g="coding",$g={type:"object",properties:{edits:{type:"array",items:{type:"object",properties:{file:{type:"string"},changes:{type:"array",items:{type:"object",properties:{oldText:{type:"string"},newText:{type:"string"}}}}}},description:"Array of file edits, each with file path and array of text replacements"},atomic:{type:"boolean",description:"Atomic mode: rollback all edits if any fails (default: true)"}},required:["edits"]}});import{readFileSync as Ux,writeFileSync as Dg,existsSync as Gx}from"fs";async function Bx(r){let e=r.edits,t=r.atomic!==!1;if(!e||!Array.isArray(e)||e.length===0)throw new Error("edits array is required and must not be empty");for(let s of e){if(!s.file)throw new Error("Each edit must have a file property");if(!s.changes||!Array.isArray(s.changes))throw new Error("Each edit must have a changes array");if(!Gx(s.file))throw new Error(`File does not exist: ${s.file}`)}let o=[],n=[];try{for(let s of e){let i=Ux(s.file,"utf-8");t&&o.push({file:s.file,content:i});let a=i;for(let l of s.changes){if(!l.oldText)throw new Error("Each change must have oldText property");if(l.newText===void 0)throw new Error("Each change must have newText property");let p=(a.match(new RegExp(zx(l.oldText),"g"))||[]).length;if(p===0)throw new Error(`Text not found in ${s.file}: "${l.oldText.substring(0,50)}..."`);if(p>1)throw new Error(`Ambiguous replacement in ${s.file}: "${l.oldText.substring(0,50)}..." appears ${p} times`);a=a.replace(l.oldText,l.newText)}Dg(s.file,a,"utf-8"),n.push(s.file)}return JSON.stringify({success:!0,filesModified:n.length,files:n},null,2)}catch(s){if(t&&o.length>0){for(let i of o)try{Dg(i.file,i.content,"utf-8")}catch{}throw new Error(`Multi-file edit failed and rolled back: ${s.message}`)}throw new Error(`Multi-file edit failed: ${s.message}`)}}function zx(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Zo,ci=h(()=>{"use strict";c();Eg();Zo={name:kg,displayName:Sg,description:Rg,parameters:$g,category:_g,execute:Bx,confirmation:{level:"high",reason:"This will modify multiple source code files atomically.",showArgs:["edits"]}}});var Mg,Og,Ng,Ag,Ig,Lg=h(()=>{"use strict";c();Mg="coding.refactor_rename",Og="Refactor Rename",Ng="Rename a symbol across the entire codebase intelligently",Ag="coding",Ig={type:"object",properties:{symbol:{type:"string",description:"Current name of the symbol to rename"},newName:{type:"string",description:"New name for the symbol"},path:{type:"string",description:"Directory path to search and rename in"},dryRun:{type:"boolean",description:"Preview changes without applying them (default: false)"}},required:["symbol","newName","path"]}});import{readFileSync as Hx,writeFileSync as Kx,readdirSync as Jx}from"fs";import{join as Vx,extname as Qx}from"path";import{parse as Xx}from"@babel/parser";import*as pi from"@babel/traverse";function ev(r,e,t,o){let n=[];try{let s=Hx(r,"utf-8"),i=s.split(`
284
+ `),a=Xx(s,{sourceType:"module",plugins:["jsx","typescript","decorators-legacy","classProperties","objectRestSpread","optionalChaining","nullishCoalescingOperator"]}),l=[];if(Yx(a,{Identifier(p){if(p.node.name===e){let m=p.node.loc?.start.line||0,f=p.node.loc?.start.column||0;l.push({line:m,column:f,length:e.length}),n.push({file:r,line:m,column:f,oldName:e,newName:t})}}}),!o&&l.length>0){l.sort((m,f)=>m.line!==f.line?f.line-m.line:f.column-m.column);let p=[...i];for(let m of l){let f=m.line-1;if(f>=0&&f<p.length){let g=p[f],w=g.substring(0,m.column),b=g.substring(m.column+m.length);p[f]=w+t+b}}Kx(r,p.join(`
285
+ `),"utf-8")}}catch{}return{file:r,occurrences:n.length,changes:n}}function jg(r,e,t,o){let n=[];try{let s=Jx(r,{withFileTypes:!0});for(let i of s){let a=Vx(r,i.name);if(!(i.name==="node_modules"||i.name===".git"||i.name==="dist")){if(i.isDirectory())n.push(...jg(a,e,t,o));else if(i.isFile()&&Zx.includes(Qx(i.name))){let l=ev(a,e,t,o);l.occurrences>0&&n.push(l)}}}}catch{}return n}async function tv(r){let e=r.symbol,t=r.newName,o=r.path,n=r.dryRun===!0;if(!e)throw new Error("symbol is required");if(!t)throw new Error("newName is required");if(!o)throw new Error("path is required");if(e===t)throw new Error("New name must be different from old name");let s=jg(o,e,t,n),i=s.reduce((l,p)=>l+p.occurrences,0),a=s.length;return JSON.stringify({success:!0,dryRun:n,oldName:e,newName:t,filesAffected:a,totalOccurrences:i,changes:s},null,2)}var Yx,Zx,en,mi=h(()=>{"use strict";c();Lg();Yx=pi.default||pi,Zx=[".js",".jsx",".ts",".tsx",".mjs",".cjs"];en={name:Mg,displayName:Og,description:Ng,parameters:Ig,category:Ag,execute:tv,confirmation:{level:"high",reason:"This will rename a symbol across multiple files, rewriting source code without backup.",showArgs:["symbol","newName"]}}});var Fg,qg,Wg,Ug,Gg,Bg=h(()=>{"use strict";c();Fg="coding.get_outline",qg="Get File Outline",Wg="Gets a hierarchical outline of symbols (classes, functions, methods) in a specified file.",Ug="coding",Gg={type:"object",properties:{file:{type:"string",description:"The absolute path to the file to outline"}},required:["file"]}});import{readFileSync as ov,statSync as nv}from"fs";async function rv(r){let e=r.file;if(y(`[coding.get-outline] execute file="${e}"`),!e)throw new Error("file is required");try{if(!nv(e).isFile())throw new Error(`Path is not a file: ${e}`)}catch{throw new Error(`File not found: ${e}`)}try{let t=ov(e,"utf-8"),o=F.getParser(e);if(!o.getOutline)return JSON.stringify({file:e,error:"Outline extraction is not specifically implemented for this language yet."});let n=await o.getOutline({filePath:e,content:t});return JSON.stringify({file:e,outline:n},null,2)}catch(t){throw new Error(`Failed to safely extract outline from file "${e}": ${t.message}`)}}var tn,di=h(()=>{"use strict";c();Bg();he();k();tn={name:Fg,displayName:qg,description:Wg,parameters:Gg,category:Ug,execute:rv}});var zg,Hg,Kg,Jg,Vg,Qg=h(()=>{"use strict";c();zg="coding.get_diagnostics",Hg="Get File Diagnostics",Kg="Gets syntax errors and warnings for a file utilizing AST parsing.",Jg="coding",Vg={type:"object",properties:{file:{type:"string",description:"The absolute path to the file to check for diagnostics"}},required:["file"]}});import{readFileSync as sv,statSync as iv}from"fs";async function av(r){let e=r.file;if(!e)throw new Error("file is required");try{if(!iv(e).isFile())throw new Error(`Path is not a file: ${e}`)}catch{throw new Error(`File not found: ${e}`)}try{let t=sv(e,"utf-8"),o=F.getParser(e);if(!o.getDiagnostics)return JSON.stringify({file:e,error:"Diagnostics extraction is not specifically implemented for this language yet."});let n=await o.getDiagnostics({filePath:e,content:t});return JSON.stringify({file:e,diagnostics:n},null,2)}catch(t){throw new Error(`Failed to get diagnostics from file "${e}": ${t.message}`)}}var on,ui=h(()=>{"use strict";c();Qg();he();on={name:zg,displayName:Hg,description:Kg,parameters:Vg,category:Jg,execute:av}});var Xg,Yg,Zg,eh,th,oh=h(()=>{"use strict";c();Xg="coding.get_exports",Yg="Get File Exports",Zg="Lists all symbols exported by a file.",eh="coding",th={type:"object",properties:{file:{type:"string",description:"The absolute path to the file"}},required:["file"]}});import{readFileSync as lv,statSync as cv}from"fs";async function pv(r){let e=r.file;if(y(`[coding.get-exports] execute file="${e}"`),!e)throw new Error("file is required");try{if(!cv(e).isFile())throw new Error(`Path is not a file: ${e}`)}catch{throw new Error(`File not found: ${e}`)}try{let t=lv(e,"utf-8"),o=F.getParser(e);if(!o.getExports)return JSON.stringify({file:e,error:"Exports extraction is not specifically implemented for this language yet."});let n=await o.getExports({filePath:e,content:t});return JSON.stringify({file:e,exports:n},null,2)}catch(t){throw new Error(`Failed to extract exports from file "${e}": ${t.message}`)}}var nn,fi=h(()=>{"use strict";c();oh();he();k();nn={name:Xg,displayName:Yg,description:Zg,parameters:th,category:eh,execute:pv}});var nh,rh,sh,ih,ah,lh=h(()=>{"use strict";c();nh="coding.extract_function",rh="Extract Function",sh="Extracts a selected code region into a new function, automatically detecting required parameters and return values.",ih="coding",ah={type:"object",properties:{file:{type:"string",description:"The absolute path to the file"},startLine:{type:"number",description:"1-indexed start line of the code to extract"},startColumn:{type:"number",description:"0-indexed start column of the code to extract"},endLine:{type:"number",description:"1-indexed end line of the code to extract"},endColumn:{type:"number",description:"0-indexed end column of the code to extract"},newFunctionName:{type:"string",description:"The name for the newly extracted function"}},required:["file","startLine","startColumn","endLine","endColumn","newFunctionName"]}});import{readFileSync as mv,statSync as dv}from"fs";async function uv(r){let e=r.file,t=r.startLine,o=r.startColumn,n=r.endLine,s=r.endColumn,i=r.newFunctionName;if(!e)throw new Error("file is required");if(t===void 0)throw new Error("startLine is required");if(o===void 0)throw new Error("startColumn is required");if(n===void 0)throw new Error("endLine is required");if(s===void 0)throw new Error("endColumn is required");if(!i)throw new Error("newFunctionName is required");try{if(!dv(e).isFile())throw new Error(`Path is not a file: ${e}`)}catch{throw new Error(`File not found: ${e}`)}try{let a=mv(e,"utf-8"),l=F.getParser(e);if(!l.extractFunction)return JSON.stringify({file:e,error:"Function extraction is not specifically implemented for this language yet."});let p=await l.extractFunction({filePath:e,content:a},t,o,n,s,i);return JSON.stringify({file:e,result:p},null,2)}catch(a){throw new Error(`Failed to extract function from file "${e}": ${a.message}`)}}var rn,gi=h(()=>{"use strict";c();lh();he();rn={name:nh,displayName:rh,description:sh,parameters:ah,category:ih,execute:uv}});var ch,ph,mh,dh,uh,fh=h(()=>{"use strict";c();ch="coding.get_call_hierarchy",ph="Get Call Hierarchy",mh="Shows callers and callees of a specific function or method.",dh="coding",uh={type:"object",properties:{file:{type:"string",description:"The absolute path to the file containing the function"},line:{type:"number",description:"1-indexed line number where the function is defined or called"},column:{type:"number",description:"0-indexed column number where the function is defined or called"}},required:["file","line","column"]}});import{readFileSync as fv,statSync as gv}from"fs";async function hv(r){let e=r.file,t=r.line,o=r.column;if(!e)throw new Error("file is required");if(t===void 0)throw new Error("line is required");if(o===void 0)throw new Error("column is required");try{if(!gv(e).isFile())throw new Error(`Path is not a file: ${e}`)}catch{throw new Error(`File not found: ${e}`)}try{let n=fv(e,"utf-8"),s=F.getParser(e);if(!s.getCallHierarchy)return JSON.stringify({file:e,error:"Call hierarchy is not specifically implemented for this language yet."});let i=await s.getCallHierarchy({filePath:e,content:n},t,o);return JSON.stringify({file:e,hierarchy:i},null,2)}catch(n){throw new Error(`Failed to get call hierarchy from file "${e}": ${n.message}`)}}var sn,hi=h(()=>{"use strict";c();fh();he();sn={name:ch,displayName:ph,description:mh,parameters:uh,category:dh,execute:hv}});var hh={};ue(hh,{codingExtractFunctionTool:()=>rn,codingFindReferencesTool:()=>Xo,codingFindSymbolTool:()=>Jo,codingGetCallHierarchyTool:()=>sn,codingGetDiagnosticsTool:()=>on,codingGetExportsTool:()=>nn,codingGetImportsTool:()=>Qo,codingGetOutlineTool:()=>tn,codingGetSymbolsTool:()=>Vo,codingGoToDefinitionTool:()=>Yo,codingMultiFileEditTool:()=>Zo,codingRefactorRenameTool:()=>en,codingToolsProject:()=>gh});var gh,yi=h(()=>{"use strict";c();ri();si();ii();ai();li();ci();mi();di();ui();fi();gi();hi();ri();si();ii();ai();li();ci();mi();di();ui();fi();gi();hi();gh={manifest:{key:"coding",name:"coding-tools",displayName:"Code Intelligence",version:"1.0.0",description:"AST-aware code intelligence tools for finding symbols, references, and analyzing code structure.",author:"Sajeer",tools:["coding.find_symbol","coding.get_symbols","coding.get_imports","coding.find_references","coding.go_to_definition","coding.get_outline","coding.get_diagnostics","coding.get_exports","coding.extract_function","coding.get_call_hierarchy","coding.multi_file_edit","coding.refactor_rename"],category:"coding"},tools:[Jo,Vo,Qo,Xo,Yo,tn,on,nn,rn,sn,Zo,en],dependencies:{"@babel/parser":"^7.24.0","@babel/traverse":"^7.24.0","@babel/types":"^7.24.0"}}});var yh,bh=h(()=>{"use strict";c();yh={type:"object",properties:{path:{type:"string",description:"Optional path or directory to check the status for. If omitted, checks the entire repository."}}}});import{simpleGit as yv}from"simple-git";function G(r){let e={baseDir:r||process.cwd(),binary:"git",maxConcurrentProcesses:6};return yv(e)}var ke=h(()=>{"use strict";c()});var Bn,wh=h(()=>{"use strict";c();bh();ke();Bn={name:"git.status",displayName:"Git Status",description:"Get the working tree status, including modified, staged, and untracked files.",category:"version-control",parameters:yh,execute:async r=>{let e=r.path;try{let o=await G().status(e?[e]:[]);if(o.isClean())return"Working tree clean";let n=[];return n.push(`Branch: ${o.current}`),o.tracking&&n.push(`Tracking: ${o.tracking}`),o.ahead>0&&n.push(`Ahead: ${o.ahead}`),o.behind>0&&n.push(`Behind: ${o.behind}`),n.push("---"),o.conflicted.length>0&&n.push(`Conflicted: ${o.conflicted.join(", ")}`),o.created.length>0&&n.push(`Created: ${o.created.join(", ")}`),o.deleted.length>0&&n.push(`Deleted: ${o.deleted.join(", ")}`),o.modified.length>0&&n.push(`Modified: ${o.modified.join(", ")}`),o.renamed.length>0&&n.push(`Renamed: ${o.renamed.map(s=>`${s.from} -> ${s.to}`).join(", ")}`),o.staged.length>0&&n.push(`Staged: ${o.staged.join(", ")}`),o.not_added.length>0&&n.push(`Untracked: ${o.not_added.join(", ")}`),n.join(`
286
+ `)}catch(t){return`Error getting git status: ${t instanceof Error?t.message:String(t)}`}}}});var Th,xh=h(()=>{"use strict";c();Th={type:"object",properties:{path:{type:"string",description:"Optional path to get the diff for. If omitted, gets the diff for the entire repository."},base:{type:"string",description:"Optional base commit/ref for comparing two revisions. When used with head, runs git diff base...head."},head:{type:"string",description:"Optional head commit/ref for comparing two revisions. When used with base, runs git diff base...head."},staged:{type:"boolean",description:"If true, gets the diff of staged changes instead of unstaged changes.",default:!1},cloneDir:{type:"string",description:"Optional local repository directory, typically the cloneDir returned by git.clone. When provided, this tool runs in that repository instead of the current working directory."}}}});var zn,vh=h(()=>{"use strict";c();xh();ke();zn={name:"git.diff",displayName:"Git Diff",description:"Show changes between commits, commit and working tree, etc.",category:"version-control",parameters:Th,execute:async r=>{let e=r.path,t=r.base,o=r.head,n=r.staged,s=r.cloneDir;try{let i=G(s),a=[];if(t||o){if(!t||!o)return"Error getting git diff: both base and head are required when comparing revisions.";a.push(`${t}...${o}`)}n&&a.push("--cached"),e&&a.push("--",e);let l=await i.diff(a);return l||"No changes found."}catch(i){return`Error getting git diff: ${i instanceof Error?i.message:String(i)}`}}}});var Ch,Ph=h(()=>{"use strict";c();Ch={type:"object",properties:{maxCount:{type:"number",description:"Maximum number of commits to return. Defaults to 10 to prevent large outputs.",default:10},path:{type:"string",description:"Optional path to get the log for specific file or directory."},cloneDir:{type:"string",description:"Optional local repository directory, typically the cloneDir returned by git.clone. When provided, this tool runs in that repository instead of the current working directory."}}}});var Hn,kh=h(()=>{"use strict";c();Ph();ke();Hn={name:"git.log",displayName:"Git Log",description:"Show commit logs.",category:"version-control",parameters:Ch,execute:async r=>{let e=r.maxCount||10,t=r.path,o=r.cloneDir;try{let n=G(o),s={maxCount:e};t&&(s.file=t);let i=await n.log(s);return i.all.length===0?"No commits found.":i.all.map(a=>`Commit: ${a.hash}
287
287
  Author: ${a.author_name} <${a.author_email}>
288
288
  Date: ${a.date}
289
289
  Message: ${a.message}
290
290
  `).join(`---
291
- `)}catch(n){return`Error getting git log: ${n instanceof Error?n.message:String(n)}`}}}});var kh,Ph=h(()=>{"use strict";l();kh={type:"object",properties:{path:{type:"string",description:"Path to the file or directory to stage. To stage all changes, use '.'."}},required:["path"]}});var Hn,Sh=h(()=>{"use strict";l();Ph();Ce();Hn={name:"git.add",displayName:"Git Add",description:"Add file contents to the index (stage changes).",category:"version-control",parameters:kh,execute:async r=>{let e=r.path;try{return await U().add(e),`Successfully staged changes for: ${e}`}catch(t){return`Error staging changes: ${t instanceof Error?t.message:String(t)}`}}}});var Rh,_h=h(()=>{"use strict";l();Rh={type:"object",properties:{message:{type:"string",description:"The commit message."}},required:["message"]}});var Kn,$h=h(()=>{"use strict";l();_h();Ce();Kn={name:"git.commit",displayName:"Git Commit",description:"Record changes to the repository.",category:"version-control",parameters:Rh,execute:async r=>{let e=r.message;try{let o=await U().commit(e);return o.commit?`Successfully committed changes.
291
+ `)}catch(n){return`Error getting git log: ${n instanceof Error?n.message:String(n)}`}}}});var Sh,Rh=h(()=>{"use strict";c();Sh={type:"object",properties:{path:{type:"string",description:"Path to the file or directory to stage. To stage all changes, use '.'."}},required:["path"]}});var Kn,_h=h(()=>{"use strict";c();Rh();ke();Kn={name:"git.add",displayName:"Git Add",description:"Add file contents to the index (stage changes).",category:"version-control",parameters:Sh,execute:async r=>{let e=r.path;try{return await G().add(e),`Successfully staged changes for: ${e}`}catch(t){return`Error staging changes: ${t instanceof Error?t.message:String(t)}`}}}});var $h,Eh=h(()=>{"use strict";c();$h={type:"object",properties:{message:{type:"string",description:"The commit message."}},required:["message"]}});var Jn,Dh=h(()=>{"use strict";c();Eh();ke();Jn={name:"git.commit",displayName:"Git Commit",description:"Record changes to the repository.",category:"version-control",parameters:$h,execute:async r=>{let e=r.message;try{let o=await G().commit(e);return o.commit?`Successfully committed changes.
292
292
  Commit: ${o.commit}
293
293
  Branch: ${o.branch}
294
- Summary: ${o.summary.changes} changes, ${o.summary.insertions} insertions, ${o.summary.deletions} deletions.`:"Nothing to commit."}catch(t){return`Error committing changes: ${t instanceof Error?t.message:String(t)}`}},confirmation:{level:"medium",reason:"This will create a permanent commit in the repository history.",showArgs:["message"]}}});var Eh,Dh=h(()=>{"use strict";l();Eh={type:"object",properties:{path:{type:"string",description:"Path to the file to blame."},sha:{type:"string",description:"Optional commit SHA or ref to blame at. If omitted, blames the current checkout."},cloneDir:{type:"string",description:"Optional local repository directory, typically the cloneDir returned by git.clone. When provided, this tool runs in that repository instead of the current working directory."}},required:["path"]}});var Jn,Mh=h(()=>{"use strict";l();Dh();Ce();Jn={name:"git.blame",displayName:"Git Blame",description:"Show what revision and author last modified each line of a file.",category:"version-control",parameters:Eh,execute:async r=>{let e=r.path,t=r.sha,o=r.cloneDir;try{let n=U(o),s=["blame"];return t&&s.push(t),s.push("--",e),await n.raw(s)}catch(n){return`Error running git blame: ${n instanceof Error?n.message:String(n)}`}}}});var Oh,Nh=h(()=>{"use strict";l();Oh={type:"object",properties:{remote:{type:"boolean",description:"List remote branches as well.",default:!1}}}});var Vn,Ah=h(()=>{"use strict";l();Nh();Ce();Vn={name:"git.branch_list",displayName:"Git Branch List",description:"List all branches.",category:"version-control",parameters:Oh,execute:async r=>{let e=r.remote;try{let t=U(),o=e?["-a"]:[],n=await t.branch(o);return`Current Branch: ${n.current}
294
+ Summary: ${o.summary.changes} changes, ${o.summary.insertions} insertions, ${o.summary.deletions} deletions.`:"Nothing to commit."}catch(t){return`Error committing changes: ${t instanceof Error?t.message:String(t)}`}},confirmation:{level:"medium",reason:"This will create a permanent commit in the repository history.",showArgs:["message"]}}});var Mh,Oh=h(()=>{"use strict";c();Mh={type:"object",properties:{path:{type:"string",description:"Path to the file to blame."},sha:{type:"string",description:"Optional commit SHA or ref to blame at. If omitted, blames the current checkout."},cloneDir:{type:"string",description:"Optional local repository directory, typically the cloneDir returned by git.clone. When provided, this tool runs in that repository instead of the current working directory."}},required:["path"]}});var Vn,Nh=h(()=>{"use strict";c();Oh();ke();Vn={name:"git.blame",displayName:"Git Blame",description:"Show what revision and author last modified each line of a file.",category:"version-control",parameters:Mh,execute:async r=>{let e=r.path,t=r.sha,o=r.cloneDir;try{let n=G(o),s=["blame"];return t&&s.push(t),s.push("--",e),await n.raw(s)}catch(n){return`Error running git blame: ${n instanceof Error?n.message:String(n)}`}}}});var Ah,Ih=h(()=>{"use strict";c();Ah={type:"object",properties:{remote:{type:"boolean",description:"List remote branches as well.",default:!1}}}});var Qn,Lh=h(()=>{"use strict";c();Ih();ke();Qn={name:"git.branch_list",displayName:"Git Branch List",description:"List all branches.",category:"version-control",parameters:Ah,execute:async r=>{let e=r.remote;try{let t=G(),o=e?["-a"]:[],n=await t.branch(o);return`Current Branch: ${n.current}
295
295
 
296
296
  Branches:
297
297
  ${n.all.join(`
298
- `)}`}catch(t){return`Error listing branches: ${t instanceof Error?t.message:String(t)}`}}}});var Ih,Lh=h(()=>{"use strict";l();Ih={type:"object",properties:{name:{type:"string",description:"Name of the new branch."},checkout:{type:"boolean",description:"Whether to checkout the new branch after creating it.",default:!1},startPoint:{type:"string",description:"Optional start point (commit hash or branch name) for the new branch."}},required:["name"]}});var Qn,jh=h(()=>{"use strict";l();Lh();Ce();Qn={name:"git.branch_create",displayName:"Git Branch Create",description:"Create a new branch.",category:"version-control",parameters:Ih,execute:async r=>{let e=r.name,t=r.checkout,o=r.startPoint;try{let n=U();return t?(o?await n.checkoutBranch(e,o):await n.checkoutLocalBranch(e),`Successfully created and switched to branch: ${e}`):(o?await n.branch([e,o]):await n.branch([e]),`Successfully created branch: ${e}`)}catch(n){return`Error creating branch: ${n instanceof Error?n.message:String(n)}`}}}});var Fh,qh=h(()=>{"use strict";l();Fh={type:"object",properties:{branch:{type:"string",description:"Name of the branch or commit to checkout."}},required:["branch"]}});var Xn,Wh=h(()=>{"use strict";l();qh();Ce();Xn={name:"git.checkout",displayName:"Git Checkout",description:"Switch branches or restore working tree files.",category:"version-control",parameters:Fh,execute:async r=>{let e=r.branch;try{return await U().checkout(e),`Successfully checked out: ${e}`}catch(t){return`Error checking out branch: ${t instanceof Error?t.message:String(t)}`}},confirmation:{level:"medium",reason:"This will switch branches, potentially losing uncommitted changes.",showArgs:["branch"]}}});var Uh,Gh=h(()=>{"use strict";l();Uh={type:"object",properties:{repo:{type:"string",description:'The repository to clone in "owner/repo" format (e.g., "microsoft/typescript").'},sha:{type:"string",description:"The commit SHA to checkout (always use SHAs, never branch names \u2014 handles force-pushes correctly)."},filter:{type:"string",description:'Git partial clone filter. "blob:none" (default) skips file blobs for a fast clone \u2014 blobs are fetched on demand when you read files or run git blame. Use "none" when you need immediate access to all file contents without extra fetches (e.g. heavy blame across many files).',default:"blob:none"},depth:{type:"number",description:"Commit history depth. Default 50 is enough for most PR reviews. Use 0 for full history when you need complete git log or blame across a long-lived file.",default:50},cloneRoot:{type:"string",description:"Override the local directory where clones are stored. Leave unset in almost all cases \u2014 the default is managed automatically."}},required:["repo","sha"]}});import*as ie from"fs/promises";import*as Zn from"path";async function bv(r){for(;Yn.has(r);)await Yn.get(r);let e,t=new Promise(o=>{e=o});return Yn.set(r,t),()=>{Yn.delete(r),e()}}async function Bh(r){let e=0,t=await ie.readdir(r,{withFileTypes:!0});for(let o of t){let n=Zn.join(r,o.name);if(o.isDirectory())e+=await Bh(n);else if(o.isFile()){let s=await ie.stat(n);e+=s.size}}return e}async function wv(r,e){let t=e-r;for(;We>t&&Ue.size>0;){let o=null,n=null;for(let[s,i]of Ue)(!o||i.lastAccessedAt<o.lastAccessedAt)&&(o=i,n=s);if(!n||!o)break;try{await ie.rm(o.cloneDir,{recursive:!0,force:!0}),We=Math.max(0,We-o.sizeBytes),Ue.delete(n)}catch{break}}}async function Tv(r,e,t,o,n){let i=`https://x-access-token:${await G(r)}@github.com/${r}.git`,a=r.replace("/","_"),c=Zn.resolve(n,a),p=U(n),m=Ue.get(r);if(m)try{if(await ie.access(c),m.sha===e)return m.lastAccessedAt=Date.now(),c;await ie.rm(c,{recursive:!0,force:!0}),We=Math.max(0,We-m.sizeBytes),Ue.delete(r)}catch{We=Math.max(0,We-m.sizeBytes),Ue.delete(r)}else try{await ie.access(c),await ie.rm(c,{recursive:!0,force:!0})}catch{}let f=["--no-checkout"];o>0&&f.push("--depth",o.toString()),t&&t!=="none"&&f.push("--filter",t);try{await p.clone(i,a,f);let g=U(c);try{let b=["origin",e];o>0&&b.push("--depth",o.toString()),await g.fetch(b)}catch{}await g.checkout(["--force",e]);let w=await Bh(c);return We+=w,Ue.set(r,{cloneDir:c,repo:r,sha:e,sizeBytes:w,lastAccessedAt:Date.now()}),c}catch(g){try{await ie.rm(c,{recursive:!0,force:!0})}catch{}throw g}}function xv(r){return(r instanceof Error?r.message:String(r)).replace(/x-access-token:[^@]+@/g,"x-access-token:***@")}var hv,yv,Ue,Yn,We,er,zh=h(()=>{"use strict";l();Gh();Ce();xe();hv=".toolpack/clones",yv=5e9,Ue=new Map,Yn=new Map,We=0;er={name:"git.clone",displayName:"Git Clone",description:"Clone a GitHub repository at a specific commit SHA for local inspection. Call this before using git.diff, git.blame, git.log, fs.*, or coding.* tools \u2014 those tools accept the returned cloneDir to operate locally instead of through the GitHub API. Repeated calls with the same repo+sha are instant (cached). Disk is managed automatically with LRU eviction.",category:"version-control",parameters:Uh,execute:async r=>{let e=r.repo,t=r.sha,o=r.filter??"blob:none",n=r.depth??50,s=r.cloneRoot??process.env.SENTINEL_CLONE_ROOT??hv,i=parseInt(process.env.SENTINEL_CLONE_MAX_BYTES??"0",10)||yv;if(!/^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/.test(e))return'Error: repo must be in "owner/repo" format with alphanumeric, hyphens, underscores, or dots only (e.g., "microsoft/typescript")';if(!/^[a-f0-9]{7,40}$/i.test(t))return"Error: sha must be a valid commit SHA (7-40 hex characters)";await ie.mkdir(s,{recursive:!0});let c=await bv(e);try{let p=Ue.get(e);if(p&&p.sha===t)return p.lastAccessedAt=Date.now(),JSON.stringify({cloneDir:p.cloneDir,next:"Pass cloneDir to compatible git, filesystem, or coding tools to inspect this checkout."});await wv(1e8,i);let m=await Tv(e,t,o,n,s);return JSON.stringify({cloneDir:m,next:"Pass cloneDir to compatible git, filesystem, or coding tools to inspect this checkout."})}catch(p){return`Error cloning repository: ${xv(p)}`}finally{c()}}}});var Kh={};le(Kh,{gitAddTool:()=>Hn,gitBlameTool:()=>Jn,gitBranchCreateTool:()=>Qn,gitBranchListTool:()=>Vn,gitCheckoutTool:()=>Xn,gitCloneTool:()=>er,gitCommitTool:()=>Kn,gitDiffTool:()=>Bn,gitLogTool:()=>zn,gitStatusTool:()=>Gn,gitToolsProject:()=>Hh});var Hh,yi=h(()=>{"use strict";l();yh();Th();Ch();Sh();$h();Mh();Ah();jh();Wh();zh();Hh={manifest:{key:"git",name:"git-tools",displayName:"Git Version Control",version:"1.0.0",description:"Git operations for reading repository state, checking diffs, creating commits, and managing branches.",author:"Sajeer",tools:["git.status","git.diff","git.log","git.add","git.commit","git.blame","git.branch_list","git.branch_create","git.checkout","git.clone"],category:"version-control"},tools:[Gn,Bn,zn,Hn,Kn,Jn,Vn,Qn,Xn,er],dependencies:{"simple-git":"^3.27.0"}}});var Jh,Vh=h(()=>{"use strict";l();Jh={type:"object",properties:{oldContent:{type:"string",description:"The original text content."},newContent:{type:"string",description:"The new text content."},fileName:{type:"string",description:"Optional filename to include in the patch header."},contextLines:{type:"number",description:"Number of context lines to include around differences. Default is 4.",default:4}},required:["oldContent","newContent"]}});import*as Qh from"diff";var tr,Xh=h(()=>{"use strict";l();Vh();k();tr={name:"diff.create",displayName:"Create Diff",description:"Generate a unified diff from two text contents.",category:"diff",parameters:Jh,execute:async r=>{let e=r.oldContent,t=r.newContent,o=r.fileName||"file",n=r.contextLines??4;y(`[diff.create] execute fileName="${o}" contextLines=${n}`);try{return Qh.createPatch(o,e,t,"","",{context:n})}catch(s){return`Error creating diff: ${s instanceof Error?s.message:String(s)}`}}}});var Yh,Zh=h(()=>{"use strict";l();Yh={type:"object",properties:{path:{type:"string",description:"Path to the file to patch."},patch:{type:"string",description:"Unified diff string to apply."}},required:["path","patch"]}});import*as ty from"diff";import{promises as ey}from"fs";var or,oy=h(()=>{"use strict";l();Zh();k();or={name:"diff.apply",displayName:"Apply Diff",description:"Apply a unified diff patch to a file.",category:"diff",parameters:Yh,execute:async r=>{let e=r.path,t=r.patch;y(`[diff.apply] execute path="${e}"`);try{let o=await ey.readFile(e,"utf8"),n=ty.applyPatch(o,t);return n===!1?"Failed to apply patch. The patch may be malformed or conflicting with the current file content.":(await ey.writeFile(e,n,"utf8"),`Successfully applied patch to ${e}`)}catch(o){return`Error applying patch: ${o instanceof Error?o.message:String(o)}`}},confirmation:{level:"high",reason:"This will apply a patch to files, which may corrupt them if the patch doesn't match.",showArgs:["path"]}}});var ny,ry=h(()=>{"use strict";l();ny={type:"object",properties:{path:{type:"string",description:"Path to the file to apply the patch against for preview."},patch:{type:"string",description:"Unified diff string to preview."}},required:["path","patch"]}});import*as sy from"diff";import{promises as vv}from"fs";var nr,iy=h(()=>{"use strict";l();ry();nr={name:"diff.preview",displayName:"Preview Diff",description:"Preview the result of applying a patch to a file without modifying it.",category:"diff",parameters:ny,execute:async r=>{let e=r.path,t=r.patch;try{let o=await vv.readFile(e,"utf8"),n=sy.applyPatch(o,t);return n===!1?"Patch preview failed. The patch would not apply cleanly.":`Preview of ${e} after patch:
298
+ `)}`}catch(t){return`Error listing branches: ${t instanceof Error?t.message:String(t)}`}}}});var jh,Fh=h(()=>{"use strict";c();jh={type:"object",properties:{name:{type:"string",description:"Name of the new branch."},checkout:{type:"boolean",description:"Whether to checkout the new branch after creating it.",default:!1},startPoint:{type:"string",description:"Optional start point (commit hash or branch name) for the new branch."}},required:["name"]}});var Xn,qh=h(()=>{"use strict";c();Fh();ke();Xn={name:"git.branch_create",displayName:"Git Branch Create",description:"Create a new branch.",category:"version-control",parameters:jh,execute:async r=>{let e=r.name,t=r.checkout,o=r.startPoint;try{let n=G();return t?(o?await n.checkoutBranch(e,o):await n.checkoutLocalBranch(e),`Successfully created and switched to branch: ${e}`):(o?await n.branch([e,o]):await n.branch([e]),`Successfully created branch: ${e}`)}catch(n){return`Error creating branch: ${n instanceof Error?n.message:String(n)}`}}}});var Wh,Uh=h(()=>{"use strict";c();Wh={type:"object",properties:{branch:{type:"string",description:"Name of the branch or commit to checkout."}},required:["branch"]}});var Yn,Gh=h(()=>{"use strict";c();Uh();ke();Yn={name:"git.checkout",displayName:"Git Checkout",description:"Switch branches or restore working tree files.",category:"version-control",parameters:Wh,execute:async r=>{let e=r.branch;try{return await G().checkout(e),`Successfully checked out: ${e}`}catch(t){return`Error checking out branch: ${t instanceof Error?t.message:String(t)}`}},confirmation:{level:"medium",reason:"This will switch branches, potentially losing uncommitted changes.",showArgs:["branch"]}}});var Bh,zh=h(()=>{"use strict";c();Bh={type:"object",properties:{repo:{type:"string",description:'The repository to clone in "owner/repo" format (e.g., "microsoft/typescript").'},sha:{type:"string",description:"The commit SHA to checkout (always use SHAs, never branch names \u2014 handles force-pushes correctly)."},filter:{type:"string",description:'Git partial clone filter. "blob:none" (default) skips file blobs for a fast clone \u2014 blobs are fetched on demand when you read files or run git blame. Use "none" when you need immediate access to all file contents without extra fetches (e.g. heavy blame across many files).',default:"blob:none"},depth:{type:"number",description:"Commit history depth. Default 50 is enough for most PR reviews. Use 0 for full history when you need complete git log or blame across a long-lived file.",default:50},cloneRoot:{type:"string",description:"Override the local directory where clones are stored. Leave unset in almost all cases \u2014 the default is managed automatically."}},required:["repo","sha"]}});import*as me from"fs/promises";import*as er from"path";async function Tv(r){for(;Zn.has(r);)await Zn.get(r);let e,t=new Promise(o=>{e=o});return Zn.set(r,t),()=>{Zn.delete(r),e()}}async function Hh(r){let e=0,t=await me.readdir(r,{withFileTypes:!0});for(let o of t){let n=er.join(r,o.name);if(o.isDirectory())e+=await Hh(n);else if(o.isFile()){let s=await me.stat(n);e+=s.size}}return e}async function xv(r,e){let t=e-r;for(;We>t&&Ue.size>0;){let o=null,n=null;for(let[s,i]of Ue)(!o||i.lastAccessedAt<o.lastAccessedAt)&&(o=i,n=s);if(!n||!o)break;try{await me.rm(o.cloneDir,{recursive:!0,force:!0}),We=Math.max(0,We-o.sizeBytes),Ue.delete(n)}catch{break}}}async function vv(r,e,t,o,n){let i=`https://x-access-token:${await B(r)}@github.com/${r}.git`,a=r.replace("/","_"),l=er.resolve(n,a),p=G(n),m=Ue.get(r);if(m)try{if(await me.access(l),m.sha===e)return m.lastAccessedAt=Date.now(),l;await me.rm(l,{recursive:!0,force:!0}),We=Math.max(0,We-m.sizeBytes),Ue.delete(r)}catch{We=Math.max(0,We-m.sizeBytes),Ue.delete(r)}else try{await me.access(l),await me.rm(l,{recursive:!0,force:!0})}catch{}let f=["--no-checkout"];o>0&&f.push("--depth",o.toString()),t&&t!=="none"&&f.push("--filter",t);try{await p.clone(i,a,f);let g=G(l);try{let b=["origin",e];o>0&&b.push("--depth",o.toString()),await g.fetch(b)}catch{}await g.checkout(["--force",e]);let w=await Hh(l);return We+=w,Ue.set(r,{cloneDir:l,repo:r,sha:e,sizeBytes:w,lastAccessedAt:Date.now()}),l}catch(g){try{await me.rm(l,{recursive:!0,force:!0})}catch{}throw g}}function Cv(r){return(r instanceof Error?r.message:String(r)).replace(/x-access-token:[^@]+@/g,"x-access-token:***@")}var bv,wv,Ue,Zn,We,tr,Kh=h(()=>{"use strict";c();zh();ke();Ce();bv=".toolpack/clones",wv=5e9,Ue=new Map,Zn=new Map,We=0;tr={name:"git.clone",displayName:"Git Clone",description:"Clone a GitHub repository at a specific commit SHA for local inspection. Call this before using git.diff, git.blame, git.log, fs.*, or coding.* tools \u2014 those tools accept the returned cloneDir to operate locally instead of through the GitHub API. Repeated calls with the same repo+sha are instant (cached). Disk is managed automatically with LRU eviction.",category:"version-control",parameters:Bh,execute:async r=>{let e=r.repo,t=r.sha,o=r.filter??"blob:none",n=r.depth??50,s=r.cloneRoot??process.env.SENTINEL_CLONE_ROOT??bv,i=parseInt(process.env.SENTINEL_CLONE_MAX_BYTES??"0",10)||wv;if(!/^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/.test(e))return'Error: repo must be in "owner/repo" format with alphanumeric, hyphens, underscores, or dots only (e.g., "microsoft/typescript")';if(!/^[a-f0-9]{7,40}$/i.test(t))return"Error: sha must be a valid commit SHA (7-40 hex characters)";await me.mkdir(s,{recursive:!0});let l=await Tv(e);try{let p=Ue.get(e);if(p&&p.sha===t)return p.lastAccessedAt=Date.now(),JSON.stringify({cloneDir:p.cloneDir,next:"Pass cloneDir to compatible git, filesystem, or coding tools to inspect this checkout."});await xv(1e8,i);let m=await vv(e,t,o,n,s);return JSON.stringify({cloneDir:m,next:"Pass cloneDir to compatible git, filesystem, or coding tools to inspect this checkout."})}catch(p){return`Error cloning repository: ${Cv(p)}`}finally{l()}}}});var Vh={};ue(Vh,{gitAddTool:()=>Kn,gitBlameTool:()=>Vn,gitBranchCreateTool:()=>Xn,gitBranchListTool:()=>Qn,gitCheckoutTool:()=>Yn,gitCloneTool:()=>tr,gitCommitTool:()=>Jn,gitDiffTool:()=>zn,gitLogTool:()=>Hn,gitStatusTool:()=>Bn,gitToolsProject:()=>Jh});var Jh,bi=h(()=>{"use strict";c();wh();vh();kh();_h();Dh();Nh();Lh();qh();Gh();Kh();Jh={manifest:{key:"git",name:"git-tools",displayName:"Git Version Control",version:"1.0.0",description:"Git operations for reading repository state, checking diffs, creating commits, and managing branches.",author:"Sajeer",tools:["git.status","git.diff","git.log","git.add","git.commit","git.blame","git.branch_list","git.branch_create","git.checkout","git.clone"],category:"version-control"},tools:[Bn,zn,Hn,Kn,Jn,Vn,Qn,Xn,Yn,tr],dependencies:{"simple-git":"^3.27.0"}}});var Qh,Xh=h(()=>{"use strict";c();Qh={type:"object",properties:{oldContent:{type:"string",description:"The original text content."},newContent:{type:"string",description:"The new text content."},fileName:{type:"string",description:"Optional filename to include in the patch header."},contextLines:{type:"number",description:"Number of context lines to include around differences. Default is 4.",default:4}},required:["oldContent","newContent"]}});import*as Yh from"diff";var or,Zh=h(()=>{"use strict";c();Xh();k();or={name:"diff.create",displayName:"Create Diff",description:"Generate a unified diff from two text contents.",category:"diff",parameters:Qh,execute:async r=>{let e=r.oldContent,t=r.newContent,o=r.fileName||"file",n=r.contextLines??4;y(`[diff.create] execute fileName="${o}" contextLines=${n}`);try{return Yh.createPatch(o,e,t,"","",{context:n})}catch(s){return`Error creating diff: ${s instanceof Error?s.message:String(s)}`}}}});var ey,ty=h(()=>{"use strict";c();ey={type:"object",properties:{path:{type:"string",description:"Path to the file to patch."},patch:{type:"string",description:"Unified diff string to apply."}},required:["path","patch"]}});import*as ny from"diff";import{promises as oy}from"fs";var nr,ry=h(()=>{"use strict";c();ty();k();nr={name:"diff.apply",displayName:"Apply Diff",description:"Apply a unified diff patch to a file.",category:"diff",parameters:ey,execute:async r=>{let e=r.path,t=r.patch;y(`[diff.apply] execute path="${e}"`);try{let o=await oy.readFile(e,"utf8"),n=ny.applyPatch(o,t);return n===!1?"Failed to apply patch. The patch may be malformed or conflicting with the current file content.":(await oy.writeFile(e,n,"utf8"),`Successfully applied patch to ${e}`)}catch(o){return`Error applying patch: ${o instanceof Error?o.message:String(o)}`}},confirmation:{level:"high",reason:"This will apply a patch to files, which may corrupt them if the patch doesn't match.",showArgs:["path"]}}});var sy,iy=h(()=>{"use strict";c();sy={type:"object",properties:{path:{type:"string",description:"Path to the file to apply the patch against for preview."},patch:{type:"string",description:"Unified diff string to preview."}},required:["path","patch"]}});import*as ay from"diff";import{promises as Pv}from"fs";var rr,ly=h(()=>{"use strict";c();iy();rr={name:"diff.preview",displayName:"Preview Diff",description:"Preview the result of applying a patch to a file without modifying it.",category:"diff",parameters:sy,execute:async r=>{let e=r.path,t=r.patch;try{let o=await Pv.readFile(e,"utf8"),n=ay.applyPatch(o,t);return n===!1?"Patch preview failed. The patch would not apply cleanly.":`Preview of ${e} after patch:
299
299
 
300
- ${n}`}catch(o){return`Error previewing patch: ${o instanceof Error?o.message:String(o)}`}}}});var ly={};le(ly,{diffApplyTool:()=>or,diffCreateTool:()=>tr,diffPreviewTool:()=>nr,diffToolsProject:()=>ay});var ay,bi=h(()=>{"use strict";l();Xh();oy();iy();ay={manifest:{key:"diff",name:"diff-tools",displayName:"Diff and Patch",version:"1.0.0",description:"Tools to create and apply unified diff changes to files safely.",author:"Sajeer",tools:["diff.create","diff.apply","diff.preview"],category:"diff"},tools:[tr,or,nr],dependencies:{diff:"^7.0.0"}}});var cy,py=h(()=>{"use strict";l();cy={type:"object",properties:{db:{type:"string",description:"Database connection URI (e.g. postgres://user:pass@host/db, mysql://...) or local SQLite file path (.sqlite, .db)"},sql:{type:"string",description:"The SQL query to execute"},params:{type:"array",description:"Optional array of parameters for parameterized queries (to prevent SQL injection)",items:{},default:[]}},required:["db","sql"]}});var Ge,rr=h(()=>{"use strict";l();Ge=class{connectionString;constructor(e){this.connectionString=e}}});import my from"better-sqlite3";import*as wi from"fs";var sn,dy=h(()=>{"use strict";l();rr();sn=class extends Ge{getDb(){if(!wi.existsSync(this.connectionString))throw new Error(`Database file not found: ${this.connectionString}`);return new my(this.connectionString,{readonly:!1})}async query(e,t=[]){let o=this.getDb();try{let n=o.prepare(e);return n.reader?n.all(t):(n.run(t),[])}finally{o.close()}}async execute(e,t=[]){let o=this.getDb();try{let s=o.prepare(e).run(t);return{changes:s.changes,lastInsertRowid:s.lastInsertRowid,raw:s}}finally{o.close()}}async getTables(){return(await this.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'")).map(o=>o.name)}async getSchema(e){return e?await this.query(`PRAGMA table_info("${e}")`):await this.query("SELECT name, sql FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'")}static executeSession(e,t,o=[]){if(!wi.existsSync(e))throw new Error(`Database file not found: ${e}`);let n=new my(e,{readonly:!1});try{let s=n.prepare(t);return s.reader?s.all(o):s.run(o)}finally{n.close()}}}});import Cv from"pg";var sr,uy=h(()=>{"use strict";l();rr();sr=class extends Ge{async getClient(){let e=new Cv.Client({connectionString:this.connectionString});return await e.connect(),e}convertSql(e){let t=1;return e.replace(/\?/g,()=>`$${t++}`)}async query(e,t=[]){let o=await this.getClient();try{let n=this.convertSql(e);return(await o.query(n,t)).rows}finally{await o.end()}}async execute(e,t=[]){let o=await this.getClient();try{let n=this.convertSql(e),s=await o.query(n,t);return{changes:s.rowCount??0,raw:s}}finally{await o.end()}}async getTables(){return(await this.query("SELECT tablename as name FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema'")).map(o=>o.name)}async getSchema(e){return e?await this.query(`
300
+ ${n}`}catch(o){return`Error previewing patch: ${o instanceof Error?o.message:String(o)}`}}}});var py={};ue(py,{diffApplyTool:()=>nr,diffCreateTool:()=>or,diffPreviewTool:()=>rr,diffToolsProject:()=>cy});var cy,wi=h(()=>{"use strict";c();Zh();ry();ly();cy={manifest:{key:"diff",name:"diff-tools",displayName:"Diff and Patch",version:"1.0.0",description:"Tools to create and apply unified diff changes to files safely.",author:"Sajeer",tools:["diff.create","diff.apply","diff.preview"],category:"diff"},tools:[or,nr,rr],dependencies:{diff:"^7.0.0"}}});var my,dy=h(()=>{"use strict";c();my={type:"object",properties:{db:{type:"string",description:"Database connection URI (e.g. postgres://user:pass@host/db, mysql://...) or local SQLite file path (.sqlite, .db)"},sql:{type:"string",description:"The SQL query to execute"},params:{type:"array",description:"Optional array of parameters for parameterized queries (to prevent SQL injection)",items:{},default:[]}},required:["db","sql"]}});var Ge,sr=h(()=>{"use strict";c();Ge=class{connectionString;constructor(e){this.connectionString=e}}});import uy from"better-sqlite3";import*as Ti from"fs";var an,fy=h(()=>{"use strict";c();sr();an=class extends Ge{getDb(){if(!Ti.existsSync(this.connectionString))throw new Error(`Database file not found: ${this.connectionString}`);return new uy(this.connectionString,{readonly:!1})}async query(e,t=[]){let o=this.getDb();try{let n=o.prepare(e);return n.reader?n.all(t):(n.run(t),[])}finally{o.close()}}async execute(e,t=[]){let o=this.getDb();try{let s=o.prepare(e).run(t);return{changes:s.changes,lastInsertRowid:s.lastInsertRowid,raw:s}}finally{o.close()}}async getTables(){return(await this.query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'")).map(o=>o.name)}async getSchema(e){return e?await this.query(`PRAGMA table_info("${e}")`):await this.query("SELECT name, sql FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'")}static executeSession(e,t,o=[]){if(!Ti.existsSync(e))throw new Error(`Database file not found: ${e}`);let n=new uy(e,{readonly:!1});try{let s=n.prepare(t);return s.reader?s.all(o):s.run(o)}finally{n.close()}}}});import kv from"pg";var ir,gy=h(()=>{"use strict";c();sr();ir=class extends Ge{async getClient(){let e=new kv.Client({connectionString:this.connectionString});return await e.connect(),e}convertSql(e){let t=1;return e.replace(/\?/g,()=>`$${t++}`)}async query(e,t=[]){let o=await this.getClient();try{let n=this.convertSql(e);return(await o.query(n,t)).rows}finally{await o.end()}}async execute(e,t=[]){let o=await this.getClient();try{let n=this.convertSql(e),s=await o.query(n,t);return{changes:s.rowCount??0,raw:s}}finally{await o.end()}}async getTables(){return(await this.query("SELECT tablename as name FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema'")).map(o=>o.name)}async getSchema(e){return e?await this.query(`
301
301
  SELECT column_name, data_type, is_nullable, column_default
302
302
  FROM information_schema.columns
303
303
  WHERE table_name = $1
@@ -305,9 +305,9 @@ ${n}`}catch(o){return`Error previewing patch: ${o instanceof Error?o.message:Str
305
305
  SELECT table_name as name, table_type
306
306
  FROM information_schema.tables
307
307
  WHERE table_schema = 'public'
308
- `)}}});import kv from"mysql2/promise";var ir,fy=h(()=>{"use strict";l();rr();ir=class extends Ge{async getConnection(){return await kv.createConnection(this.connectionString)}async query(e,t=[]){let o=await this.getConnection();try{let[n]=await o.execute(e,t);return n}finally{await o.end()}}async execute(e,t=[]){let o=await this.getConnection();try{let[n]=await o.execute(e,t);return{changes:n.affectedRows,lastInsertRowid:n.insertId,raw:n}}finally{await o.end()}}async getTables(){let t=await this.query("SHOW TABLES");if(!t||t.length===0)return[];let o=Object.keys(t[0]);return t.map(n=>n[o[0]])}async getSchema(e){if(e){let t=await this.getConnection();try{let[o]=await t.query("DESCRIBE ??",[e]);return o}finally{await t.end()}}else return await this.query("SHOW TABLES")}}});var Q,Be=h(()=>{"use strict";l();dy();uy();fy();Q=class{static getAdapter(e){return e.startsWith("postgres://")||e.startsWith("postgresql://")?new sr(e):e.startsWith("mysql://")?new ir(e):e.startsWith("sqlite://")?new sn(e.replace("sqlite://","")):new sn(e)}}});var ar,gy=h(()=>{"use strict";l();py();Be();k();ar={name:"db.query",displayName:"Database Query",description:"Execute raw SQL queries against an SQLite, PostgreSQL, or MySQL database.",category:"database",parameters:cy,execute:async r=>{let e=r.db,t=r.sql,o=r.params||[];y(`[db.query] execute db="${e}" sql="${t.substring(0,80)}..." params=${o.length}`);try{let s=await Q.getAdapter(e).query(t,o);return JSON.stringify(s,null,2)}catch(n){return`Database query error: ${n instanceof Error?n.message:String(n)}`}}}});var hy,yy=h(()=>{"use strict";l();hy={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"},table:{type:"string",description:"Optional specific table name to inspect. If omitted, returns structural summary of all tables."}},required:["db"]}});var lr,by=h(()=>{"use strict";l();yy();Be();lr={name:"db.schema",displayName:"Database Schema",description:"Get the structural schema of a database or a specific table.",category:"database",parameters:hy,execute:async r=>{let e=r.db,t=r.table;try{let n=await Q.getAdapter(e).getSchema(t);return JSON.stringify(n,null,2)}catch(o){return`Database schema error: ${o instanceof Error?o.message:String(o)}`}}}});var wy,Ty=h(()=>{"use strict";l();wy={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"}},required:["db"]}});var cr,xy=h(()=>{"use strict";l();Ty();Be();cr={name:"db.tables",displayName:"Database Tables",description:"List all user tables in the database.",category:"database",parameters:wy,execute:async r=>{let e=r.db;try{let o=await Q.getAdapter(e).getTables();return JSON.stringify(o,null,2)}catch(t){return`Database tables error: ${t instanceof Error?t.message:String(t)}`}}}});var vy,Cy=h(()=>{"use strict";l();vy={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"},table:{type:"string",description:"Name of the table to insert into"},data:{type:"object",description:"Key-value pairs of column names and values to insert"}},required:["db","table","data"]}});var pr,ky=h(()=>{"use strict";l();Cy();Be();pr={name:"db.insert",displayName:"Database Insert",description:"Insert a new row into an SQLite table safely.",category:"database",parameters:vy,execute:async r=>{let e=r.db,t=r.table,o=r.data;if(Object.keys(o).length===0)return"Error: No data provided to insert.";try{let n=Object.keys(o).join(", "),s=Object.keys(o).map(()=>"?").join(", "),i=Object.values(o),a=`INSERT INTO ${t} (${n}) VALUES (${s})`,p=await Q.getAdapter(e).execute(a,i);return JSON.stringify(p,null,2)}catch(n){return`Database insert error: ${n instanceof Error?n.message:String(n)}`}},confirmation:{level:"medium",reason:"This will insert rows into the database, creating permanent records.",showArgs:["table","data"]}}});var Py,Sy=h(()=>{"use strict";l();Py={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"},table:{type:"string",description:"Name of the table to update"},data:{type:"object",description:"Key-value pairs of column names and new values"},where:{type:"string",description:'WHERE clause condition (e.g. "id = 5"). DO NOT INCLUDE the word WHERE.'}},required:["db","table","data","where"]}});var mr,Ry=h(()=>{"use strict";l();Sy();Be();mr={name:"db.update",displayName:"Database Update",description:"Update existing rows in a database table.",category:"database",parameters:Py,execute:async r=>{let e=r.db,t=r.table,o=r.data,n=r.where;if(Object.keys(o).length===0)return"Error: No data provided to update.";try{let s=Object.keys(o).map(m=>`${m} = ?`).join(", "),i=Object.values(o),a=`UPDATE ${t} SET ${s} WHERE ${n}`,p=await Q.getAdapter(e).execute(a,i);return JSON.stringify(p,null,2)}catch(s){return`Database update error: ${s instanceof Error?s.message:String(s)}`}},confirmation:{level:"high",reason:"This will update database rows, potentially affecting multiple records.",showArgs:["table","data","where"]}}});var _y,$y=h(()=>{"use strict";l();_y={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"},table:{type:"string",description:"Name of the table to delete from"},where:{type:"string",description:'WHERE clause condition (e.g. "id = 5"). DO NOT INCLUDE the word WHERE.'}},required:["db","table","where"]}});var dr,Ey=h(()=>{"use strict";l();$y();Be();dr={name:"db.delete",displayName:"Database Delete",description:"Delete rows from a database table.",category:"database",parameters:_y,execute:async r=>{let e=r.db,t=r.table,o=r.where;try{let n=`DELETE FROM ${t} WHERE ${o}`,i=await Q.getAdapter(e).execute(n);return JSON.stringify(i,null,2)}catch(n){return`Database delete error: ${n instanceof Error?n.message:String(n)}`}},confirmation:{level:"high",reason:"This will permanently delete rows from the database.",showArgs:["table","where"]}}});var Dy,My=h(()=>{"use strict";l();Dy={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"},table:{type:"string",description:"Name of the table to count rows from"},where:{type:"string",description:"Optional WHERE clause condition"}},required:["db","table"]}});var ur,Oy=h(()=>{"use strict";l();My();Be();ur={name:"db.count",displayName:"Database Count",description:"Count rows in a database table.",category:"database",parameters:Dy,execute:async r=>{let e=r.db,t=r.table,o=r.where;try{let n=o?`WHERE ${o}`:"",s=`SELECT COUNT(*) as count FROM ${t} ${n}`,a=await Q.getAdapter(e).query(s);return Array.isArray(a)&&a.length>0?`Rows: ${a[0].count}`:"Count: 0"}catch(n){return`Database count error: ${n instanceof Error?n.message:String(n)}`}}}});var Ay={};le(Ay,{dbCountTool:()=>ur,dbDeleteTool:()=>dr,dbInsertTool:()=>pr,dbQueryTool:()=>ar,dbSchemaTool:()=>lr,dbTablesTool:()=>cr,dbToolsProject:()=>Ny,dbUpdateTool:()=>mr});var Ny,Ti=h(()=>{"use strict";l();gy();by();xy();ky();Ry();Ey();Oy();Ny={manifest:{key:"db",name:"db-tools",displayName:"Database Tools",version:"1.0.0",description:"Stateless database operations enabling the AI to interact with local databases.",author:"Sajeer",tools:["db.query","db.schema","db.tables","db.insert","db.update","db.delete","db.count"],category:"database"},tools:[ar,lr,cr,pr,mr,dr,ur],dependencies:{"better-sqlite3":"^11.3.0"}}});var Iy,Ly=h(()=>{"use strict";l();Iy={type:"object",properties:{siteId:{type:"string",description:'The Netlify Site ID to deploy to (e.g. "api_id" from Netlify UI)'},dir:{type:"string",description:'The local directory path to deploy (e.g. "./dist" or "./public")'},message:{type:"string",description:"Optional deployment message/commit note"}},required:["siteId","dir"]}});import{NetlifyAPI as Pv}from"netlify";var ze,fr=h(()=>{"use strict";l();ze=class{static getClient(){let e=process.env.NETLIFY_AUTH_TOKEN;if(!e)throw new Error("NETLIFY_AUTH_TOKEN environment variable is required to use Netlify cloud tools.");return new Pv(e)}}});var gr,jy=h(()=>{"use strict";l();Ly();fr();k();gr={name:"cloud.deploy",displayName:"Cloud Deploy",description:"Deploy a static directory to Netlify.",category:"cloud",parameters:Iy,execute:async r=>{let e=r.siteId,t=r.dir,o=r.message;y(`[cloud.deploy] execute siteId="${e}" dir="${t}" message="${o??"none"}"`);try{let s=await ze.getClient().deploy(e,t,{message:o||"Deployed via Toolpack SDK",draft:!1});return JSON.stringify({id:s.deployId,url:s.deploy.url,admin_url:s.deploy.admin_url,state:s.deploy.state},null,2)}catch(n){return`Cloud deployment error: ${n instanceof Error?n.message:String(n)}`}},confirmation:{level:"high",reason:"This will deploy to production (live site).",showArgs:["siteId","dir"]}}});var Fy,qy=h(()=>{"use strict";l();Fy={type:"object",properties:{siteId:{type:"string",description:"The Netlify Site ID"},deployId:{type:"string",description:"The specific Deployment ID to check"}},required:["siteId","deployId"]}});var hr,Wy=h(()=>{"use strict";l();qy();fr();hr={name:"cloud.status",displayName:"Cloud Status",description:"Check the status of a specific Netlify deployment.",category:"cloud",parameters:Fy,execute:async r=>{let e=r.siteId,t=r.deployId;try{let n=await ze.getClient().getSiteDeploy({site_id:e,deploy_id:t});return JSON.stringify({id:n.id,state:n.state,error_message:n.error_message,created_at:n.created_at,updated_at:n.updated_at,url:n.url},null,2)}catch(o){return`Cloud status error: ${o instanceof Error?o.message:String(o)}`}}}});var Uy,Gy=h(()=>{"use strict";l();Uy={type:"object",properties:{siteId:{type:"string",description:"The Netlify Site ID"},limit:{type:"number",description:"Number of recent deployments to return. Defaults to 5.",default:5}},required:["siteId"]}});var yr,By=h(()=>{"use strict";l();Gy();fr();k();yr={name:"cloud.list",displayName:"Cloud Deployments List",description:"List recent deployments for a Netlify site.",category:"cloud",parameters:Uy,execute:async r=>{let e=r.siteId,t=r.limit||5;y(`[cloud.list] execute siteId="${e}" limit=${t}`);try{let n=await ze.getClient().listSiteDeploys({site_id:e,page:1,per_page:t});if(!Array.isArray(n))return"Unexpected response format from Netlify API";let s=n.map(i=>({id:i.id,state:i.state,created_at:i.created_at,url:i.url,branch:i.branch,title:i.title}));return JSON.stringify(s,null,2)}catch(o){return`Cloud list error: ${o instanceof Error?o.message:String(o)}`}}}});var Hy={};le(Hy,{cloudDeployTool:()=>gr,cloudListTool:()=>yr,cloudStatusTool:()=>hr,cloudToolsProject:()=>zy});var zy,xi=h(()=>{"use strict";l();jy();Wy();By();zy={manifest:{key:"cloud",name:"cloud-tools",displayName:"Cloud Deployment",version:"1.0.0",description:"Cloud deployment operations allowing the AI to publish directories directly to the internet.",author:"Sajeer",tools:["cloud.deploy","cloud.status","cloud.list"],category:"cloud"},tools:[gr,hr,yr],dependencies:{netlify:"^13.1.20"}}});var Ky,Jy,Vy,Qy,Xy,Yy=h(()=>{"use strict";l();Ky="slack.chat.postMessage",Jy="Post Slack Message",Vy="Post a message to a Slack channel or thread. Supports plain mrkdwn text and optional Block Kit blocks for rich formatting. Use thread_ts to reply inside an existing thread.",Qy="slack",Xy={type:"object",properties:{channel:{type:"string",description:"Channel ID or channel name (e.g. #general) to post to."},text:{type:"string",description:"Message text in Slack mrkdwn format. Always required \u2014 used as fallback when blocks are provided."},thread_ts:{type:"string",description:"Timestamp of the parent message to reply in a thread. Omit to post at top level."},blocks:{type:"string",description:"Optional Block Kit layout as a JSON string. When provided, text is used only as the notification fallback."},token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:["channel","text"]}});function ue(r){if(r)return r;let e=process.env.TOOLPACK_SLACK_BOT_TOKEN;if(e)return e;throw new Error("No Slack token available. Set TOOLPACK_SLACK_BOT_TOKEN or pass token in tool args.")}var st=h(()=>{"use strict";l()});function Sv(r){return{Authorization:`Bearer ${r}`,"Content-Type":"application/json; charset=utf-8"}}async function fe(r,e,t){let o=await fetch(`https://slack.com/api/${r}`,{method:"POST",headers:Sv(e),body:JSON.stringify(t)});if(!o.ok)throw new Error(`Slack HTTP error ${o.status} ${o.statusText}`);let n=await o.json();if(!n.ok)throw new Error(`Slack API error: ${n.error??"unknown"}`);return n}var it=h(()=>{"use strict";l()});async function Rv(r){let e=String(r.channel),t=String(r.text),o=r.thread_ts?String(r.thread_ts):void 0,n=r.blocks?String(r.blocks):void 0,s=ue(r.token),i={channel:e,text:t};if(o&&(i.thread_ts=o),n)try{i.blocks=JSON.parse(n)}catch{return"Error: blocks is not valid JSON."}let a=await fe("chat.postMessage",s,i),c=a.ts??"";return`Message posted. channel=${a.channel??e} ts=${c}`}var an,vi=h(()=>{"use strict";l();Yy();st();it();an={name:Ky,displayName:Jy,description:Vy,parameters:Xy,category:Qy,execute:Rv}});var Zy,eb,tb,ob,nb,rb=h(()=>{"use strict";l();Zy="slack.chat.postEphemeral",eb="Post Ephemeral Slack Message",tb="Post a temporary message visible only to a specific user in a Slack channel. Useful for private confirmations, status updates, or error messages that should not be seen by others.",ob="slack",nb={type:"object",properties:{channel:{type:"string",description:"Channel ID where the ephemeral message will appear."},user:{type:"string",description:"Slack user ID of the person who will see the message."},text:{type:"string",description:"Message text in Slack mrkdwn format."},thread_ts:{type:"string",description:"Timestamp of the parent message to show the ephemeral reply inside a thread."},token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:["channel","user","text"]}});async function _v(r){let e=String(r.channel),t=String(r.user),o=String(r.text),n=r.thread_ts?String(r.thread_ts):void 0,s=ue(r.token),i={channel:e,user:t,text:o};return n&&(i.thread_ts=n),await fe("chat.postEphemeral",s,i),`Ephemeral message sent to user=${t} in channel=${e}.`}var ln,Ci=h(()=>{"use strict";l();rb();st();it();ln={name:Zy,displayName:eb,description:tb,parameters:nb,category:ob,execute:_v}});var sb,ib,ab,lb,cb,pb=h(()=>{"use strict";l();sb="slack.reactions.add",ib="Add Slack Reaction",ab="Add an emoji reaction to a Slack message. Useful for acknowledging receipt (\u{1F440} eyes), signalling completion (\u2705 white_check_mark), or flagging issues (\u26A0\uFE0F warning). Requires the reactions:write OAuth scope on the Slack app.",lb="slack",cb={type:"object",properties:{channel:{type:"string",description:"Channel ID containing the message to react to."},timestamp:{type:"string",description:"Timestamp of the message to react to."},name:{type:"string",description:'Emoji name without colons (e.g. "eyes", "white_check_mark", "warning", "x").'},token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:["channel","timestamp","name"]}});async function $v(r){let e=String(r.channel),t=String(r.timestamp),o=String(r.name),n=ue(r.token);try{await fe("reactions.add",n,{channel:e,timestamp:t,name:o})}catch(s){if(s instanceof Error&&s.message.includes("already_reacted"))return`Reaction :${o}: already present on message ts=${t}.`;throw s}return`Reaction :${o}: added to message ts=${t} in channel=${e}.`}var cn,ki=h(()=>{"use strict";l();pb();st();it();cn={name:sb,displayName:ib,description:ab,parameters:cb,category:lb,execute:$v}});var mb,db,ub,fb,gb,hb=h(()=>{"use strict";l();mb="slack.conversations.history",db="Get Slack Channel History",ub="Fetch recent messages from a Slack channel. Useful for reading conversation context, checking what was discussed, or finding a specific message timestamp to react to or thread-reply into.",fb="slack",gb={type:"object",properties:{channel:{type:"string",description:"Channel ID to fetch history from."},limit:{type:"integer",description:"Maximum number of messages to return. Defaults to 10, max 100."},oldest:{type:"string",description:"Only return messages after this Unix timestamp (inclusive)."},latest:{type:"string",description:"Only return messages before this Unix timestamp (exclusive)."},token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:["channel"]}});async function Ev(r){let e=String(r.channel),t=typeof r.limit=="number"?Math.min(r.limit,100):10,o=ue(r.token),n={channel:e,limit:t};r.oldest&&(n.oldest=String(r.oldest)),r.latest&&(n.latest=String(r.latest));let i=(await fe("conversations.history",o,n)).messages??[];return i.length===0?"No messages found.":[...i].reverse().map(c=>{let p=c.user?`user:${c.user}`:c.bot_id?`bot:${c.bot_id}`:"unknown",m=c.reply_count?` [thread: ${c.reply_count} replies]`:"",f=(c.text??"").replace(/\n/g," ").slice(0,200);return`[${c.ts}] ${p}${m}: ${f}`}).join(`
309
- `)}var pn,Pi=h(()=>{"use strict";l();hb();st();it();pn={name:mb,displayName:db,description:ub,parameters:gb,category:fb,execute:Ev}});var yb,bb,wb,Tb,xb,vb=h(()=>{"use strict";l();yb="slack.conversations.replies",bb="Get Slack Thread Replies",wb="Fetch all replies in a Slack thread. Use this to read the full conversation history of a thread, including who replied and when. Requires the channel ID and the timestamp (ts) of the parent message that started the thread.",Tb="slack",xb={type:"object",properties:{channel:{type:"string",description:"Channel ID that contains the thread."},ts:{type:"string",description:"Timestamp of the parent message that started the thread."},limit:{type:"integer",description:"Maximum number of replies to return. Defaults to 20, max 100."},oldest:{type:"string",description:"Only return replies after this Unix timestamp (inclusive)."},latest:{type:"string",description:"Only return replies before this Unix timestamp (exclusive)."},token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:["channel","ts"]}});async function Dv(r){let e=String(r.channel),t=String(r.ts),o=typeof r.limit=="number"?Math.min(r.limit,100):20,n=ue(r.token),s={channel:e,ts:t,limit:o};r.oldest&&(s.oldest=String(r.oldest)),r.latest&&(s.latest=String(r.latest));let a=(await fe("conversations.replies",n,s)).messages??[];return a.length===0?"No replies found.":a.map((p,m)=>{let f=p.user?`user:${p.user}`:p.bot_id?`bot:${p.bot_id}`:"unknown",g=m===0?" [parent]":"",w=(p.text??"").replace(/\n/g," ").slice(0,200);return`[${p.ts}] ${f}${g}: ${w}`}).join(`
310
- `)}var mn,Si=h(()=>{"use strict";l();vb();st();it();mn={name:yb,displayName:bb,description:wb,parameters:xb,category:Tb,execute:Dv}});var Cb,kb,Pb,Sb,Rb,_b=h(()=>{"use strict";l();Cb="slack.auth.test",kb="Slack Auth Test",Pb="Verify the bot token and retrieve the identity of the calling app. Returns the bot_id, user_id, team, and workspace URL. Use this when the bot_id is not configured and is needed for self-suppression or other identity checks.",Sb="slack",Rb={type:"object",properties:{token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:[]}});async function Mv(r){let e=ue(r.token),t=await fe("auth.test",e,{});return JSON.stringify({bot_id:t.bot_id,user_id:t.user_id,user:t.user,team:t.team,team_id:t.team_id,url:t.url},null,2)}var dn,Ri=h(()=>{"use strict";l();_b();st();it();dn={name:Cb,displayName:kb,description:Pb,parameters:Rb,category:Sb,execute:Mv}});var Eb={};le(Eb,{slackAuthTestTool:()=>dn,slackChatPostEphemeralTool:()=>ln,slackChatPostMessageTool:()=>an,slackConversationsHistoryTool:()=>pn,slackConversationsRepliesTool:()=>mn,slackReactionsAddTool:()=>cn,slackToolsProject:()=>$b});var $b,_i=h(()=>{"use strict";l();vi();Ci();ki();Pi();Si();Ri();vi();Ci();ki();Pi();Si();Ri();$b={manifest:{key:"slack",name:"slack-tools",displayName:"Slack",version:"1.0.0",description:"Slack Web API tools \u2014 post messages, reply in threads, react to messages, read channel history, read thread replies, and verify bot identity.",author:"Toolpack",tools:["slack.chat.postMessage","slack.chat.postEphemeral","slack.reactions.add","slack.conversations.history","slack.conversations.replies","slack.auth.test"],category:"network"},tools:[an,ln,cn,pn,mn,dn]}});l();ce();l();ce();import{EventEmitter as bw}from"events";l();ce();var Dt=class extends A{constructor(t,o,n,s,i,a){super(t,"CONTEXT_WINDOW_EXCEEDED",400,a);this.conversationId=o;this.currentTokens=n;this.contextWindowLimit=s;this.strategy=i;this.name="ContextWindowExceededError"}conversationId;currentTokens;contextWindowLimit;strategy;getOverageTokens(){return Math.max(0,this.currentTokens-this.contextWindowLimit)}getUsagePercentage(){return Math.round(this.currentTokens/this.contextWindowLimit*100)}getDetailedReport(){return`
308
+ `)}}});import Sv from"mysql2/promise";var ar,hy=h(()=>{"use strict";c();sr();ar=class extends Ge{async getConnection(){return await Sv.createConnection(this.connectionString)}async query(e,t=[]){let o=await this.getConnection();try{let[n]=await o.execute(e,t);return n}finally{await o.end()}}async execute(e,t=[]){let o=await this.getConnection();try{let[n]=await o.execute(e,t);return{changes:n.affectedRows,lastInsertRowid:n.insertId,raw:n}}finally{await o.end()}}async getTables(){let t=await this.query("SHOW TABLES");if(!t||t.length===0)return[];let o=Object.keys(t[0]);return t.map(n=>n[o[0]])}async getSchema(e){if(e){let t=await this.getConnection();try{let[o]=await t.query("DESCRIBE ??",[e]);return o}finally{await t.end()}}else return await this.query("SHOW TABLES")}}});var X,Be=h(()=>{"use strict";c();fy();gy();hy();X=class{static getAdapter(e){return e.startsWith("postgres://")||e.startsWith("postgresql://")?new ir(e):e.startsWith("mysql://")?new ar(e):e.startsWith("sqlite://")?new an(e.replace("sqlite://","")):new an(e)}}});var lr,yy=h(()=>{"use strict";c();dy();Be();k();lr={name:"db.query",displayName:"Database Query",description:"Execute raw SQL queries against an SQLite, PostgreSQL, or MySQL database.",category:"database",parameters:my,execute:async r=>{let e=r.db,t=r.sql,o=r.params||[];y(`[db.query] execute db="${e}" sql="${t.substring(0,80)}..." params=${o.length}`);try{let s=await X.getAdapter(e).query(t,o);return JSON.stringify(s,null,2)}catch(n){return`Database query error: ${n instanceof Error?n.message:String(n)}`}}}});var by,wy=h(()=>{"use strict";c();by={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"},table:{type:"string",description:"Optional specific table name to inspect. If omitted, returns structural summary of all tables."}},required:["db"]}});var cr,Ty=h(()=>{"use strict";c();wy();Be();cr={name:"db.schema",displayName:"Database Schema",description:"Get the structural schema of a database or a specific table.",category:"database",parameters:by,execute:async r=>{let e=r.db,t=r.table;try{let n=await X.getAdapter(e).getSchema(t);return JSON.stringify(n,null,2)}catch(o){return`Database schema error: ${o instanceof Error?o.message:String(o)}`}}}});var xy,vy=h(()=>{"use strict";c();xy={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"}},required:["db"]}});var pr,Cy=h(()=>{"use strict";c();vy();Be();pr={name:"db.tables",displayName:"Database Tables",description:"List all user tables in the database.",category:"database",parameters:xy,execute:async r=>{let e=r.db;try{let o=await X.getAdapter(e).getTables();return JSON.stringify(o,null,2)}catch(t){return`Database tables error: ${t instanceof Error?t.message:String(t)}`}}}});var Py,ky=h(()=>{"use strict";c();Py={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"},table:{type:"string",description:"Name of the table to insert into"},data:{type:"object",description:"Key-value pairs of column names and values to insert"}},required:["db","table","data"]}});var mr,Sy=h(()=>{"use strict";c();ky();Be();mr={name:"db.insert",displayName:"Database Insert",description:"Insert a new row into an SQLite table safely.",category:"database",parameters:Py,execute:async r=>{let e=r.db,t=r.table,o=r.data;if(Object.keys(o).length===0)return"Error: No data provided to insert.";try{let n=Object.keys(o).join(", "),s=Object.keys(o).map(()=>"?").join(", "),i=Object.values(o),a=`INSERT INTO ${t} (${n}) VALUES (${s})`,p=await X.getAdapter(e).execute(a,i);return JSON.stringify(p,null,2)}catch(n){return`Database insert error: ${n instanceof Error?n.message:String(n)}`}},confirmation:{level:"medium",reason:"This will insert rows into the database, creating permanent records.",showArgs:["table","data"]}}});var Ry,_y=h(()=>{"use strict";c();Ry={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"},table:{type:"string",description:"Name of the table to update"},data:{type:"object",description:"Key-value pairs of column names and new values"},where:{type:"string",description:'WHERE clause condition (e.g. "id = 5"). DO NOT INCLUDE the word WHERE.'}},required:["db","table","data","where"]}});var dr,$y=h(()=>{"use strict";c();_y();Be();dr={name:"db.update",displayName:"Database Update",description:"Update existing rows in a database table.",category:"database",parameters:Ry,execute:async r=>{let e=r.db,t=r.table,o=r.data,n=r.where;if(Object.keys(o).length===0)return"Error: No data provided to update.";try{let s=Object.keys(o).map(m=>`${m} = ?`).join(", "),i=Object.values(o),a=`UPDATE ${t} SET ${s} WHERE ${n}`,p=await X.getAdapter(e).execute(a,i);return JSON.stringify(p,null,2)}catch(s){return`Database update error: ${s instanceof Error?s.message:String(s)}`}},confirmation:{level:"high",reason:"This will update database rows, potentially affecting multiple records.",showArgs:["table","data","where"]}}});var Ey,Dy=h(()=>{"use strict";c();Ey={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"},table:{type:"string",description:"Name of the table to delete from"},where:{type:"string",description:'WHERE clause condition (e.g. "id = 5"). DO NOT INCLUDE the word WHERE.'}},required:["db","table","where"]}});var ur,My=h(()=>{"use strict";c();Dy();Be();ur={name:"db.delete",displayName:"Database Delete",description:"Delete rows from a database table.",category:"database",parameters:Ey,execute:async r=>{let e=r.db,t=r.table,o=r.where;try{let n=`DELETE FROM ${t} WHERE ${o}`,i=await X.getAdapter(e).execute(n);return JSON.stringify(i,null,2)}catch(n){return`Database delete error: ${n instanceof Error?n.message:String(n)}`}},confirmation:{level:"high",reason:"This will permanently delete rows from the database.",showArgs:["table","where"]}}});var Oy,Ny=h(()=>{"use strict";c();Oy={type:"object",properties:{db:{type:"string",description:"Database connection URI or SQLite file path"},table:{type:"string",description:"Name of the table to count rows from"},where:{type:"string",description:"Optional WHERE clause condition"}},required:["db","table"]}});var fr,Ay=h(()=>{"use strict";c();Ny();Be();fr={name:"db.count",displayName:"Database Count",description:"Count rows in a database table.",category:"database",parameters:Oy,execute:async r=>{let e=r.db,t=r.table,o=r.where;try{let n=o?`WHERE ${o}`:"",s=`SELECT COUNT(*) as count FROM ${t} ${n}`,a=await X.getAdapter(e).query(s);return Array.isArray(a)&&a.length>0?`Rows: ${a[0].count}`:"Count: 0"}catch(n){return`Database count error: ${n instanceof Error?n.message:String(n)}`}}}});var Ly={};ue(Ly,{dbCountTool:()=>fr,dbDeleteTool:()=>ur,dbInsertTool:()=>mr,dbQueryTool:()=>lr,dbSchemaTool:()=>cr,dbTablesTool:()=>pr,dbToolsProject:()=>Iy,dbUpdateTool:()=>dr});var Iy,xi=h(()=>{"use strict";c();yy();Ty();Cy();Sy();$y();My();Ay();Iy={manifest:{key:"db",name:"db-tools",displayName:"Database Tools",version:"1.0.0",description:"Stateless database operations enabling the AI to interact with local databases.",author:"Sajeer",tools:["db.query","db.schema","db.tables","db.insert","db.update","db.delete","db.count"],category:"database"},tools:[lr,cr,pr,mr,dr,ur,fr],dependencies:{"better-sqlite3":"^11.3.0"}}});var jy,Fy=h(()=>{"use strict";c();jy={type:"object",properties:{siteId:{type:"string",description:'The Netlify Site ID to deploy to (e.g. "api_id" from Netlify UI)'},dir:{type:"string",description:'The local directory path to deploy (e.g. "./dist" or "./public")'},message:{type:"string",description:"Optional deployment message/commit note"}},required:["siteId","dir"]}});import{NetlifyAPI as Rv}from"netlify";var ze,gr=h(()=>{"use strict";c();ze=class{static getClient(){let e=process.env.NETLIFY_AUTH_TOKEN;if(!e)throw new Error("NETLIFY_AUTH_TOKEN environment variable is required to use Netlify cloud tools.");return new Rv(e)}}});var hr,qy=h(()=>{"use strict";c();Fy();gr();k();hr={name:"cloud.deploy",displayName:"Cloud Deploy",description:"Deploy a static directory to Netlify.",category:"cloud",parameters:jy,execute:async r=>{let e=r.siteId,t=r.dir,o=r.message;y(`[cloud.deploy] execute siteId="${e}" dir="${t}" message="${o??"none"}"`);try{let s=await ze.getClient().deploy(e,t,{message:o||"Deployed via Toolpack SDK",draft:!1});return JSON.stringify({id:s.deployId,url:s.deploy.url,admin_url:s.deploy.admin_url,state:s.deploy.state},null,2)}catch(n){return`Cloud deployment error: ${n instanceof Error?n.message:String(n)}`}},confirmation:{level:"high",reason:"This will deploy to production (live site).",showArgs:["siteId","dir"]}}});var Wy,Uy=h(()=>{"use strict";c();Wy={type:"object",properties:{siteId:{type:"string",description:"The Netlify Site ID"},deployId:{type:"string",description:"The specific Deployment ID to check"}},required:["siteId","deployId"]}});var yr,Gy=h(()=>{"use strict";c();Uy();gr();yr={name:"cloud.status",displayName:"Cloud Status",description:"Check the status of a specific Netlify deployment.",category:"cloud",parameters:Wy,execute:async r=>{let e=r.siteId,t=r.deployId;try{let n=await ze.getClient().getSiteDeploy({site_id:e,deploy_id:t});return JSON.stringify({id:n.id,state:n.state,error_message:n.error_message,created_at:n.created_at,updated_at:n.updated_at,url:n.url},null,2)}catch(o){return`Cloud status error: ${o instanceof Error?o.message:String(o)}`}}}});var By,zy=h(()=>{"use strict";c();By={type:"object",properties:{siteId:{type:"string",description:"The Netlify Site ID"},limit:{type:"number",description:"Number of recent deployments to return. Defaults to 5.",default:5}},required:["siteId"]}});var br,Hy=h(()=>{"use strict";c();zy();gr();k();br={name:"cloud.list",displayName:"Cloud Deployments List",description:"List recent deployments for a Netlify site.",category:"cloud",parameters:By,execute:async r=>{let e=r.siteId,t=r.limit||5;y(`[cloud.list] execute siteId="${e}" limit=${t}`);try{let n=await ze.getClient().listSiteDeploys({site_id:e,page:1,per_page:t});if(!Array.isArray(n))return"Unexpected response format from Netlify API";let s=n.map(i=>({id:i.id,state:i.state,created_at:i.created_at,url:i.url,branch:i.branch,title:i.title}));return JSON.stringify(s,null,2)}catch(o){return`Cloud list error: ${o instanceof Error?o.message:String(o)}`}}}});var Jy={};ue(Jy,{cloudDeployTool:()=>hr,cloudListTool:()=>br,cloudStatusTool:()=>yr,cloudToolsProject:()=>Ky});var Ky,vi=h(()=>{"use strict";c();qy();Gy();Hy();Ky={manifest:{key:"cloud",name:"cloud-tools",displayName:"Cloud Deployment",version:"1.0.0",description:"Cloud deployment operations allowing the AI to publish directories directly to the internet.",author:"Sajeer",tools:["cloud.deploy","cloud.status","cloud.list"],category:"cloud"},tools:[hr,yr,br],dependencies:{netlify:"^13.1.20"}}});var Vy,Qy,Xy,Yy,Zy,eb=h(()=>{"use strict";c();Vy="slack.chat.postMessage",Qy="Post Slack Message",Xy="Post a message to a Slack channel or thread. Supports plain mrkdwn text and optional Block Kit blocks for rich formatting. Use thread_ts to reply inside an existing thread.",Yy="slack",Zy={type:"object",properties:{channel:{type:"string",description:"Channel ID or channel name (e.g. #general) to post to."},text:{type:"string",description:"Message text in Slack mrkdwn format. Always required \u2014 used as fallback when blocks are provided."},thread_ts:{type:"string",description:"Timestamp of the parent message to reply in a thread. Omit to post at top level."},blocks:{type:"string",description:"Optional Block Kit layout as a JSON string. When provided, text is used only as the notification fallback."},token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:["channel","text"]}});function ye(r){if(r)return r;let e=process.env.TOOLPACK_SLACK_BOT_TOKEN;if(e)return e;throw new Error("No Slack token available. Set TOOLPACK_SLACK_BOT_TOKEN or pass token in tool args.")}var rt=h(()=>{"use strict";c()});function _v(r){return{Authorization:`Bearer ${r}`,"Content-Type":"application/json; charset=utf-8"}}async function be(r,e,t){let o=await fetch(`https://slack.com/api/${r}`,{method:"POST",headers:_v(e),body:JSON.stringify(t)});if(!o.ok)throw new Error(`Slack HTTP error ${o.status} ${o.statusText}`);let n=await o.json();if(!n.ok)throw new Error(`Slack API error: ${n.error??"unknown"}`);return n}var st=h(()=>{"use strict";c()});async function $v(r){let e=String(r.channel),t=String(r.text),o=r.thread_ts?String(r.thread_ts):void 0,n=r.blocks?String(r.blocks):void 0,s=ye(r.token),i={channel:e,text:t};if(o&&(i.thread_ts=o),n)try{i.blocks=JSON.parse(n)}catch{return"Error: blocks is not valid JSON."}let a=await be("chat.postMessage",s,i),l=a.ts??"";return`Message posted. channel=${a.channel??e} ts=${l}`}var ln,Ci=h(()=>{"use strict";c();eb();rt();st();ln={name:Vy,displayName:Qy,description:Xy,parameters:Zy,category:Yy,execute:$v}});var tb,ob,nb,rb,sb,ib=h(()=>{"use strict";c();tb="slack.chat.postEphemeral",ob="Post Ephemeral Slack Message",nb="Post a temporary message visible only to a specific user in a Slack channel. Useful for private confirmations, status updates, or error messages that should not be seen by others.",rb="slack",sb={type:"object",properties:{channel:{type:"string",description:"Channel ID where the ephemeral message will appear."},user:{type:"string",description:"Slack user ID of the person who will see the message."},text:{type:"string",description:"Message text in Slack mrkdwn format."},thread_ts:{type:"string",description:"Timestamp of the parent message to show the ephemeral reply inside a thread."},token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:["channel","user","text"]}});async function Ev(r){let e=String(r.channel),t=String(r.user),o=String(r.text),n=r.thread_ts?String(r.thread_ts):void 0,s=ye(r.token),i={channel:e,user:t,text:o};return n&&(i.thread_ts=n),await be("chat.postEphemeral",s,i),`Ephemeral message sent to user=${t} in channel=${e}.`}var cn,Pi=h(()=>{"use strict";c();ib();rt();st();cn={name:tb,displayName:ob,description:nb,parameters:sb,category:rb,execute:Ev}});var ab,lb,cb,pb,mb,db=h(()=>{"use strict";c();ab="slack.reactions.add",lb="Add Slack Reaction",cb="Add an emoji reaction to a Slack message. Useful for acknowledging receipt (\u{1F440} eyes), signalling completion (\u2705 white_check_mark), or flagging issues (\u26A0\uFE0F warning). Requires the reactions:write OAuth scope on the Slack app.",pb="slack",mb={type:"object",properties:{channel:{type:"string",description:"Channel ID containing the message to react to."},timestamp:{type:"string",description:"Timestamp of the message to react to."},name:{type:"string",description:'Emoji name without colons (e.g. "eyes", "white_check_mark", "warning", "x").'},token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:["channel","timestamp","name"]}});async function Dv(r){let e=String(r.channel),t=String(r.timestamp),o=String(r.name),n=ye(r.token);try{await be("reactions.add",n,{channel:e,timestamp:t,name:o})}catch(s){if(s instanceof Error&&s.message.includes("already_reacted"))return`Reaction :${o}: already present on message ts=${t}.`;throw s}return`Reaction :${o}: added to message ts=${t} in channel=${e}.`}var pn,ki=h(()=>{"use strict";c();db();rt();st();pn={name:ab,displayName:lb,description:cb,parameters:mb,category:pb,execute:Dv}});var ub,fb,gb,hb,yb,bb=h(()=>{"use strict";c();ub="slack.conversations.history",fb="Get Slack Channel History",gb="Fetch recent messages from a Slack channel. Useful for reading conversation context, checking what was discussed, or finding a specific message timestamp to react to or thread-reply into.",hb="slack",yb={type:"object",properties:{channel:{type:"string",description:"Channel ID to fetch history from."},limit:{type:"integer",description:"Maximum number of messages to return. Defaults to 10, max 100."},oldest:{type:"string",description:"Only return messages after this Unix timestamp (inclusive)."},latest:{type:"string",description:"Only return messages before this Unix timestamp (exclusive)."},token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:["channel"]}});async function Mv(r){let e=String(r.channel),t=typeof r.limit=="number"?Math.min(r.limit,100):10,o=ye(r.token),n={channel:e,limit:t};r.oldest&&(n.oldest=String(r.oldest)),r.latest&&(n.latest=String(r.latest));let i=(await be("conversations.history",o,n)).messages??[];return i.length===0?"No messages found.":[...i].reverse().map(l=>{let p=l.user?`user:${l.user}`:l.bot_id?`bot:${l.bot_id}`:"unknown",m=l.reply_count?` [thread: ${l.reply_count} replies]`:"",f=(l.text??"").replace(/\n/g," ").slice(0,200);return`[${l.ts}] ${p}${m}: ${f}`}).join(`
309
+ `)}var mn,Si=h(()=>{"use strict";c();bb();rt();st();mn={name:ub,displayName:fb,description:gb,parameters:yb,category:hb,execute:Mv}});var wb,Tb,xb,vb,Cb,Pb=h(()=>{"use strict";c();wb="slack.conversations.replies",Tb="Get Slack Thread Replies",xb="Fetch all replies in a Slack thread. Use this to read the full conversation history of a thread, including who replied and when. Requires the channel ID and the timestamp (ts) of the parent message that started the thread.",vb="slack",Cb={type:"object",properties:{channel:{type:"string",description:"Channel ID that contains the thread."},ts:{type:"string",description:"Timestamp of the parent message that started the thread."},limit:{type:"integer",description:"Maximum number of replies to return. Defaults to 20, max 100."},oldest:{type:"string",description:"Only return replies after this Unix timestamp (inclusive)."},latest:{type:"string",description:"Only return replies before this Unix timestamp (exclusive)."},token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:["channel","ts"]}});async function Ov(r){let e=String(r.channel),t=String(r.ts),o=typeof r.limit=="number"?Math.min(r.limit,100):20,n=ye(r.token),s={channel:e,ts:t,limit:o};r.oldest&&(s.oldest=String(r.oldest)),r.latest&&(s.latest=String(r.latest));let a=(await be("conversations.replies",n,s)).messages??[];return a.length===0?"No replies found.":a.map((p,m)=>{let f=p.user?`user:${p.user}`:p.bot_id?`bot:${p.bot_id}`:"unknown",g=m===0?" [parent]":"",w=(p.text??"").replace(/\n/g," ").slice(0,200);return`[${p.ts}] ${f}${g}: ${w}`}).join(`
310
+ `)}var dn,Ri=h(()=>{"use strict";c();Pb();rt();st();dn={name:wb,displayName:Tb,description:xb,parameters:Cb,category:vb,execute:Ov}});var kb,Sb,Rb,_b,$b,Eb=h(()=>{"use strict";c();kb="slack.auth.test",Sb="Slack Auth Test",Rb="Verify the bot token and retrieve the identity of the calling app. Returns the bot_id, user_id, team, and workspace URL. Use this when the bot_id is not configured and is needed for self-suppression or other identity checks.",_b="slack",$b={type:"object",properties:{token:{type:"string",description:"Slack bot token. Defaults to TOOLPACK_SLACK_BOT_TOKEN env var."}},required:[]}});async function Nv(r){let e=ye(r.token),t=await be("auth.test",e,{});return JSON.stringify({bot_id:t.bot_id,user_id:t.user_id,user:t.user,team:t.team,team_id:t.team_id,url:t.url},null,2)}var un,_i=h(()=>{"use strict";c();Eb();rt();st();un={name:kb,displayName:Sb,description:Rb,parameters:$b,category:_b,execute:Nv}});var Mb={};ue(Mb,{slackAuthTestTool:()=>un,slackChatPostEphemeralTool:()=>cn,slackChatPostMessageTool:()=>ln,slackConversationsHistoryTool:()=>mn,slackConversationsRepliesTool:()=>dn,slackReactionsAddTool:()=>pn,slackToolsProject:()=>Db});var Db,$i=h(()=>{"use strict";c();Ci();Pi();ki();Si();Ri();_i();Ci();Pi();ki();Si();Ri();_i();Db={manifest:{key:"slack",name:"slack-tools",displayName:"Slack",version:"1.0.0",description:"Slack Web API tools \u2014 post messages, reply in threads, react to messages, read channel history, read thread replies, and verify bot identity.",author:"Toolpack",tools:["slack.chat.postMessage","slack.chat.postEphemeral","slack.reactions.add","slack.conversations.history","slack.conversations.replies","slack.auth.test"],category:"network"},tools:[ln,cn,pn,mn,dn,un]}});c();ae();c();ae();import{EventEmitter as Tw}from"events";c();ae();async function na(r,e={}){let{maxRetries:t=3,backoffMs:o=[1e4,3e4,6e4],isRetryable:n=i=>i instanceof fe,onRetry:s}=e;for(let i=0;i<=t;i++)try{return await r()}catch(a){if(n(a)&&i<t){let l=a?.retryAfter!=null?a.retryAfter*1e3:o[i]??o[o.length-1]??6e4;s?.(i+1,l,a),await new Promise(p=>setTimeout(p,l));continue}throw a}throw new fe("Rate limit retries exhausted")}c();ae();var Mt=class extends A{constructor(t,o,n,s,i,a){super(t,"CONTEXT_WINDOW_EXCEEDED",400,a);this.conversationId=o;this.currentTokens=n;this.contextWindowLimit=s;this.strategy=i;this.name="ContextWindowExceededError"}conversationId;currentTokens;contextWindowLimit;strategy;getOverageTokens(){return Math.max(0,this.currentTokens-this.contextWindowLimit)}getUsagePercentage(){return Math.round(this.currentTokens/this.contextWindowLimit*100)}getDetailedReport(){return`
311
311
  Context Window Exceeded
312
312
  =======================
313
313
  Conversation ID: ${this.conversationId}
@@ -318,7 +318,7 @@ Usage: ${this.getUsagePercentage()}%
318
318
  Strategy: ${this.strategy}
319
319
 
320
320
  Message: ${this.message}
321
- `.trim()}};var Mt=class extends A{constructor(t,o,n,s,i,a){super(t,"SUMMARIZATION_ERROR",500,a);this.conversationId=o;this.messageCount=n;this.failureReason=s;this.summaryAttempt=i;this.name="SummarizationError"}conversationId;messageCount;failureReason;summaryAttempt;isRetryable(){return this.failureReason==="provider_error"||this.failureReason==="insufficient_tokens"}getSuggestedRecovery(){switch(this.failureReason){case"provider_error":return"Retry the summarization request or switch to a different summarizer model";case"invalid_response":return"Review the summarizer prompt or use a different model";case"insufficient_tokens":return"Reduce the number of messages to summarize or increase the summary token budget";case"invalid_quality":return"Adjust summarization parameters or use a more capable model";default:return"Manual intervention required"}}getDetailedReport(){let t=`
321
+ `.trim()}};var Ot=class extends A{constructor(t,o,n,s,i,a){super(t,"SUMMARIZATION_ERROR",500,a);this.conversationId=o;this.messageCount=n;this.failureReason=s;this.summaryAttempt=i;this.name="SummarizationError"}conversationId;messageCount;failureReason;summaryAttempt;isRetryable(){return this.failureReason==="provider_error"||this.failureReason==="insufficient_tokens"}getSuggestedRecovery(){switch(this.failureReason){case"provider_error":return"Retry the summarization request or switch to a different summarizer model";case"invalid_response":return"Review the summarizer prompt or use a different model";case"insufficient_tokens":return"Reduce the number of messages to summarize or increase the summary token budget";case"invalid_quality":return"Adjust summarization parameters or use a more capable model";default:return"Manual intervention required"}}getDetailedReport(){let t=`
322
322
  Summarization Error
323
323
  ===================
324
324
  Conversation ID: ${this.conversationId}
@@ -330,11 +330,11 @@ Recovery Action: ${this.getSuggestedRecovery()}
330
330
  Message: ${this.message}`;return this.summaryAttempt?t+`
331
331
 
332
332
  Partial Summary:
333
- ${this.summaryAttempt.substring(0,500)}${this.summaryAttempt.length>500?"...":""}`:t.trim()}};l();var Dr=null;async function ow(){if(!Dr)try{Dr=await import("js-tiktoken")}catch{}return Dr}var oa={"gpt-4.1":3,"gpt-4.1-mini":3,"gpt-5.1":3,"gpt-5.2":3,"gpt-5.4":3,"gpt-5.4-pro":3,__default__:4},nw=2;async function rw(r,e){try{let t=await ow();if(!t)return Ne(r);let o=t.encoding_for_model(e),n=0,s=oa[e]??oa.__default__;for(let i of r){if(n+=s,typeof i.content=="string")n+=o.encode(i.content).length;else if(Array.isArray(i.content))for(let a of i.content)a.type==="text"?n+=o.encode(a.text).length:(a.type==="image_data"||a.type==="image_url"||a.type==="image_file")&&(n+=256);if(i.tool_calls?.length)for(let a of i.tool_calls)n+=o.encode(a.function.name).length,n+=o.encode(a.function.arguments).length;i.name&&(n+=o.encode(i.name).length)}return n+=nw,n}catch{return Ne(r)}}async function sw(r,e){try{let t=Ne(r);return Math.ceil(t*1.1)}catch{return Ne(r)}}async function iw(r,e){try{let t=Ne(r);return Math.ceil(t*1.05)}catch{return Ne(r)}}async function aw(r,e){let t=Ne(r);return Math.ceil(t*1.05)}function Ne(r){let e=0;for(let t of r){if(e+=50,typeof t.content=="string")e+=t.content.length;else if(Array.isArray(t.content))for(let o of t.content)o.type==="text"?e+=o.text.length:(o.type==="image_data"||o.type==="image_url"||o.type==="image_file")&&(e+=1e3);if(t.tool_calls?.length)for(let o of t.tool_calls)e+=o.function.name.length,e+=o.function.arguments.length;t.name&&(e+=t.name.length)}return Math.ceil(e/4)}async function na(r,e,t){let o=t.toLowerCase();return o==="openai"||o==="openai-gpt"?rw(r,e):o==="anthropic"||o==="claude"?sw(r,e):o==="gemini"||o==="google"?iw(r,e):o==="ollama"?aw(r,e):Ne(r)}function hC(r,e,t){let o=e-t;return r>o}function yC(r,e){return Math.round(r/e*100)}function ra(r,e=1.15){return Math.ceil(r*e)}l();function sa(r,e,t=!0){let o=r.length,n=[],s=0,i=[];r.forEach((p,m)=>{t&&p.role==="system"||p.role!=="tool"&&i.push({index:m,message:p})});for(let{message:p}of i){if(s>=e)break;let m=Mr(p);if(s+=m,n.push(p),p.role==="assistant"&&p.tool_calls?.length){let f=new Set(p.tool_calls.map(g=>g.id));for(let g of r)g.role==="tool"&&g.tool_call_id&&f.has(g.tool_call_id)&&(s+=Mr(g),n.push(g))}}let a=new Set(n),c=r.filter(p=>!a.has(p));return{removed:n.length,tokensReclaimed:s,newTotal:c.length,pruneInfo:{beforeCount:o,afterCount:c.length,removedMessages:n}}}function TC(r,e){if(typeof r.content=="string"){let t=e*4;if(r.content.length<=t)return r;let o=r.content.substring(0,t),n=Math.ceil((r.content.length-t)/4);return{...r,content:`${o}
333
+ ${this.summaryAttempt.substring(0,500)}${this.summaryAttempt.length>500?"...":""}`:t.trim()}};c();var Mr=null;async function rw(){if(!Mr)try{Mr=await import("js-tiktoken")}catch{}return Mr}var ra={"gpt-4.1":3,"gpt-4.1-mini":3,"gpt-5.1":3,"gpt-5.2":3,"gpt-5.4":3,"gpt-5.4-pro":3,__default__:4},sw=2;async function iw(r,e){try{let t=await rw();if(!t)return Ne(r);let o=t.encoding_for_model(e),n=0,s=ra[e]??ra.__default__;for(let i of r){if(n+=s,typeof i.content=="string")n+=o.encode(i.content).length;else if(Array.isArray(i.content))for(let a of i.content)a.type==="text"?n+=o.encode(a.text).length:(a.type==="image_data"||a.type==="image_url"||a.type==="image_file")&&(n+=256);if(i.tool_calls?.length)for(let a of i.tool_calls)n+=o.encode(a.function.name).length,n+=o.encode(a.function.arguments).length;i.name&&(n+=o.encode(i.name).length)}return n+=sw,n}catch{return Ne(r)}}async function aw(r,e){try{let t=Ne(r);return Math.ceil(t*1.1)}catch{return Ne(r)}}async function lw(r,e){try{let t=Ne(r);return Math.ceil(t*1.05)}catch{return Ne(r)}}async function cw(r,e){let t=Ne(r);return Math.ceil(t*1.05)}function Ne(r){let e=0;for(let t of r){if(e+=50,typeof t.content=="string")e+=t.content.length;else if(Array.isArray(t.content))for(let o of t.content)o.type==="text"?e+=o.text.length:(o.type==="image_data"||o.type==="image_url"||o.type==="image_file")&&(e+=1e3);if(t.tool_calls?.length)for(let o of t.tool_calls)e+=o.function.name.length,e+=o.function.arguments.length;t.name&&(e+=t.name.length)}return Math.ceil(e/4)}async function sa(r,e,t){let o=t.toLowerCase();return o==="openai"||o==="openai-gpt"?iw(r,e):o==="anthropic"||o==="claude"?aw(r,e):o==="gemini"||o==="google"?lw(r,e):o==="ollama"?cw(r,e):Ne(r)}function xC(r,e,t){let o=e-t;return r>o}function vC(r,e){return Math.round(r/e*100)}function ia(r,e=1.15){return Math.ceil(r*e)}c();function aa(r,e,t=!0){let o=r.length,n=[],s=0,i=[];r.forEach((p,m)=>{t&&p.role==="system"||p.role!=="tool"&&i.push({index:m,message:p})});for(let{message:p}of i){if(s>=e)break;let m=Or(p);if(s+=m,n.push(p),p.role==="assistant"&&p.tool_calls?.length){let f=new Set(p.tool_calls.map(g=>g.id));for(let g of r)g.role==="tool"&&g.tool_call_id&&f.has(g.tool_call_id)&&(s+=Or(g),n.push(g))}}let a=new Set(n),l=r.filter(p=>!a.has(p));return{removed:n.length,tokensReclaimed:s,newTotal:l.length,pruneInfo:{beforeCount:o,afterCount:l.length,removedMessages:n}}}function kC(r,e){if(typeof r.content=="string"){let t=e*4;if(r.content.length<=t)return r;let o=r.content.substring(0,t),n=Math.ceil((r.content.length-t)/4);return{...r,content:`${o}
334
334
 
335
- [...truncated ${n} tokens]`}}else if(Array.isArray(r.content)){let t=r.content.filter(a=>a.type==="text"),o=t.reduce((a,c)=>a+(c.text?.length||0),0),n=e*4;if(o<=n)return r;let s=0,i=[];for(let a of t)if(a.type==="text"){let c=n-s;if(c<=0)break;let p=a.text;if(p.length<=c)i.push(a),s+=p.length;else{let m=p.substring(0,c),f=Math.ceil((p.length-c)/4);i.push({type:"text",text:`${m}
335
+ [...truncated ${n} tokens]`}}else if(Array.isArray(r.content)){let t=r.content.filter(a=>a.type==="text"),o=t.reduce((a,l)=>a+(l.text?.length||0),0),n=e*4;if(o<=n)return r;let s=0,i=[];for(let a of t)if(a.type==="text"){let l=n-s;if(l<=0)break;let p=a.text;if(p.length<=l)i.push(a),s+=p.length;else{let m=p.substring(0,l),f=Math.ceil((p.length-l)/4);i.push({type:"text",text:`${m}
336
336
 
337
- [...truncated ${f} tokens]`});break}}return{...r,content:i.length>0?i:r.content}}return r}function Mr(r){let e=4;if(typeof r.content=="string")e+=Math.ceil(r.content.length/4);else if(Array.isArray(r.content))for(let t of r.content)t.type==="text"?e+=Math.ceil((t.text?.length||0)/4):(t.type==="image_data"||t.type==="image_url"||t.type==="image_file")&&(e+=256);if(r.tool_calls?.length)for(let t of r.tool_calls)e+=Math.ceil(t.function.name.length/4),e+=Math.ceil(t.function.arguments.length/4);return r.name&&(e+=Math.ceil(r.name.length/4)),e}function xC(r){let e={system:[],user:[],assistant:[],tool:[]};return r.forEach(t=>{e[t.role]??=[],e[t.role].push(t)}),e}function vC(r){let e=0,t={},o=0;for(let n of r){let s=Mr(n);e+=s,o=Math.max(o,s),t[n.role]??=0,t[n.role]++}return{totalMessages:r.length,totalTokens:e,byRole:t,largestMessageTokens:o}}l();ce();function Or(r){return r.content==null?"":typeof r.content=="string"?r.content:r.content.map(e=>e.type==="text"?e.text:e.type==="image_url"?`[image: ${e.image_url.url}]`:e.type==="image_file"?`[image-file: ${e.image_file.path}]`:e.type==="image_data"?`[image-data: ${e.image_data.mimeType}]`:"").filter(Boolean).join(" ")}function lw(r,e){if(e)return e;let t=r.filter(c=>c.role==="user"),o=r.filter(c=>c.role==="assistant"),n=r.filter(c=>c.role==="tool"),s=r.length,i=t.length,a=o.length;return`Please provide a concise summary of the following conversation history. The conversation contains ${s} messages (${i} user messages, ${a} assistant responses${n.length>0?`, and ${n.length} tool responses`:""}).
337
+ [...truncated ${f} tokens]`});break}}return{...r,content:i.length>0?i:r.content}}return r}function Or(r){let e=4;if(typeof r.content=="string")e+=Math.ceil(r.content.length/4);else if(Array.isArray(r.content))for(let t of r.content)t.type==="text"?e+=Math.ceil((t.text?.length||0)/4):(t.type==="image_data"||t.type==="image_url"||t.type==="image_file")&&(e+=256);if(r.tool_calls?.length)for(let t of r.tool_calls)e+=Math.ceil(t.function.name.length/4),e+=Math.ceil(t.function.arguments.length/4);return r.name&&(e+=Math.ceil(r.name.length/4)),e}function SC(r){let e={system:[],user:[],assistant:[],tool:[]};return r.forEach(t=>{e[t.role]??=[],e[t.role].push(t)}),e}function RC(r){let e=0,t={},o=0;for(let n of r){let s=Or(n);e+=s,o=Math.max(o,s),t[n.role]??=0,t[n.role]++}return{totalMessages:r.length,totalTokens:e,byRole:t,largestMessageTokens:o}}c();ae();function Nr(r){return r.content==null?"":typeof r.content=="string"?r.content:r.content.map(e=>e.type==="text"?e.text:e.type==="image_url"?`[image: ${e.image_url.url}]`:e.type==="image_file"?`[image-file: ${e.image_file.path}]`:e.type==="image_data"?`[image-data: ${e.image_data.mimeType}]`:"").filter(Boolean).join(" ")}function pw(r,e){if(e)return e;let t=r.filter(l=>l.role==="user"),o=r.filter(l=>l.role==="assistant"),n=r.filter(l=>l.role==="tool"),s=r.length,i=t.length,a=o.length;return`Please provide a concise summary of the following conversation history. The conversation contains ${s} messages (${i} user messages, ${a} assistant responses${n.length>0?`, and ${n.length} tool responses`:""}).
338
338
 
339
339
  Focus on:
340
340
  1. Key topics discussed
@@ -346,22 +346,22 @@ The summary should be comprehensive yet concise, preserving all critical informa
346
346
 
347
347
  ---
348
348
  CONVERSATION:
349
- ${r.map((c,p)=>{let m=Or(c);return`[Message ${p+1}] ${c.role.toUpperCase()}: ${m.substring(0,200)}${m.length>200?"...":""}`}).join(`
349
+ ${r.map((l,p)=>{let m=Nr(l);return`[Message ${p+1}] ${l.role.toUpperCase()}: ${m.substring(0,200)}${m.length>200?"...":""}`}).join(`
350
350
  `)}
351
351
  ---
352
352
 
353
- SUMMARY:`}function Nr(r,e){return{role:"system",content:`[Context Summary]
353
+ SUMMARY:`}function Ar(r,e){return{role:"system",content:`[Context Summary]
354
354
  This conversation has been summarized to manage context window. The following is a summary of the first ${e} messages:
355
355
 
356
356
  ${r}
357
357
 
358
358
  [End Summary]
359
359
 
360
- Use this summary to understand the conversation context. When responding, acknowledge that you're aware of the previous conversation and continue naturally.`}}function SC(r){let e=new Set,t=[],o=[],n="";for(let s of r)if(s.role==="user"){let i=Or(s);n=i,i.includes("?")&&o.push(i.split(`
361
- `)[0]);let a=i.match(/\b[A-Z][a-z]+(?:\s+[A-Z][a-z]+)*\b/g);a&&a.forEach(c=>e.add(c))}else if(s.role==="assistant"){let i=Or(s);if(i.includes("decided")||i.includes("concluded")||i.includes("determined")){let a=i.split(/[.!?]+/);for(let c of a)(c.includes("decided")||c.includes("concluded")||c.includes("determined"))&&t.push(c.trim())}}return{topics:Array.from(e).slice(0,10),decisions:t.slice(0,5),userGoals:o.slice(0,5),context:n.substring(0,200)}}function cw(r){return Math.ceil(r.length/4)}function ia(r){let e=[];return(!r.summary||r.summary.length<10)&&e.push("Summary is too short"),r.summary.length>5e3&&e.push("Summary is excessively long"),r.messageCount<2&&e.push("Must summarize at least 2 messages"),r.summaryTokens>=r.originalTokens*.8&&e.push("Summary is not significantly shorter than original messages"),r.tokensSaved<0&&e.push("Token calculation error: saved tokens is negative"),{valid:e.length===0,issues:e}}function aa(r,e){let t=lw(r,e.summaryPrompt);return[{role:"system",content:`You are a conversation summarizer. Your task is to create a clear, concise summary of the provided conversation that preserves all critical information.
360
+ Use this summary to understand the conversation context. When responding, acknowledge that you're aware of the previous conversation and continue naturally.`}}function DC(r){let e=new Set,t=[],o=[],n="";for(let s of r)if(s.role==="user"){let i=Nr(s);n=i,i.includes("?")&&o.push(i.split(`
361
+ `)[0]);let a=i.match(/\b[A-Z][a-z]+(?:\s+[A-Z][a-z]+)*\b/g);a&&a.forEach(l=>e.add(l))}else if(s.role==="assistant"){let i=Nr(s);if(i.includes("decided")||i.includes("concluded")||i.includes("determined")){let a=i.split(/[.!?]+/);for(let l of a)(l.includes("decided")||l.includes("concluded")||l.includes("determined"))&&t.push(l.trim())}}return{topics:Array.from(e).slice(0,10),decisions:t.slice(0,5),userGoals:o.slice(0,5),context:n.substring(0,200)}}function mw(r){return Math.ceil(r.length/4)}function la(r){let e=[];return(!r.summary||r.summary.length<10)&&e.push("Summary is too short"),r.summary.length>5e3&&e.push("Summary is excessively long"),r.messageCount<2&&e.push("Must summarize at least 2 messages"),r.summaryTokens>=r.originalTokens*.8&&e.push("Summary is not significantly shorter than original messages"),r.tokensSaved<0&&e.push("Token calculation error: saved tokens is negative"),{valid:e.length===0,issues:e}}function ca(r,e){let t=pw(r,e.summaryPrompt);return[{role:"system",content:`You are a conversation summarizer. Your task is to create a clear, concise summary of the provided conversation that preserves all critical information.
362
362
 
363
363
  Maximum summary length: ${e.maxSummaryTokens||500} tokens.
364
- Format: Write only the summary without any additional commentary.`},{role:"user",content:t}]}function la(r,e,t){let o=cw(r),n=Math.max(0,t-o);return{summary:r.trim(),messageCount:e.length,originalTokens:t,summaryTokens:o,tokensSaved:n,timestamp:new Date}}function RC(r,e,t){let o=[...r];return o.push(Nr(e.summary,e.messageCount)),o.push(...t),o}function _C(r,e,t){let o=Math.round(r.tokensSaved/r.originalTokens*100);return`
364
+ Format: Write only the summary without any additional commentary.`},{role:"user",content:t}]}function pa(r,e,t){let o=mw(r),n=Math.max(0,t-o);return{summary:r.trim(),messageCount:e.length,originalTokens:t,summaryTokens:o,tokensSaved:n,timestamp:new Date}}function MC(r,e,t){let o=[...r];return o.push(Ar(e.summary,e.messageCount)),o.push(...t),o}function OC(r,e,t){let o=Math.round(r.tokensSaved/r.originalTokens*100);return`
365
365
  Summarization Report
366
366
  ====================
367
367
  Timestamp: ${r.timestamp.toISOString()}
@@ -380,39 +380,39 @@ Message Count:
380
380
 
381
381
  Summary Preview:
382
382
  ${r.summary.substring(0,300)}${r.summary.length>300?"...":""}
383
- `.trim()}function $C(r){if(r.length===0)throw new A("Cannot merge empty summarization results","CONTEXT_WINDOW_ERROR");return{summary:r.map(t=>`[Round ${r.indexOf(t)+1}] ${t.summary}`).join(`
383
+ `.trim()}function NC(r){if(r.length===0)throw new A("Cannot merge empty summarization results","CONTEXT_WINDOW_ERROR");return{summary:r.map(t=>`[Round ${r.indexOf(t)+1}] ${t.summary}`).join(`
384
384
 
385
- `),messageCount:r.reduce((t,o)=>t+o.messageCount,0),originalTokens:r.reduce((t,o)=>t+o.originalTokens,0),summaryTokens:r.reduce((t,o)=>t+o.summaryTokens,0),tokensSaved:r.reduce((t,o)=>t+o.tokensSaved,0),timestamp:new Date}}l();var Ar=class{states=new Map;config;maxTokens=1e5;constructor(e){this.config=e}getOrCreateState(e){return this.states.has(e)||this.states.set(e,{conversationId:e,estimatedTokens:0,lastUpdated:Date.now(),pruneCount:0,lastPrunedAt:void 0,warningsSent:0,summarizationCount:0}),this.states.get(e)}updateTokenCount(e,t){let o=this.getOrCreateState(e);return o.estimatedTokens=t,o.lastUpdated=Date.now(),o}recordPruneOperation(e,t){let o=this.getOrCreateState(e);return o.pruneCount++,o.lastPrunedAt=Date.now(),o.estimatedTokens=Math.max(0,o.estimatedTokens-t),o.lastUpdated=Date.now(),o}recordWarning(e){let t=this.getOrCreateState(e);return t.warningsSent++,t.lastUpdated=Date.now(),t}recordSummarization(e,t){let o=this.getOrCreateState(e);return o.summarizationCount++,o.estimatedTokens=Math.max(0,o.estimatedTokens-t),o.lastUpdated=Date.now(),o}getState(e){return this.states.get(e)}getAllStates(){return Array.from(this.states.values())}deleteState(e){return this.states.delete(e)}clearAllStates(){this.states.clear()}getStatistics(e){let t=this.states.get(e);if(!t)return null;let o=this.config.pruneThreshold||1e5,n=Math.round(t.estimatedTokens/o*100);return{conversationId:e,currentTokens:t.estimatedTokens,pruneCount:t.pruneCount,summarizationCount:t.summarizationCount,warningsSent:t.warningsSent,lastActivity:new Date(t.lastUpdated),contextWindowPercentage:n}}getExceedingThreshold(e){let t=e||this.maxTokens*(this.config.pruneThreshold||85)/100;return Array.from(this.states.values()).filter(o=>o.estimatedTokens>t)}getAtRiskConversations(e=80){let t=this.maxTokens,o=t*e/100;return Array.from(this.states.values()).filter(n=>n.estimatedTokens>o&&n.estimatedTokens<=t)}generateReport(){let e=this.getAllStates();if(e.length===0)return"No conversations tracked yet.";let t=this.config.pruneThreshold||1e5,o=["Context Window State Report","==========================",`Report Generated: ${new Date().toISOString()}`,`Context Window Limit: ${t} tokens`,`Total Conversations: ${e.length}`,""],n=e.reduce((f,g)=>f+g.estimatedTokens,0),s=e.reduce((f,g)=>f+g.pruneCount,0),i=e.reduce((f,g)=>f+g.summarizationCount,0),a=Math.round(n/e.length);o.push("Summary:"),o.push(`- Total tokens across all conversations: ${n}`),o.push(`- Average tokens per conversation: ${a}`),o.push(`- Total prune operations: ${s}`),o.push(`- Total summarizations: ${i}`),o.push("");let c=this.getAtRiskConversations();c.length>0&&(o.push(`At-Risk Conversations (80%+ threshold): ${c.length}`),c.forEach(f=>{let g=Math.round(f.estimatedTokens/t*100);o.push(`- ${f.conversationId}: ${f.estimatedTokens}/${t} tokens (${g}%)`)}),o.push(""));let p=this.getExceedingThreshold();return p.length>0&&(o.push(`Exceeded Conversations: ${p.length}`),p.forEach(f=>{let g=f.estimatedTokens-t;o.push(`- ${f.conversationId}: ${f.estimatedTokens}/${t} tokens (+${g} over)`)}),o.push("")),o.push("Most Active Conversations (by operations):"),[...e].sort((f,g)=>{let w=f.pruneCount+f.summarizationCount;return g.pruneCount+g.summarizationCount-w}).slice(0,5).forEach(f=>{let g=f.pruneCount+f.summarizationCount;o.push(`- ${f.conversationId}: ${f.pruneCount} prunes, ${f.summarizationCount} summarizations (${g} operations)`)}),o.join(`
386
- `)}export(){let e={};for(let[t,o]of this.states.entries())e[t]={...o,lastUpdated:o.lastUpdated,lastPrunedAt:o.lastPrunedAt};return e}import(e){for(let[t,o]of Object.entries(e))this.states.set(t,{...o,lastUpdated:typeof o.lastUpdated=="number"?o.lastUpdated:new Date(o.lastUpdated).getTime(),lastPrunedAt:o.lastPrunedAt&&typeof o.lastPrunedAt!="number"?new Date(o.lastPrunedAt).getTime():o.lastPrunedAt})}pruneInactiveConversations(e=60){let t=Date.now()-e*60*1e3,o=[];for(let[n,s]of this.states.entries())s.lastUpdated<t&&o.push(n);return o.forEach(n=>this.states.delete(n)),o}getMemoryUsage(){let e=this.states.size,t=e*500;return{conversationCount:e,approximateByteSize:t}}validateIntegrity(){let e=[];for(let[t,o]of this.states.entries())(!t||typeof t!="string")&&e.push(`Invalid conversation ID: ${t}`),o.estimatedTokens<0&&e.push(`Negative token count for ${t}: ${o.estimatedTokens}`),o.pruneCount<0&&e.push(`Negative prune count for ${t}: ${o.pruneCount}`),o.summarizationCount<0&&e.push(`Negative summarization count for ${t}: ${o.summarizationCount}`),o.warningsSent<0&&e.push(`Negative warning count for ${t}: ${o.warningsSent}`),(typeof o.lastUpdated!="number"||o.lastUpdated<=0)&&e.push(`Invalid lastUpdated timestamp for ${t}`),o.lastPrunedAt!==void 0&&(typeof o.lastPrunedAt!="number"||o.lastPrunedAt<=0)&&e.push(`Invalid lastPrunedAt timestamp for ${t}`);return{isValid:e.length===0,issues:e}}};function ca(r){return new Ar(r)}l();l();l();var pt={name:3,displayName:2.5,description:2,category:1.5,parameterNames:1,parameterDescriptions:.5},Ot=class{documents=[];avgDocLength=0;idf=new Map;totalDocs=0;docFrequencies=new Map;k1=1.2;b=.75;index(e){this.documents=[],this.docFrequencies.clear(),this.idf.clear();for(let t of e){let o=this.createDocument(t);this.documents.push(o);let n=new Set(o.tokens);for(let s of n)this.docFrequencies.set(s,(this.docFrequencies.get(s)||0)+1)}this.totalDocs=this.documents.length,this.computeIDF(),this.avgDocLength=this.computeAvgDocLength()}search(e,t){let o=t?.limit??5,n=t?.category,s=t?.minScore??0,i=this.tokenize(e.toLowerCase());if(i.length===0)return[];let a=[];for(let c of this.documents){if(n&&c.tool.category!==n)continue;let p=this.computeBM25Score(i,c);p>s&&a.push({toolName:c.toolName,score:p,tool:c.tool})}return a.sort((c,p)=>p.score-c.score).slice(0,o).map(({toolName:c,score:p,tool:m})=>({toolName:c,score:p,tool:this.toSchema(m)}))}getIndexedCount(){return this.documents.length}isIndexed(e){return this.documents.some(t=>t.toolName===e)}createDocument(e){let t=[];for(let i=0;i<pt.name;i++)t.push(e.name);for(let i=0;i<pt.displayName;i++)t.push(e.displayName);for(let i=0;i<pt.description;i++)t.push(e.description);for(let i=0;i<pt.category;i++)t.push(e.category);if(e.parameters?.properties)for(let[i,a]of Object.entries(e.parameters.properties)){for(let c=0;c<pt.parameterNames;c++)t.push(i);if(a.description)for(let c=0;c<pt.parameterDescriptions;c++)t.push(a.description)}let o=t.join(" ").toLowerCase(),n=this.tokenize(o),s=this.computeTermFrequencies(n);return{toolName:e.name,tool:e,text:o,tokens:n,length:n.length,termFrequencies:s}}tokenize(e){return e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>1).filter(t=>!pw.has(t))}computeTermFrequencies(e){let t=new Map;for(let o of e)t.set(o,(t.get(o)||0)+1);return t}computeIDF(){this.idf.clear();for(let[e,t]of this.docFrequencies){let o=Math.log((this.totalDocs-t+.5)/(t+.5)+1);this.idf.set(e,o)}}computeAvgDocLength(){return this.documents.length===0?0:this.documents.reduce((t,o)=>t+o.length,0)/this.documents.length}computeBM25Score(e,t){let o=0;for(let n of e){let s=t.termFrequencies.get(n)||0;if(s===0)continue;let i=this.idf.get(n)||0,a=t.length,c=s*(this.k1+1),p=s+this.k1*(1-this.b+this.b*(a/this.avgDocLength));o+=i*(c/p)}return o}toSchema(e){return{name:e.name,displayName:e.displayName,description:e.description,parameters:e.parameters,category:e.category}}},pw=new Set(["a","an","the","and","or","but","in","on","at","to","for","of","with","by","from","as","is","was","are","were","been","be","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","it","its","this","that","these","those","i","you","he","she","we","they","what","which","who","whom","when","where","why","how","all","each","every","both","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","also","now","here","there"]);l();var mt=class r{discoveredTools=new Set;searchHistory=[];recordDiscovery(e,t){for(let o of t)this.discoveredTools.add(o);this.searchHistory.push({query:e,tools:t,timestamp:Date.now()})}getDiscoveredTools(){return Array.from(this.discoveredTools)}isDiscovered(e){return this.discoveredTools.has(e)}getDiscoveredCount(){return this.discoveredTools.size}getSearchHistory(){return[...this.searchHistory]}static fromMessages(e){let t=new r;for(let o of e)if(o.role==="tool"){let n=o;if(typeof n.content=="string")try{let s=JSON.parse(n.content);if(s.query&&s.tools&&Array.isArray(s.tools)){let i=s.tools.map(a=>typeof a=="string"?a:a.name).filter(Boolean);i.length>0&&t.recordDiscovery(s.query,i)}}catch{}}return t}clear(){this.discoveredTools.clear(),this.searchHistory=[]}merge(e){for(let t of e.getDiscoveredTools())this.discoveredTools.add(t);this.searchHistory.push(...e.getSearchHistory())}};l();var Nt="tool.search",dt={name:Nt,displayName:"Search Tools",category:"meta",description:`Search for available tools by keyword or natural language query.
385
+ `),messageCount:r.reduce((t,o)=>t+o.messageCount,0),originalTokens:r.reduce((t,o)=>t+o.originalTokens,0),summaryTokens:r.reduce((t,o)=>t+o.summaryTokens,0),tokensSaved:r.reduce((t,o)=>t+o.tokensSaved,0),timestamp:new Date}}c();var Ir=class{states=new Map;config;maxTokens=1e5;constructor(e){this.config=e}getOrCreateState(e){return this.states.has(e)||this.states.set(e,{conversationId:e,estimatedTokens:0,lastUpdated:Date.now(),pruneCount:0,lastPrunedAt:void 0,warningsSent:0,summarizationCount:0}),this.states.get(e)}updateTokenCount(e,t){let o=this.getOrCreateState(e);return o.estimatedTokens=t,o.lastUpdated=Date.now(),o}recordPruneOperation(e,t){let o=this.getOrCreateState(e);return o.pruneCount++,o.lastPrunedAt=Date.now(),o.estimatedTokens=Math.max(0,o.estimatedTokens-t),o.lastUpdated=Date.now(),o}recordWarning(e){let t=this.getOrCreateState(e);return t.warningsSent++,t.lastUpdated=Date.now(),t}recordSummarization(e,t){let o=this.getOrCreateState(e);return o.summarizationCount++,o.estimatedTokens=Math.max(0,o.estimatedTokens-t),o.lastUpdated=Date.now(),o}getState(e){return this.states.get(e)}getAllStates(){return Array.from(this.states.values())}deleteState(e){return this.states.delete(e)}clearAllStates(){this.states.clear()}getStatistics(e){let t=this.states.get(e);if(!t)return null;let o=this.config.pruneThreshold||1e5,n=Math.round(t.estimatedTokens/o*100);return{conversationId:e,currentTokens:t.estimatedTokens,pruneCount:t.pruneCount,summarizationCount:t.summarizationCount,warningsSent:t.warningsSent,lastActivity:new Date(t.lastUpdated),contextWindowPercentage:n}}getExceedingThreshold(e){let t=e||this.maxTokens*(this.config.pruneThreshold||85)/100;return Array.from(this.states.values()).filter(o=>o.estimatedTokens>t)}getAtRiskConversations(e=80){let t=this.maxTokens,o=t*e/100;return Array.from(this.states.values()).filter(n=>n.estimatedTokens>o&&n.estimatedTokens<=t)}generateReport(){let e=this.getAllStates();if(e.length===0)return"No conversations tracked yet.";let t=this.config.pruneThreshold||1e5,o=["Context Window State Report","==========================",`Report Generated: ${new Date().toISOString()}`,`Context Window Limit: ${t} tokens`,`Total Conversations: ${e.length}`,""],n=e.reduce((f,g)=>f+g.estimatedTokens,0),s=e.reduce((f,g)=>f+g.pruneCount,0),i=e.reduce((f,g)=>f+g.summarizationCount,0),a=Math.round(n/e.length);o.push("Summary:"),o.push(`- Total tokens across all conversations: ${n}`),o.push(`- Average tokens per conversation: ${a}`),o.push(`- Total prune operations: ${s}`),o.push(`- Total summarizations: ${i}`),o.push("");let l=this.getAtRiskConversations();l.length>0&&(o.push(`At-Risk Conversations (80%+ threshold): ${l.length}`),l.forEach(f=>{let g=Math.round(f.estimatedTokens/t*100);o.push(`- ${f.conversationId}: ${f.estimatedTokens}/${t} tokens (${g}%)`)}),o.push(""));let p=this.getExceedingThreshold();return p.length>0&&(o.push(`Exceeded Conversations: ${p.length}`),p.forEach(f=>{let g=f.estimatedTokens-t;o.push(`- ${f.conversationId}: ${f.estimatedTokens}/${t} tokens (+${g} over)`)}),o.push("")),o.push("Most Active Conversations (by operations):"),[...e].sort((f,g)=>{let w=f.pruneCount+f.summarizationCount;return g.pruneCount+g.summarizationCount-w}).slice(0,5).forEach(f=>{let g=f.pruneCount+f.summarizationCount;o.push(`- ${f.conversationId}: ${f.pruneCount} prunes, ${f.summarizationCount} summarizations (${g} operations)`)}),o.join(`
386
+ `)}export(){let e={};for(let[t,o]of this.states.entries())e[t]={...o,lastUpdated:o.lastUpdated,lastPrunedAt:o.lastPrunedAt};return e}import(e){for(let[t,o]of Object.entries(e))this.states.set(t,{...o,lastUpdated:typeof o.lastUpdated=="number"?o.lastUpdated:new Date(o.lastUpdated).getTime(),lastPrunedAt:o.lastPrunedAt&&typeof o.lastPrunedAt!="number"?new Date(o.lastPrunedAt).getTime():o.lastPrunedAt})}pruneInactiveConversations(e=60){let t=Date.now()-e*60*1e3,o=[];for(let[n,s]of this.states.entries())s.lastUpdated<t&&o.push(n);return o.forEach(n=>this.states.delete(n)),o}getMemoryUsage(){let e=this.states.size,t=e*500;return{conversationCount:e,approximateByteSize:t}}validateIntegrity(){let e=[];for(let[t,o]of this.states.entries())(!t||typeof t!="string")&&e.push(`Invalid conversation ID: ${t}`),o.estimatedTokens<0&&e.push(`Negative token count for ${t}: ${o.estimatedTokens}`),o.pruneCount<0&&e.push(`Negative prune count for ${t}: ${o.pruneCount}`),o.summarizationCount<0&&e.push(`Negative summarization count for ${t}: ${o.summarizationCount}`),o.warningsSent<0&&e.push(`Negative warning count for ${t}: ${o.warningsSent}`),(typeof o.lastUpdated!="number"||o.lastUpdated<=0)&&e.push(`Invalid lastUpdated timestamp for ${t}`),o.lastPrunedAt!==void 0&&(typeof o.lastPrunedAt!="number"||o.lastPrunedAt<=0)&&e.push(`Invalid lastPrunedAt timestamp for ${t}`);return{isValid:e.length===0,issues:e}}};function ma(r){return new Ir(r)}c();c();c();var mt={name:3,displayName:2.5,description:2,category:1.5,parameterNames:1,parameterDescriptions:.5},Nt=class{documents=[];avgDocLength=0;idf=new Map;totalDocs=0;docFrequencies=new Map;k1=1.2;b=.75;index(e){this.documents=[],this.docFrequencies.clear(),this.idf.clear();for(let t of e){let o=this.createDocument(t);this.documents.push(o);let n=new Set(o.tokens);for(let s of n)this.docFrequencies.set(s,(this.docFrequencies.get(s)||0)+1)}this.totalDocs=this.documents.length,this.computeIDF(),this.avgDocLength=this.computeAvgDocLength()}search(e,t){let o=t?.limit??5,n=t?.category,s=t?.minScore??0,i=this.tokenize(e.toLowerCase());if(i.length===0)return[];let a=[];for(let l of this.documents){if(n&&l.tool.category!==n)continue;let p=this.computeBM25Score(i,l);p>s&&a.push({toolName:l.toolName,score:p,tool:l.tool})}return a.sort((l,p)=>p.score-l.score).slice(0,o).map(({toolName:l,score:p,tool:m})=>({toolName:l,score:p,tool:this.toSchema(m)}))}getIndexedCount(){return this.documents.length}isIndexed(e){return this.documents.some(t=>t.toolName===e)}createDocument(e){let t=[];for(let i=0;i<mt.name;i++)t.push(e.name);for(let i=0;i<mt.displayName;i++)t.push(e.displayName);for(let i=0;i<mt.description;i++)t.push(e.description);for(let i=0;i<mt.category;i++)t.push(e.category);if(e.parameters?.properties)for(let[i,a]of Object.entries(e.parameters.properties)){for(let l=0;l<mt.parameterNames;l++)t.push(i);if(a.description)for(let l=0;l<mt.parameterDescriptions;l++)t.push(a.description)}let o=t.join(" ").toLowerCase(),n=this.tokenize(o),s=this.computeTermFrequencies(n);return{toolName:e.name,tool:e,text:o,tokens:n,length:n.length,termFrequencies:s}}tokenize(e){return e.toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>1).filter(t=>!dw.has(t))}computeTermFrequencies(e){let t=new Map;for(let o of e)t.set(o,(t.get(o)||0)+1);return t}computeIDF(){this.idf.clear();for(let[e,t]of this.docFrequencies){let o=Math.log((this.totalDocs-t+.5)/(t+.5)+1);this.idf.set(e,o)}}computeAvgDocLength(){return this.documents.length===0?0:this.documents.reduce((t,o)=>t+o.length,0)/this.documents.length}computeBM25Score(e,t){let o=0;for(let n of e){let s=t.termFrequencies.get(n)||0;if(s===0)continue;let i=this.idf.get(n)||0,a=t.length,l=s*(this.k1+1),p=s+this.k1*(1-this.b+this.b*(a/this.avgDocLength));o+=i*(l/p)}return o}toSchema(e){return{name:e.name,displayName:e.displayName,description:e.description,parameters:e.parameters,category:e.category}}},dw=new Set(["a","an","the","and","or","but","in","on","at","to","for","of","with","by","from","as","is","was","are","were","been","be","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","it","its","this","that","these","those","i","you","he","she","we","they","what","which","who","whom","when","where","why","how","all","each","every","both","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","also","now","here","there"]);c();var dt=class r{discoveredTools=new Set;searchHistory=[];recordDiscovery(e,t){for(let o of t)this.discoveredTools.add(o);this.searchHistory.push({query:e,tools:t,timestamp:Date.now()})}getDiscoveredTools(){return Array.from(this.discoveredTools)}isDiscovered(e){return this.discoveredTools.has(e)}getDiscoveredCount(){return this.discoveredTools.size}getSearchHistory(){return[...this.searchHistory]}static fromMessages(e){let t=new r;for(let o of e)if(o.role==="tool"){let n=o;if(typeof n.content=="string")try{let s=JSON.parse(n.content);if(s.query&&s.tools&&Array.isArray(s.tools)){let i=s.tools.map(a=>typeof a=="string"?a:a.name).filter(Boolean);i.length>0&&t.recordDiscovery(s.query,i)}}catch{}}return t}clear(){this.discoveredTools.clear(),this.searchHistory=[]}merge(e){for(let t of e.getDiscoveredTools())this.discoveredTools.add(t);this.searchHistory.push(...e.getSearchHistory())}};c();var At="tool.search",ut={name:At,displayName:"Search Tools",category:"meta",description:`Search for available tools by keyword or natural language query.
387
387
  Use this to discover tools before using them.
388
388
  Examples: "file operations", "web scraping", "run command", "http request"
389
389
 
390
390
  Returns a list of matching tools with their names, descriptions, and parameters.
391
- After discovering tools, you can call them directly by name.`,parameters:{type:"object",properties:{query:{type:"string",description:'Natural language search query (e.g., "read files", "web scraping", "execute shell commands")'},category:{type:"string",description:"Optional: filter by category",enum:["filesystem","network","execution","system","meta"]}},required:["query"]},execute:async()=>{throw new Error("tool.search execution must be handled by AIClient")}};function At(){return{name:dt.name,displayName:dt.displayName,description:dt.description,parameters:dt.parameters,category:dt.category}}function bn(r){return r===Nt}l();var mw={filesystem:"File operations (read, write, delete, list, search files)",network:"HTTP requests and web scraping (GET, POST, fetch pages, extract data)",execution:"Run shell commands and manage processes",system:"System information, environment variables, disk usage",meta:"Tool discovery and management"};function Ir(r){let e=r.getCategories();if(e.length===0)return"No tools are currently available.";let t=["You have access to tools in the following categories:",""];for(let o of e){let s=r.getByCategory(o).length,i=mw[o]||o;t.push(`- **${o}** (${s} tools): ${i}`)}return t.push(""),t.push("Use `tool.search` to discover specific tools when needed."),t.push('Example: tool.search({ query: "read file" }) to find file reading tools.'),t.join(`
392
- `)}var It=class{discoveryCache=new mt;async resolve(e,t,o){return o.enabled?o.toolSearch?.enabled?this.resolveWithToolSearch(e,t,o):this.resolveLegacy(t,o):[]}getDiscoveryCache(){return this.discoveryCache}clearDiscoveryCache(){this.discoveryCache.clear()}resolveWithToolSearch(e,t,o){let n=[],s=new Set;n.push(At()),s.add(Nt);let i=o.toolSearch?.alwaysLoadedTools??[];for(let c of i){let p=t.get(c);p&&!s.has(c)&&(n.push(this.toSchema(p)),s.add(c))}let a=o.toolSearch?.alwaysLoadedCategories??[];for(let c of a)for(let p of t.getByCategory(c))s.has(p.name)||(n.push(this.toSchema(p)),s.add(p.name));if(o.toolSearch?.cacheDiscoveredTools!==!1){let c=mt.fromMessages(e);this.discoveryCache.merge(c);let p=this.discoveryCache.getDiscoveredTools();for(let m of p){let f=t.get(m);f&&!s.has(m)&&f.cacheable!==!1&&(n.push(this.toSchema(f)),s.add(m))}}return n}resolveLegacy(e,t){let o;if(t.enabledTools.length===0&&t.enabledToolCategories.length===0)o=e.getEnabled();else{let n=e.getByNames(t.enabledTools),s=e.getByCategories(t.enabledToolCategories),i=new Set;o=[];for(let a of[...n,...s])i.has(a.name)||(i.add(a.name),o.push(a))}return o.map(n=>this.toSchema(n))}toSchema(e){return{name:e.name,displayName:e.displayName,description:e.description,parameters:e.parameters,category:e.category}}};Lt();l();function pa(r){if(r.disabled)return"";let e=r.includeWorkingDirectory!==!1,t=r.includeToolCategories!==!1,o=e?`
391
+ After discovering tools, you can call them directly by name.`,parameters:{type:"object",properties:{query:{type:"string",description:'Natural language search query (e.g., "read files", "web scraping", "execute shell commands")'},category:{type:"string",description:"Optional: filter by category",enum:["filesystem","network","execution","system","meta"]}},required:["query"]},execute:async()=>{throw new Error("tool.search execution must be handled by AIClient")}};function It(){return{name:ut.name,displayName:ut.displayName,description:ut.description,parameters:ut.parameters,category:ut.category}}function wn(r){return r===At}c();var uw={filesystem:"File operations (read, write, delete, list, search files)",network:"HTTP requests and web scraping (GET, POST, fetch pages, extract data)",execution:"Run shell commands and manage processes",system:"System information, environment variables, disk usage",meta:"Tool discovery and management"};function Lr(r){let e=r.getCategories();if(e.length===0)return"No tools are currently available.";let t=["You have access to tools in the following categories:",""];for(let o of e){let s=r.getByCategory(o).length,i=uw[o]||o;t.push(`- **${o}** (${s} tools): ${i}`)}return t.push(""),t.push("Use `tool.search` to discover specific tools when needed."),t.push('Example: tool.search({ query: "read file" }) to find file reading tools.'),t.join(`
392
+ `)}var Lt=class{discoveryCache=new dt;async resolve(e,t,o){return o.enabled?o.toolSearch?.enabled?this.resolveWithToolSearch(e,t,o):this.resolveLegacy(t,o):[]}getDiscoveryCache(){return this.discoveryCache}clearDiscoveryCache(){this.discoveryCache.clear()}resolveWithToolSearch(e,t,o){let n=[],s=new Set;n.push(It()),s.add(At);let i=o.toolSearch?.alwaysLoadedTools??[];for(let l of i){let p=t.get(l);p&&!s.has(l)&&(n.push(this.toSchema(p)),s.add(l))}let a=o.toolSearch?.alwaysLoadedCategories??[];for(let l of a)for(let p of t.getByCategory(l))s.has(p.name)||(n.push(this.toSchema(p)),s.add(p.name));if(o.toolSearch?.cacheDiscoveredTools!==!1){let l=dt.fromMessages(e);this.discoveryCache.merge(l);let p=this.discoveryCache.getDiscoveredTools();for(let m of p){let f=t.get(m);f&&!s.has(m)&&f.cacheable!==!1&&(n.push(this.toSchema(f)),s.add(m))}}return n}resolveLegacy(e,t){let o;if(t.enabledTools.length===0&&t.enabledToolCategories.length===0)o=e.getEnabled();else{let n=e.getByNames(t.enabledTools),s=e.getByCategories(t.enabledToolCategories),i=new Set;o=[];for(let a of[...n,...s])i.has(a.name)||(i.add(a.name),o.push(a))}return o.map(n=>this.toSchema(n))}toSchema(e){return{name:e.name,displayName:e.displayName,description:e.description,parameters:e.parameters,category:e.category}}};jt();c();function da(r){if(r.disabled)return"";let e=r.includeWorkingDirectory!==!1,t=r.includeToolCategories!==!1,o=e?`
393
393
  Working directory: ${r.workingDirectory}`:"",n=t&&r.toolCategories.length>0?`
394
394
  Available tool categories: ${r.toolCategories.join(", ")}`:"";return`You are an AI assistant with access to tools that let you interact with the user's system.${o}${n}
395
395
 
396
396
  When the user asks you to do something, be proactive:
397
397
  - Use your tools to find information rather than asking the user for details you can discover yourself
398
398
  - Read files, list directories, and explore the codebase when asked to analyze or understand a project
399
- - Only ask the user for clarification when you genuinely cannot determine their intent or lack the required tools`}l();var ut=class{analyticalPatterns=[/\b(analyze|find|search|check|list|show)\b/i,/\b(biggest|largest|smallest|most|least|all|every|count)\b/i,/\b(explain|understand|review|audit|inspect|examine)\b/i,/\b(compare|difference|similar|match|pattern)\b/i,/\b(what|where|how many|which|who|when|why|how)\b/i,/\?$/];actionPatterns=[/\b(create|write|update|modify|edit|patch|delete|remove|rename|move|copy)\b/i,/\b(run|execute|start|stop|restart|deploy|install|build)\b/i,/\b(fix|refactor|implement|add|change|replace|insert)\b/i,/\b(make|do|set|configure|setup|initialize)\b/i];classify(e){if(!e||e.trim().length===0)return{type:"conversational",confidence:0};let t=e.toLowerCase(),o=this.analyticalPatterns.filter(a=>a.test(t)).length,n=this.actionPatterns.filter(a=>a.test(t)).length,s=o/this.analyticalPatterns.length,i=n/this.actionPatterns.length;if(o>n&&o>0){let a=Math.min(s,1);return n>0&&(a=Math.min(a,.5)),{type:"analytical",confidence:a,reasoning:`Matched ${o} analytical patterns${n>0?`, ${n} action patterns (capped confidence)`:""}`}}else return n>o&&n>0?{type:"action",confidence:Math.min(i,1),reasoning:`Matched ${n} action patterns`}:o===n&&o>0?{type:"analytical",confidence:.5,reasoning:`Mixed query (${o} analytical, ${n} action patterns)`}:{type:"conversational",confidence:.3,reasoning:"No strong analytical or action patterns detected"}}getToolRoundsAdjustment(e,t){return e.type==="analytical"&&e.confidence>.6?Math.min(t+3,10):(e.type==="action"&&e.confidence>.6,t)}};l();var wn=class{analyzeDependencies(e){let t=[];for(let o=0;o<e.length;o++){let n=e[o],s=[],i=JSON.stringify(n.arguments).toLowerCase();for(let a=0;a<o;a++){let c=e[a];this.hasDependency(n,c,i)&&s.push(c.id)}t.push({toolCallId:n.id,dependsOn:s})}return t}hasDependency(e,t,o){if(e.arguments.path&&t.arguments.path&&e.arguments.path===t.arguments.path||e.arguments.file_path&&t.arguments.file_path&&e.arguments.file_path===t.arguments.file_path||e.arguments.filePath&&t.arguments.filePath&&e.arguments.filePath===t.arguments.filePath||["fs.write_file","fs.delete_file","fs.move","fs.copy","fs.replace_in_file","fs.append_file"].includes(e.name)&&t.arguments.path&&o.includes(t.arguments.path.toLowerCase())||e.name==="exec.read_output"&&t.name==="exec.run_background"||e.name==="http.download"&&t.name==="http.get"&&t.arguments.url&&o.includes(t.arguments.url.toLowerCase()))return!0;let s=["github.pr.files.list","github.pr.diff.get","github.contents.getText"];if(["github.pr.reviews.submit","github.pr.reviewComments.reply"].includes(e.name)&&s.includes(t.name)||e.name==="github.contents.getText"&&t.name==="github.pr.files.list"||e.name==="github.pr.reviewThreads.resolve"&&t.name==="github.pr.reviewThreads.list")return!0;let a=["slack.conversations.history","slack.conversations.replies"];return!!(["slack.chat.postMessage","slack.chat.postEphemeral"].includes(e.name)&&a.includes(t.name)||e.name==="slack.reactions.add"&&a.includes(t.name))}async executeWithDependencies(e,t,o=5){if(e.length===0)return new Map;let n=this.analyzeDependencies(e),s=new Map,i=new Set;for(;i.size<e.length;){let a=[];for(let p of e){if(i.has(p.id))continue;(n.find(g=>g.toolCallId===p.id)?.dependsOn.every(g=>i.has(g))??!0)&&a.push(p)}if(a.length===0){let p=e.filter(m=>!i.has(m.id));throw new Error(`Circular dependency detected in tool calls: ${p.map(m=>m.name).join(", ")}`)}let c=await this.executeBatchWithLimit(a,t,o);for(let{id:p,result:m}of c)s.set(p,m),i.add(p)}return s}async executeBatchWithLimit(e,t,o){let n=[];if(e.length<=o){let s=e.map(async i=>{let a=await t(i);return{id:i.id,result:a}});return await Promise.all(s)}for(let s=0;s<e.length;s+=o){let a=e.slice(s,s+o).map(async p=>{let m=await t(p);return{id:p.id,result:m}}),c=await Promise.all(a);n.push(...c)}return n}shouldUseParallelExecution(e){return e.length>=2}};l();function Xe(r){for(let e=r.length-1;e>=0;e--){let t=r[e];if(t?.role!=="user")continue;let o=t?.content;return typeof o=="string"?o:Array.isArray(o)?o.map(n=>n?.type==="text"?n.text:"").filter(Boolean).join(`
400
- `):""}return""}k();var ga=0;function ha(){return ga+=1,`${Date.now()}-${ga}`}function Tn(r,e){Ye("debug")&&(y(`[AIClient][${r}] Messages (${e.length}):`),e.forEach((t,o)=>{let n=O(t.content,300);y(`[AIClient][${r}] #${o} role=${t.role} content=${n}`)}))}function ya(r){let e=Xe(r).toLowerCase();return e?[/\b(list|show|print|display)\b.*\b(files|folders|directory|dir)\b/,/\b(current|this)\b.*\b(directory|folder|repo|repository)\b/,/\b(read|open|view)\b.*\b(file|log|config|json|yaml|env)\b/,/\b(write|create|update|modify|edit|patch|delete|remove|rename|move|copy)\b.*\b(file|folder|directory)\b/,/\b(run|execute)\b.*\b(command|shell|script|tests?)\b/,/\b(http|get|post|put|delete|download|fetch|curl)\b/,/\b(web|search|scrape|crawl|map)\b/,/https?:\/\//].some(o=>o.test(e)):!1}function ba(r){let e=Xe(r).toLowerCase();if(!e)return!1;let t=[/\b(list|show|print|display)\b.*\b(files|folders|directory|dir)\b/,/\b(current|this)\b.*\b(directory|folder|repo|repository)\b/,/\b(read|open|view)\b.*\b(file|log|config|json|yaml|env)\b/],o=[/\b(write|create|update|modify|edit|patch|delete|remove|rename|move|copy)\b/,/\b(run|execute)\b.*\b(command|shell|script|tests?)\b/,/\b(http|get|post|put|delete|download|fetch|curl)\b/,/\b(web|search|scrape|crawl)\b/];return t.some(n=>n.test(e))&&!o.some(n=>n.test(e))}var xn=class extends bw{providers;defaultProvider;toolRegistry;toolsConfig;toolRouter;bm25Engine;queryClassifier;toolOrchestrator;activeMode=null;overrideSystemPrompt;disableBaseContext;toolResultMaxChars;hitlConfig;onToolConfirm;currentRound=0;conversationId;contextWindowConfig;contextWindowStateManager;providerModelCache=new Map;constructor(e){super(),this.providers=new Map(Object.entries(e.providers)),this.defaultProvider=e.defaultProvider,this.toolRegistry=e.toolRegistry,this.toolsConfig=e.toolsConfig||re,this.toolRouter=new It,this.bm25Engine=new Ot,this.queryClassifier=new ut,this.toolOrchestrator=new wn,this.overrideSystemPrompt=e.systemPrompt,this.disableBaseContext=e.disableBaseContext||!1;let t=this.toolsConfig.resultMaxChars??re.resultMaxChars??2e4;this.toolResultMaxChars=Number.isFinite(t)&&t>0?t:2e4,this.hitlConfig=e.hitlConfig,this.onToolConfirm=e.onToolConfirm,this.conversationId=e.conversationId,this.contextWindowConfig=e.contextWindowConfig,this.providerModelCache=new Map,this.contextWindowConfig&&this.contextWindowConfig.enabled!==!1&&(this.contextWindowStateManager=ca(this.contextWindowConfig)),this.toolRegistry&&this.bm25Engine.index(this.toolRegistry.getAll())}getConversationId(){return this.conversationId||"global"}async getModelInfo(e,t){let o=e.name||e.constructor.name,n=this.providerModelCache.get(o);if(!n){try{n=await e.getModels()}catch{n=[]}this.providerModelCache.set(o,n)}return n.find(s=>s.id===t||s.displayName===t)}async countRequestTokens(e,t,o){let n=await t.countTokens(e.messages,o);return typeof n=="number"&&Number.isFinite(n)?n:na(e.messages,o,t.getDisplayName().toLowerCase())}async pruneConversation(e,t,o){let n=this.contextWindowConfig?.retainSystemMessages??!0,s=e;for(let i=0;i<3;i+=1){let a=await this.countRequestTokens(s,t,s.model);if(a<=o)return s;let c=a-o,p=sa(s.messages,c,n),m=new Set(p.pruneInfo.removedMessages),f=s.messages.filter(b=>!m.has(b)),g={...s,messages:f};if(this.contextWindowStateManager&&this.contextWindowStateManager.recordPruneOperation(this.getConversationId(),p.tokensReclaimed),await this.countRequestTokens(g,t,g.model)<=o||f.length===s.messages.length)return g;s=g}return e}async pruneToMaxMessageHistory(e){let t=this.contextWindowConfig?.maxMessageHistoryLength;if(!t||e.messages.length<=t)return e;let o=this.contextWindowConfig?.retainSystemMessages??!0,n=[];e.messages.forEach((c,p)=>{o&&c.role==="system"||c.role!=="tool"&&n.push(p)});let s=Math.max(0,e.messages.length-t);if(s===0)return e;let i=new Set(n.slice(0,s)),a=e.messages.filter((c,p)=>!i.has(p));return{...e,messages:a}}async summarizeConversation(e,t){let o=e.messages,n=o.filter(v=>v.role==="system"),s=o.filter(v=>v.role!=="system");if(s.length<4)return e;let i=s.slice(-4),a=s.slice(0,-4);if(a.length<2)return e;let c=this.contextWindowConfig?.summarizerModel||e.model,p=aa(a,{model:c,maxSummaryTokens:500}),m=await t.generate({model:c,messages:p,max_tokens:500,temperature:0,response_format:"text"});if(!m.content)throw new Mt("Summarization provider returned no summary",this.getConversationId(),a.length,"invalid_response");let f=await this.countRequestTokens({...e,messages:a},t,c),g=la(m.content,a,f),w=ia(g);if(!w.valid)throw new Mt(`Summarization result is invalid: ${w.issues.join("; ")}`,this.getConversationId(),a.length,"invalid_quality",m.content);let b=Nr(g.summary,a.length),T=[...n,b,...i];return this.contextWindowStateManager&&this.contextWindowStateManager.recordSummarization(this.getConversationId(),g.tokensSaved),{...e,messages:T}}async enforceContextWindow(e,t){if(!this.contextWindowConfig||this.contextWindowConfig.enabled===!1)return e;let o=await this.pruneToMaxMessageHistory(e),n=await this.getModelInfo(t,o.model),s=n?.contextWindow??1e5,i=o.max_tokens??n?.maxOutputTokens??1024,a=this.contextWindowConfig.outputTokenBuffer??1.15,c=ra(i,a),p=Math.max(0,s-c),m=Math.floor(s*((this.contextWindowConfig.pruneThreshold??85)/100)),f=Math.min(p,m),g=await this.countRequestTokens(o,t,o.model);if(this.contextWindowStateManager&&(this.contextWindowStateManager.updateTokenCount(this.getConversationId(),g),g>f&&this.contextWindowStateManager.recordWarning(this.getConversationId())),g<=f)return o;let w=this.contextWindowConfig.strategy??"prune";if(w==="fail"&&g>p)throw new Dt("Context window exceeded by request messages",this.getConversationId(),g,p,w);if(w==="summarize")try{let T=await this.summarizeConversation(o,t);if(await this.countRequestTokens(T,t,T.model)<=p)return T;o=await this.pruneConversation(T,t,p)}catch{o=await this.pruneConversation(o,t,p)}else o=await this.pruneConversation(o,t,p);let b=await this.countRequestTokens(o,t,o.model);if(b>p&&w==="fail")throw new Dt("Context window exceeded after attempted cleanup",this.getConversationId(),b,p,w);return o}isBypassed(e){let t=this.hitlConfig;if(!t||t.enabled===!1)return!0;let o=t.confirmationMode??"all";if(o==="off"||o==="high-only"&&e.confirmation?.level==="medium")return!0;let n=t.bypass??{};return!!(n.tools?.includes(e.name)||n.categories?.includes(e.category)||e.confirmation&&n.levels?.includes(e.confirmation.level))}registerProvider(e,t){this.providers.set(e,t)}getProvider(e){let t=e||this.defaultProvider;if(!t)throw new A("No provider specified and no default provider configured","NO_PROVIDER_CONFIGURED",400);let o=this.providers.get(t);if(!o)throw new A(`Provider '${t}' not found`,"PROVIDER_NOT_FOUND",404);return o}updateHitlConfig(e){this.hitlConfig=e}getHitlConfig(){return this.hitlConfig}setDefaultProvider(e){if(!this.providers.has(e))throw new A(`Provider '${e}' not found`,"PROVIDER_NOT_FOUND",404);this.defaultProvider=e}getToolRegistry(){return this.toolRegistry}getProviders(){return new Map(this.providers)}setToolRegistry(e){this.toolRegistry=e}setToolsConfig(e){this.toolsConfig=e}setSystemPrompt(e){this.overrideSystemPrompt=e}setMode(e){this.activeMode=e,P(`[AIClient] Mode set to: ${e?e.displayName:"none (cleared)"}`)}getMode(){return this.activeMode}getQueryClassifier(){return this.queryClassifier}reindexTools(){this.toolRegistry&&(this.bm25Engine.index(this.toolRegistry.getAll()),P(`[AIClient] Re-indexed ${this.bm25Engine.getIndexedCount()} tools for BM25 search`))}clearToolDiscoveryCache(){this.toolRouter.clearDiscoveryCache()}async generate(e,t){let o=this.getProvider(t);try{let n=ha(),s=this.injectBaseAgentContext(e);s=this.injectOverrideSystemPrompt(s),s=this.injectModeSystemPrompt(s);let i=t||this.defaultProvider,a=await this.enrichRequestWithTools(s),c=a.request,p=a.requestToolMap;c=await this.enforceContextWindow(c,o);let m=process.env.TOOLPACK_SDK_TOOL_CHOICE_POLICY||this.toolsConfig.toolChoicePolicy||"auto",f=(c.tools?.length||0)>0,g=c.tool_choice!=null,w=ya(c.messages),b=ba(c.messages);!g&&f&&(m==="required"||m==="required_for_actions"&&w)&&(c.tool_choice="required");let v=o?.constructor?.name||"UnknownProvider",C={...this.stripRequestTools(c),__toolpack_request_id:n};P(`[AIClient][${n}] generate() start provider=${i} class=${v} model=${c.model} messages=${c.messages.length} tools=${c.tools?.length||0} tool_choice=${c.tool_choice??"unset"} policy=${m} needsTools=${w} autoExecute=${this.toolsConfig.enabled&&this.toolsConfig.autoExecute}`),Tn(n,c.messages);let x=await o.generate(C);if(y(`[AIClient][${n}] generate() initial response finish_reason=${x.finish_reason??"unknown"} tool_calls=${x.tool_calls?.length||0} content_preview=${O(x.content||"",200)}`),this.toolsConfig.autoExecute&&(this.toolRegistry||p.size>0)){let R=Xe(c.messages),D=this.queryClassifier.classify(R),M=this.toolsConfig.maxToolRounds,S=c.maxToolRounds!==void 0?c.maxToolRounds:this.queryClassifier.getToolRoundsAdjustment(D,M);c.maxToolRounds!==void 0?y(`[AIClient][${n}] maxToolRounds overridden per-request: ${S} (classifier bypassed)`):S!==M?P(`[AIClient][${n}] Query classified as ${D.type} (confidence: ${D.confidence.toFixed(2)}), adjusted maxToolRounds: ${M} \u2192 ${S}`):y(`[AIClient][${n}] Query classified as ${D.type} (confidence: ${D.confidence.toFixed(2)}), keeping maxToolRounds: ${S}`);let $=0,_=[...c.messages];for(x.tool_calls&&x.tool_calls.length>0&&P(`[AIClient] Received ${x.tool_calls.length} tool call(s): ${x.tool_calls.map(L=>L.name).join(", ")}`);x.tool_calls&&x.tool_calls.length>0&&$<S;){$++,this.currentRound=$,P(`[AIClient][${n}] generate() tool round ${$}/${S} tool_calls=${x.tool_calls.length}`),_.push({role:"assistant",content:x.content||"",tool_calls:x.tool_calls.map(K=>({id:K.id,type:"function",function:{name:K.name,arguments:JSON.stringify(K.arguments)}}))});let L=this.toolOrchestrator.shouldUseParallelExecution(x.tool_calls),$e=3,Oe=x.tool_calls,ge=x.tool_calls.filter(K=>K.name==="web.fetch");if(ge.length>$e){P(`[AIClient][${n}] Limiting web.fetch calls from ${ge.length} \u2192 ${$e} to prevent context overflow`);let K=ge.slice(0,$e);Oe=[...x.tool_calls.filter(ye=>ye.name!=="web.fetch"),...K];let V=ge.slice($e);for(let ye of V)_.push({role:"tool",tool_call_id:ye.id,content:"[Skipped: web.fetch fan-out limit exceeded]"})}let ae=5e4,X=0;if(L){P(`[AIClient][${n}] Using parallel execution for ${Oe.length} tools`);let K=await this.toolOrchestrator.executeWithDependencies(Oe,J=>this.executeTool(J,p),5);for(let J of Oe){let V=K.get(J.id),ye=typeof V=="string"?V:JSON.stringify(V),be=ae-X,oe;X+ye.length>ae?(I(`[AIClient][${n}] Tool output budget exceeded (${ae} chars)`),oe=this.budgetTruncate(ye,be)):typeof V=="string"&&V.length>this.toolResultMaxChars?oe=`${V.slice(0,this.toolResultMaxChars)}
401
- [TRUNCATED tool result: ${V.length} chars]`:oe=ye;let Je=typeof oe=="string"?oe:JSON.stringify(oe);X+=Je.length,_.push({role:"tool",tool_call_id:J.id,content:oe})}y(`[AIClient][${n}] Round tool output size: ${X} chars (budget: ${ae})`)}else{P(`[AIClient][${n}] Using sequential execution for ${Oe.length} tools`);for(let K of Oe){let J=await this.executeTool(K,p),V=typeof J=="string"?J:JSON.stringify(J),ye=ae-X,be;X+V.length>ae?(I(`[AIClient][${n}] Tool output budget exceeded (${ae} chars)`),be=this.budgetTruncate(V,ye)):typeof J=="string"&&J.length>this.toolResultMaxChars?be=`${J.slice(0,this.toolResultMaxChars)}
402
- [TRUNCATED tool result: ${J.length} chars]`:be=V;let oe=typeof be=="string"?be:JSON.stringify(be);X+=oe.length,_.push({role:"tool",tool_call_id:K.id,content:be})}y(`[AIClient][${n}] Round tool output size: ${X} chars (budget: ${ae})`)}let ct={...c,messages:_,__toolpack_request_id:n},he=this.stripRequestTools((await this.enrichRequestWithTools(ct)).request);he=await this.enforceContextWindow(he,o),he.tool_choice==="required"&&(he.tool_choice=b?"none":"auto",P(`[AIClient][${n}] generate() followup tool_choice override required->${he.tool_choice}`)),Ye("debug")&&(y(`[AIClient][${n}] generate() followup request messages=${_.length}`),Tn(n,_)),x=await o.generate(he),y(`[AIClient][${n}] generate() followup response finish_reason=${x.finish_reason??"unknown"} tool_calls=${x.tool_calls?.length||0} content_preview=${O(x.content||"",200)}`)}}return x}catch(n){throw this.wrapError(n)}}async*stream(e,t){let o=this.getProvider(t);try{let n=ha(),s=t||this.defaultProvider,i=this.injectBaseAgentContext(e);i=this.injectOverrideSystemPrompt(i),i=this.injectModeSystemPrompt(i);let a=await this.enrichRequestWithTools(i),c=a.request,p=a.requestToolMap;c=await this.enforceContextWindow(c,o);let m=process.env.TOOLPACK_SDK_TOOL_CHOICE_POLICY||this.toolsConfig.toolChoicePolicy||"auto",f=(c.tools?.length||0)>0,g=c.tool_choice!=null,w=ya(c.messages),b=ba(c.messages);!g&&f&&(m==="required"||m==="required_for_actions"&&w)&&(c.tool_choice="required");let v=o?.constructor?.name||"UnknownProvider",C={...this.stripRequestTools(c),__toolpack_request_id:n};if(P(`[AIClient][${n}] stream() start provider=${s} class=${v} model=${c.model} messages=${c.messages.length} tools=${c.tools?.length||0} tool_choice=${c.tool_choice??"unset"} policy=${m} needsTools=${w} autoExecute=${this.toolsConfig.enabled&&this.toolsConfig.autoExecute}`),Tn(n,c.messages),!this.toolsConfig.autoExecute||!this.toolRegistry&&p.size===0){yield*o.stream(C);return}let x=[...c.messages],R=0,D=Xe(c.messages),M=this.queryClassifier.classify(D),S=this.toolsConfig.maxToolRounds,$=c.maxToolRounds!==void 0?c.maxToolRounds:this.queryClassifier.getToolRoundsAdjustment(M,S);for(c.maxToolRounds!==void 0?y(`[AIClient][${n}] stream() maxToolRounds overridden per-request: ${$} (classifier bypassed)`):$!==S&&P(`[AIClient][${n}] stream() Query classified as ${M.type} (confidence: ${M.confidence.toFixed(2)}), adjusted maxToolRounds: ${S} \u2192 ${$}`);R<=$;){if(e.signal?.aborted){P(`[AIClient][${n}] stream() aborted by signal`);return}let _="",L=[];R++,this.currentRound=R,P(`[AIClient][${n}] stream() round_start ${R}/${$}`);let $e=null,Oe={...c,messages:x},ge=this.stripRequestTools((await this.enrichRequestWithTools(Oe)).request);ge=await this.enforceContextWindow(ge,o),R>1&&ge.tool_choice==="required"&&(ge.tool_choice=b?"none":"auto",P(`[AIClient][${n}] stream() round_${R} tool_choice override required->${ge.tool_choice}`));for await(let E of o.stream(ge)){if(e.signal?.aborted){P(`[AIClient][${n}] stream() aborted by signal during chunk processing`);return}E.tool_calls&&E.tool_calls.length>0&&(L.push(...E.tool_calls),y(`[AIClient][${n}] stream() tool_calls_chunk count=${E.tool_calls.length} names=${E.tool_calls.map(ne=>ne.name).join(", ")}`),yield E),E.delta&&(_+=E.delta,yield E),E.finish_reason&&($e=E.finish_reason),E.finish_reason==="stop"&&(yield E)}if(y(`[AIClient][${n}] stream() round_end finish_reason=${$e??"unknown"} accumulated_len=${_.length} tool_calls_total=${L.length} content_preview=${O(_,200)}`),L.length===0)break;P(`[AIClient][${n}] stream() received ${L.length} tool call(s): ${L.map(E=>E.name).join(", ")}`),P(`[AIClient][${n}] stream() tool round ${R}/${$}`),x.push({role:"assistant",content:_||"",tool_calls:L.map(E=>({id:E.id,type:"function",function:{name:E.name,arguments:JSON.stringify(E.arguments)}}))});let ae=3,X=L,ct=L.filter(E=>E.name==="web.fetch");if(ct.length>ae){P(`[AIClient][${n}] Limiting web.fetch calls from ${ct.length} \u2192 ${ae} to prevent context overflow`);let E=ct.slice(0,ae);X=[...L.filter(Et=>Et.name!=="web.fetch"),...E];let Ee=ct.slice(ae);for(let Et of Ee)x.push({role:"tool",tool_call_id:Et.id,content:"[Skipped: web.fetch fan-out limit exceeded]"})}let he=5e4,K=0,J=[],V=!1,ye=setInterval(()=>{V||J.push({delta:""})},500),be=Date.now(),oe,Je;try{if(X.length>=2)P(`[AIClient][${n}] stream() using parallel execution for ${X.length} tools`),Je=new Map,oe=await this.toolOrchestrator.executeWithDependencies(X,async E=>{let ne=Date.now(),Ee=await this.executeTool(E,p);return Je.set(E.id,Date.now()-ne),Ee},5);else{P(`[AIClient][${n}] stream() executing single tool sequentially`),Je=new Map,oe=new Map;for(let E of X){let ne=Date.now(),Ee=await this.executeTool(E,p);Je.set(E.id,Date.now()-ne),oe.set(E.id,Ee)}}}finally{V=!0,clearInterval(ye)}for(;J.length>0;)yield J.shift();await new Promise(E=>setTimeout(E,0)),y(`[AIClient][${n}] stream() tool batch completed in ${Date.now()-be}ms`);for(let E of X){let ne=oe.get(E.id),Ee=typeof ne=="string"?ne:JSON.stringify(ne),Et=he-K,Qb=Je.get(E.id)??0,Ve;K+Ee.length>he?(I(`[AIClient][${n}] Tool output budget exceeded (${he} chars)`),Ve=this.budgetTruncate(Ee,Et)):typeof ne=="string"&&ne.length>this.toolResultMaxChars?Ve=`${ne.slice(0,this.toolResultMaxChars)}
403
- [TRUNCATED tool result: ${ne.length} chars]`:Ve=Ee;let Xi=typeof Ve=="string"?Ve:JSON.stringify(Ve);K+=Xi.length,x.push({role:"tool",tool_call_id:E.id,content:Ve}),yield{delta:"",tool_calls:[{...E,result:Xi,duration:Qb}]}}y(`[AIClient][${n}] Round tool output size: ${K} chars (budget: ${he})`),Ye("debug")&&(y(`[AIClient][${n}] stream() after_tools messages=${x.length}`),Tn(n,x))}}catch(n){throw this.wrapError(n)}}async embed(e,t){let o=this.getProvider(t);try{return await o.embed(e)}catch(n){throw this.wrapError(n)}}async enrichRequestWithTools(e){if(this.activeMode?.blockAllTools)return P(`[AIClient] Mode "${this.activeMode.displayName}" blocks all tools`),{request:e,requestToolMap:new Map};let t=this.buildRequestToolMap(e.requestTools),o=Array.from(t.values()).map(m=>this.requestToolToSchema(m)),n=t.size>0;if(!this.toolsConfig.enabled&&!n)return y("[AIClient] Tools disabled and no request-scoped tools"),{request:e,requestToolMap:t};let s=this.toolsConfig;if(this.activeMode?.toolSearch&&this.toolsConfig.toolSearch&&(s={...this.toolsConfig,toolSearch:{...this.toolsConfig.toolSearch,...this.activeMode.toolSearch.enabled!==void 0?{enabled:this.activeMode.toolSearch.enabled}:{},...this.activeMode.toolSearch.alwaysLoadedTools?{alwaysLoadedTools:this.activeMode.toolSearch.alwaysLoadedTools}:{},...this.activeMode.toolSearch.alwaysLoadedCategories?{alwaysLoadedCategories:this.activeMode.toolSearch.alwaysLoadedCategories}:{}}},y(`[AIClient] Merged mode toolSearch config: enabled=${s.toolSearch?.enabled}, alwaysLoadedTools=${s.toolSearch?.alwaysLoadedTools?.length||0}`)),e.tools&&e.tools.length>0){if(!s.toolSearch?.enabled||!this.toolRegistry){y(`[AIClient] Request already has ${e.tools.length} tools`);let b=this.mergeToolCallRequests(e.tools,this.schemasToToolCallRequests(o)),T=b===e.tools?e:{...e,tools:b};return{request:this.injectRequestToolGuidance(T,b),requestToolMap:t}}let m=await this.toolRouter.resolve(e.messages,this.toolRegistry,s);if(y(`[AIClient] Resolved ${m.length} tools to send: ${m.map(b=>b.name).join(", ")||"none"}`),this.activeMode&&m.length>0){let b=m.length;m=this.filterSchemasByMode(m,this.activeMode);let T=b-m.length;T>0&&P(`[AIClient] Mode "${this.activeMode.displayName}" filtered out ${T} tools`)}let f=new Set(e.tools.map(b=>b.function.name)),g=m.filter(b=>!f.has(b.name)).map(b=>({type:"function",function:{name:b.name,description:b.description,parameters:b.parameters}}));if(g.length===0){y(`[AIClient] Request already has ${e.tools.length} tools (no new discoveries)`);let b=this.mergeToolCallRequests(e.tools,this.schemasToToolCallRequests(o)),T=b===e.tools?e:{...e,tools:b};return{request:this.injectRequestToolGuidance(T,b),requestToolMap:t}}let w={...e,tools:this.mergeToolCallRequests([...e.tools,...g],this.schemasToToolCallRequests(o))};return s.toolSearch?.enabled&&this.toolRegistry&&(w=this.injectToolSearchPrompt(w)),{request:this.injectRequestToolGuidance(w,w.tools),requestToolMap:t}}if(!this.toolRegistry){y("[AIClient] Tool registry not configured, skipping tool resolution");let m=this.schemasToToolCallRequests(o),f=m.length>0?{...e,tools:m}:e;return{request:this.injectRequestToolGuidance(f,m),requestToolMap:t}}let i=this.toolRegistry,a=await this.toolRouter.resolve(e.messages,i,s);if(y(`[AIClient] Resolved ${a.length} tools to send: ${a.map(m=>m.name).join(", ")||"none"}`),this.activeMode&&a.length>0){let m=a.length;a=this.filterSchemasByMode(a,this.activeMode);let f=m-a.length;f>0&&P(`[AIClient] Mode "${this.activeMode.displayName}" filtered out ${f} tools`)}let c=this.schemasToToolCallRequests(this.mergeSchemas(a,o));if(c.length===0)return{request:e,requestToolMap:t};let p={...e,tools:c};return this.toolsConfig.toolSearch?.enabled&&i&&(p=this.injectToolSearchPrompt(p)),{request:this.injectRequestToolGuidance(p,c),requestToolMap:t}}buildRequestToolMap(e){let t=new Map;for(let o of e||[])t.set(o.name,o);return t}requestToolToSchema(e){return{name:e.name,displayName:e.displayName,description:e.description,parameters:e.parameters,category:e.category,cacheable:e.cacheable}}mergeSchemas(e,t){let o=new Map;for(let n of e)o.set(n.name,n);for(let n of t)o.set(n.name,n);return Array.from(o.values())}schemasToToolCallRequests(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:t.parameters}}))}mergeToolCallRequests(e,t){if(t.length===0)return e;let o=new Map;for(let n of e)o.set(n.function.name,n);for(let n of t)o.set(n.function.name,n);return Array.from(o.values())}injectRequestToolGuidance(e,t){let o=new Set((t||e.tools||[]).map(c=>c.function.name));if(o.size===0)return e;let n="<!-- TOOLPACK_REQUEST_TOOL_GUIDANCE -->",s=[];if(o.has("knowledge_search")||o.has("knowledge_add")){let c=["Knowledge Base:"];o.has("knowledge_search")&&c.push("- Use `knowledge_search` when you need factual or domain-specific information that may already be stored."),o.has("knowledge_add")&&c.push("- Use `knowledge_add` when you encounter a durable fact, user preference, or decision that future conversations should know. Do not add confidential information, routine task outputs, or context that is specific to this conversation only."),s.push(c.join(`
399
+ - Only ask the user for clarification when you genuinely cannot determine their intent or lack the required tools`}c();var ft=class{analyticalPatterns=[/\b(analyze|find|search|check|list|show)\b/i,/\b(biggest|largest|smallest|most|least|all|every|count)\b/i,/\b(explain|understand|review|audit|inspect|examine)\b/i,/\b(compare|difference|similar|match|pattern)\b/i,/\b(what|where|how many|which|who|when|why|how)\b/i,/\?$/];actionPatterns=[/\b(create|write|update|modify|edit|patch|delete|remove|rename|move|copy)\b/i,/\b(run|execute|start|stop|restart|deploy|install|build)\b/i,/\b(fix|refactor|implement|add|change|replace|insert)\b/i,/\b(make|do|set|configure|setup|initialize)\b/i];classify(e){if(!e||e.trim().length===0)return{type:"conversational",confidence:0};let t=e.toLowerCase(),o=this.analyticalPatterns.filter(a=>a.test(t)).length,n=this.actionPatterns.filter(a=>a.test(t)).length,s=o/this.analyticalPatterns.length,i=n/this.actionPatterns.length;if(o>n&&o>0){let a=Math.min(s,1);return n>0&&(a=Math.min(a,.5)),{type:"analytical",confidence:a,reasoning:`Matched ${o} analytical patterns${n>0?`, ${n} action patterns (capped confidence)`:""}`}}else return n>o&&n>0?{type:"action",confidence:Math.min(i,1),reasoning:`Matched ${n} action patterns`}:o===n&&o>0?{type:"analytical",confidence:.5,reasoning:`Mixed query (${o} analytical, ${n} action patterns)`}:{type:"conversational",confidence:.3,reasoning:"No strong analytical or action patterns detected"}}getToolRoundsAdjustment(e,t){return e.type==="analytical"&&e.confidence>.6?Math.min(t+3,10):(e.type==="action"&&e.confidence>.6,t)}};c();var Tn=class{analyzeDependencies(e){let t=[];for(let o=0;o<e.length;o++){let n=e[o],s=[],i=JSON.stringify(n.arguments).toLowerCase();for(let a=0;a<o;a++){let l=e[a];this.hasDependency(n,l,i)&&s.push(l.id)}t.push({toolCallId:n.id,dependsOn:s})}return t}hasDependency(e,t,o){if(e.arguments.path&&t.arguments.path&&e.arguments.path===t.arguments.path||e.arguments.file_path&&t.arguments.file_path&&e.arguments.file_path===t.arguments.file_path||e.arguments.filePath&&t.arguments.filePath&&e.arguments.filePath===t.arguments.filePath||["fs.write_file","fs.delete_file","fs.move","fs.copy","fs.replace_in_file","fs.append_file"].includes(e.name)&&t.arguments.path&&o.includes(t.arguments.path.toLowerCase())||e.name==="exec.read_output"&&t.name==="exec.run_background"||e.name==="http.download"&&t.name==="http.get"&&t.arguments.url&&o.includes(t.arguments.url.toLowerCase()))return!0;let s=["github.pr.files.list","github.pr.diff.get","github.contents.getText"];if(["github.pr.reviews.submit","github.pr.reviewComments.reply"].includes(e.name)&&s.includes(t.name)||e.name==="github.contents.getText"&&t.name==="github.pr.files.list"||e.name==="github.pr.reviewThreads.resolve"&&t.name==="github.pr.reviewThreads.list")return!0;let a=["slack.conversations.history","slack.conversations.replies"];return!!(["slack.chat.postMessage","slack.chat.postEphemeral"].includes(e.name)&&a.includes(t.name)||e.name==="slack.reactions.add"&&a.includes(t.name))}async executeWithDependencies(e,t,o=5){if(e.length===0)return new Map;let n=this.analyzeDependencies(e),s=new Map,i=new Set;for(;i.size<e.length;){let a=[];for(let p of e){if(i.has(p.id))continue;(n.find(g=>g.toolCallId===p.id)?.dependsOn.every(g=>i.has(g))??!0)&&a.push(p)}if(a.length===0){let p=e.filter(m=>!i.has(m.id));throw new Error(`Circular dependency detected in tool calls: ${p.map(m=>m.name).join(", ")}`)}let l=await this.executeBatchWithLimit(a,t,o);for(let{id:p,result:m}of l)s.set(p,m),i.add(p)}return s}async executeBatchWithLimit(e,t,o){let n=async i=>(await Promise.allSettled(i.map(async l=>({id:l.id,result:await t(l)})))).map((l,p)=>l.status==="fulfilled"?l.value:{id:i[p].id,result:JSON.stringify({error:l.reason?.message??"Tool execution failed"})});if(e.length<=o)return n(e);let s=[];for(let i=0;i<e.length;i+=o)s.push(...await n(e.slice(i,i+o)));return s}shouldUseParallelExecution(e){return e.length>=2}};c();function Qe(r){for(let e=r.length-1;e>=0;e--){let t=r[e];if(t?.role!=="user")continue;let o=t?.content;return typeof o=="string"?o:Array.isArray(o)?o.map(n=>n?.type==="text"?n.text:"").filter(Boolean).join(`
400
+ `):""}return""}k();var ya=0;function ba(){return ya+=1,`${Date.now()}-${ya}`}function xn(r,e){Xe("debug")&&(y(`[AIClient][${r}] Messages (${e.length}):`),e.forEach((t,o)=>{let n=O(t.content,300);y(`[AIClient][${r}] #${o} role=${t.role} content=${n}`)}))}function wa(r){let e=Qe(r).toLowerCase();return e?[/\b(list|show|print|display)\b.*\b(files|folders|directory|dir)\b/,/\b(current|this)\b.*\b(directory|folder|repo|repository)\b/,/\b(read|open|view)\b.*\b(file|log|config|json|yaml|env)\b/,/\b(write|create|update|modify|edit|patch|delete|remove|rename|move|copy)\b.*\b(file|folder|directory)\b/,/\b(run|execute)\b.*\b(command|shell|script|tests?)\b/,/\b(http|get|post|put|delete|download|fetch|curl)\b/,/\b(web|search|scrape|crawl|map)\b/,/https?:\/\//].some(o=>o.test(e)):!1}function Ta(r){let e=Qe(r).toLowerCase();if(!e)return!1;let t=[/\b(list|show|print|display)\b.*\b(files|folders|directory|dir)\b/,/\b(current|this)\b.*\b(directory|folder|repo|repository)\b/,/\b(read|open|view)\b.*\b(file|log|config|json|yaml|env)\b/],o=[/\b(write|create|update|modify|edit|patch|delete|remove|rename|move|copy)\b/,/\b(run|execute)\b.*\b(command|shell|script|tests?)\b/,/\b(http|get|post|put|delete|download|fetch|curl)\b/,/\b(web|search|scrape|crawl)\b/];return t.some(n=>n.test(e))&&!o.some(n=>n.test(e))}var vn=class extends Tw{providers;defaultProvider;toolRegistry;toolsConfig;toolRouter;bm25Engine;queryClassifier;toolOrchestrator;activeMode=null;overrideSystemPrompt;disableBaseContext;toolResultMaxChars;hitlConfig;onToolConfirm;currentRound=0;conversationId;contextWindowConfig;contextWindowStateManager;providerModelCache=new Map;constructor(e){super(),this.providers=new Map(Object.entries(e.providers)),this.defaultProvider=e.defaultProvider,this.toolRegistry=e.toolRegistry,this.toolsConfig=e.toolsConfig||le,this.toolRouter=new Lt,this.bm25Engine=new Nt,this.queryClassifier=new ft,this.toolOrchestrator=new Tn,this.overrideSystemPrompt=e.systemPrompt,this.disableBaseContext=e.disableBaseContext||!1;let t=this.toolsConfig.resultMaxChars??le.resultMaxChars??2e4;this.toolResultMaxChars=Number.isFinite(t)&&t>0?t:2e4,this.hitlConfig=e.hitlConfig,this.onToolConfirm=e.onToolConfirm,this.conversationId=e.conversationId,this.contextWindowConfig=e.contextWindowConfig,this.providerModelCache=new Map,this.contextWindowConfig&&this.contextWindowConfig.enabled!==!1&&(this.contextWindowStateManager=ma(this.contextWindowConfig)),this.toolRegistry&&this.bm25Engine.index(this.toolRegistry.getAll())}getConversationId(){return this.conversationId||"global"}async getModelInfo(e,t){let o=e.name||e.constructor.name,n=this.providerModelCache.get(o);if(!n){try{n=await e.getModels()}catch{n=[]}this.providerModelCache.set(o,n)}return n.find(s=>s.id===t||s.displayName===t)}async countRequestTokens(e,t,o){let n=await t.countTokens(e.messages,o);return typeof n=="number"&&Number.isFinite(n)?n:sa(e.messages,o,t.getDisplayName().toLowerCase())}async pruneConversation(e,t,o){let n=this.contextWindowConfig?.retainSystemMessages??!0,s=e;for(let i=0;i<3;i+=1){let a=await this.countRequestTokens(s,t,s.model);if(a<=o)return s;let l=a-o,p=aa(s.messages,l,n),m=new Set(p.pruneInfo.removedMessages),f=s.messages.filter(b=>!m.has(b)),g={...s,messages:f};if(this.contextWindowStateManager&&this.contextWindowStateManager.recordPruneOperation(this.getConversationId(),p.tokensReclaimed),await this.countRequestTokens(g,t,g.model)<=o||f.length===s.messages.length)return g;s=g}return e}async pruneToMaxMessageHistory(e){let t=this.contextWindowConfig?.maxMessageHistoryLength;if(!t||e.messages.length<=t)return e;let o=this.contextWindowConfig?.retainSystemMessages??!0,n=[];e.messages.forEach((l,p)=>{o&&l.role==="system"||l.role!=="tool"&&n.push(p)});let s=Math.max(0,e.messages.length-t);if(s===0)return e;let i=new Set(n.slice(0,s)),a=e.messages.filter((l,p)=>!i.has(p));return{...e,messages:a}}async summarizeConversation(e,t){let o=e.messages,n=o.filter(x=>x.role==="system"),s=o.filter(x=>x.role!=="system");if(s.length<4)return e;let i=s.slice(-4),a=s.slice(0,-4);if(a.length<2)return e;let l=this.contextWindowConfig?.summarizerModel||e.model,p=ca(a,{model:l,maxSummaryTokens:500}),m=await t.generate({model:l,messages:p,max_tokens:500,temperature:0,response_format:"text"});if(!m.content)throw new Ot("Summarization provider returned no summary",this.getConversationId(),a.length,"invalid_response");let f=await this.countRequestTokens({...e,messages:a},t,l),g=pa(m.content,a,f),w=la(g);if(!w.valid)throw new Ot(`Summarization result is invalid: ${w.issues.join("; ")}`,this.getConversationId(),a.length,"invalid_quality",m.content);let b=Ar(g.summary,a.length),T=[...n,b,...i];return this.contextWindowStateManager&&this.contextWindowStateManager.recordSummarization(this.getConversationId(),g.tokensSaved),{...e,messages:T}}async enforceContextWindow(e,t){if(!this.contextWindowConfig||this.contextWindowConfig.enabled===!1)return e;let o=await this.pruneToMaxMessageHistory(e),n=await this.getModelInfo(t,o.model),s=n?.contextWindow??1e5,i=o.max_tokens??n?.maxOutputTokens??1024,a=this.contextWindowConfig.outputTokenBuffer??1.15,l=ia(i,a),p=Math.max(0,s-l),m=Math.floor(s*((this.contextWindowConfig.pruneThreshold??85)/100)),f=Math.min(p,m),g=await this.countRequestTokens(o,t,o.model);if(this.contextWindowStateManager&&(this.contextWindowStateManager.updateTokenCount(this.getConversationId(),g),g>f&&this.contextWindowStateManager.recordWarning(this.getConversationId())),g<=f)return o;let w=this.contextWindowConfig.strategy??"prune";if(w==="fail"&&g>p)throw new Mt("Context window exceeded by request messages",this.getConversationId(),g,p,w);if(w==="summarize")try{let T=await this.summarizeConversation(o,t);if(await this.countRequestTokens(T,t,T.model)<=p)return T;o=await this.pruneConversation(T,t,p)}catch{o=await this.pruneConversation(o,t,p)}else o=await this.pruneConversation(o,t,p);let b=await this.countRequestTokens(o,t,o.model);if(b>p&&w==="fail")throw new Mt("Context window exceeded after attempted cleanup",this.getConversationId(),b,p,w);return o}isBypassed(e){let t=this.hitlConfig;if(!t||t.enabled===!1)return!0;let o=t.confirmationMode??"all";if(o==="off"||o==="high-only"&&e.confirmation?.level==="medium")return!0;let n=t.bypass??{};return!!(n.tools?.includes(e.name)||n.categories?.includes(e.category)||e.confirmation&&n.levels?.includes(e.confirmation.level))}registerProvider(e,t){this.providers.set(e,t)}getProvider(e){let t=e||this.defaultProvider;if(!t)throw new A("No provider specified and no default provider configured","NO_PROVIDER_CONFIGURED",400);let o=this.providers.get(t);if(!o)throw new A(`Provider '${t}' not found`,"PROVIDER_NOT_FOUND",404);return o}updateHitlConfig(e){this.hitlConfig=e}getHitlConfig(){return this.hitlConfig}setDefaultProvider(e){if(!this.providers.has(e))throw new A(`Provider '${e}' not found`,"PROVIDER_NOT_FOUND",404);this.defaultProvider=e}getToolRegistry(){return this.toolRegistry}getProviders(){return new Map(this.providers)}setToolRegistry(e){this.toolRegistry=e}setToolsConfig(e){this.toolsConfig=e}setSystemPrompt(e){this.overrideSystemPrompt=e}setMode(e){this.activeMode=e,S(`[AIClient] Mode set to: ${e?e.displayName:"none (cleared)"}`)}getMode(){return this.activeMode}getQueryClassifier(){return this.queryClassifier}reindexTools(){this.toolRegistry&&(this.bm25Engine.index(this.toolRegistry.getAll()),S(`[AIClient] Re-indexed ${this.bm25Engine.getIndexedCount()} tools for BM25 search`))}clearToolDiscoveryCache(){this.toolRouter.clearDiscoveryCache()}async generate(e,t){let o=this.getProvider(t);try{let n=ba(),s=this.injectBaseAgentContext(e);s=this.injectOverrideSystemPrompt(s),s=this.injectModeSystemPrompt(s);let i=t||this.defaultProvider,a=await this.enrichRequestWithTools(s),l=a.request,p=a.requestToolMap;l=await this.enforceContextWindow(l,o);let m=process.env.TOOLPACK_SDK_TOOL_CHOICE_POLICY||this.toolsConfig.toolChoicePolicy||"auto",f=(l.tools?.length||0)>0,g=l.tool_choice!=null,w=wa(l.messages),b=Ta(l.messages);!g&&f&&(m==="required"||m==="required_for_actions"&&w)&&(l.tool_choice="required");let x=o?.constructor?.name||"UnknownProvider",C=this.activeMode?.response_format,v={...this.stripRequestTools(l),__toolpack_request_id:n,...C?{response_format:C}:{}};S(`[AIClient][${n}] generate() start provider=${i} class=${x} model=${l.model} messages=${l.messages.length} tools=${l.tools?.length||0} tool_choice=${l.tool_choice??"unset"} policy=${m} needsTools=${w} autoExecute=${this.toolsConfig.enabled&&this.toolsConfig.autoExecute}`),xn(n,l.messages);let $=M=>na(()=>o.generate(M),{onRetry:(R,D)=>S(`[AIClient][${n}] Rate limited \u2014 retrying in ${D/1e3}s (attempt ${R}/3)`)}),P=await $(v);if(y(`[AIClient][${n}] generate() initial response finish_reason=${P.finish_reason??"unknown"} tool_calls=${P.tool_calls?.length||0} content_preview=${O(P.content||"",200)}`),this.toolsConfig.autoExecute&&(this.toolRegistry||p.size>0)){let M=Qe(l.messages),R=this.queryClassifier.classify(M),D=this.toolsConfig.maxToolRounds,_=l.maxToolRounds!==void 0?l.maxToolRounds:this.queryClassifier.getToolRoundsAdjustment(R,D);l.maxToolRounds!==void 0?y(`[AIClient][${n}] maxToolRounds overridden per-request: ${_} (classifier bypassed)`):_!==D?S(`[AIClient][${n}] Query classified as ${R.type} (confidence: ${R.confidence.toFixed(2)}), adjusted maxToolRounds: ${D} \u2192 ${_}`):y(`[AIClient][${n}] Query classified as ${R.type} (confidence: ${R.confidence.toFixed(2)}), keeping maxToolRounds: ${_}`);let W=0,z=[...l.messages];for(P.tool_calls&&P.tool_calls.length>0&&S(`[AIClient] Received ${P.tool_calls.length} tool call(s): ${P.tool_calls.map(lt=>lt.name).join(", ")}`);P.tool_calls&&P.tool_calls.length>0&&W<_;){W++,this.currentRound=W,S(`[AIClient][${n}] generate() tool round ${W}/${_} tool_calls=${P.tool_calls.length}`),z.push({role:"assistant",content:P.content||"",tool_calls:P.tool_calls.map(K=>({id:K.id,type:"function",function:{name:K.name,arguments:JSON.stringify(K.arguments)}}))});let lt=this.toolOrchestrator.shouldUseParallelExecution(P.tool_calls),ct=3,re=P.tool_calls,Ee=P.tool_calls.filter(K=>K.name==="web.fetch");if(Ee.length>ct){S(`[AIClient][${n}] Limiting web.fetch calls from ${Ee.length} \u2192 ${ct} to prevent context overflow`);let K=Ee.slice(0,ct);re=[...P.tool_calls.filter(Te=>Te.name!=="web.fetch"),...K];let Q=Ee.slice(ct);for(let Te of Q)z.push({role:"tool",tool_call_id:Te.id,content:"[Skipped: web.fetch fan-out limit exceeded]"})}let Y=5e4,de=0;if(lt){S(`[AIClient][${n}] Using parallel execution for ${re.length} tools`);let K;try{K=await this.toolOrchestrator.executeWithDependencies(re,U=>this.executeTool(U,p),5)}catch(U){ce(`[AIClient][${n}] Parallel tool execution failed: ${U.message}`),K=new Map(re.map(Q=>[Q.id,JSON.stringify({error:U.message??"Tool execution failed"})]))}for(let U of re){let Q=K.get(U.id)??JSON.stringify({error:"Tool execution result missing"}),Te=typeof Q=="string"?Q:JSON.stringify(Q),se=Y-de,Z;de+Te.length>Y?(I(`[AIClient][${n}] Tool output budget exceeded (${Y} chars)`),Z=this.budgetTruncate(Te,se)):typeof Q=="string"&&Q.length>this.toolResultMaxChars?Z=`${Q.slice(0,this.toolResultMaxChars)}
401
+ [TRUNCATED tool result: ${Q.length} chars]`:Z=Te;let E=typeof Z=="string"?Z:JSON.stringify(Z);de+=E.length,z.push({role:"tool",tool_call_id:U.id,content:Z})}y(`[AIClient][${n}] Round tool output size: ${de} chars (budget: ${Y})`)}else{S(`[AIClient][${n}] Using sequential execution for ${re.length} tools`);for(let K of re){let U;try{U=await this.executeTool(K,p)}catch(E){U=JSON.stringify({error:E.message??"Tool execution failed"})}let Q=typeof U=="string"?U:JSON.stringify(U),Te=Y-de,se;de+Q.length>Y?(I(`[AIClient][${n}] Tool output budget exceeded (${Y} chars)`),se=this.budgetTruncate(Q,Te)):typeof U=="string"&&U.length>this.toolResultMaxChars?se=`${U.slice(0,this.toolResultMaxChars)}
402
+ [TRUNCATED tool result: ${U.length} chars]`:se=Q;let Z=typeof se=="string"?se:JSON.stringify(se);de+=Z.length,z.push({role:"tool",tool_call_id:K.id,content:se})}y(`[AIClient][${n}] Round tool output size: ${de} chars (budget: ${Y})`)}let pt={...l,messages:z,__toolpack_request_id:n,...C?{response_format:C}:{}},we=this.stripRequestTools((await this.enrichRequestWithTools(pt)).request);we=await this.enforceContextWindow(we,o),we.tool_choice==="required"&&(we.tool_choice=b?"none":"auto",S(`[AIClient][${n}] generate() followup tool_choice override required->${we.tool_choice}`)),Xe("debug")&&(y(`[AIClient][${n}] generate() followup request messages=${z.length}`),xn(n,z)),P=await $(we),y(`[AIClient][${n}] generate() followup response finish_reason=${P.finish_reason??"unknown"} tool_calls=${P.tool_calls?.length||0} content_preview=${O(P.content||"",200)}`)}}return P}catch(n){throw this.wrapError(n)}}async*stream(e,t){let o=this.getProvider(t);try{let n=ba(),s=t||this.defaultProvider,i=this.injectBaseAgentContext(e);i=this.injectOverrideSystemPrompt(i),i=this.injectModeSystemPrompt(i);let a=await this.enrichRequestWithTools(i),l=a.request,p=a.requestToolMap;l=await this.enforceContextWindow(l,o);let m=process.env.TOOLPACK_SDK_TOOL_CHOICE_POLICY||this.toolsConfig.toolChoicePolicy||"auto",f=(l.tools?.length||0)>0,g=l.tool_choice!=null,w=wa(l.messages),b=Ta(l.messages);!g&&f&&(m==="required"||m==="required_for_actions"&&w)&&(l.tool_choice="required");let x=o?.constructor?.name||"UnknownProvider",C=this.activeMode?.response_format,v={...this.stripRequestTools(l),__toolpack_request_id:n,...C?{response_format:C}:{}};if(S(`[AIClient][${n}] stream() start provider=${s} class=${x} model=${l.model} messages=${l.messages.length} tools=${l.tools?.length||0} tool_choice=${l.tool_choice??"unset"} policy=${m} needsTools=${w} autoExecute=${this.toolsConfig.enabled&&this.toolsConfig.autoExecute}`),xn(n,l.messages),!this.toolsConfig.autoExecute||!this.toolRegistry&&p.size===0){yield*o.stream(v);return}let $=[...l.messages],P=0,M=Qe(l.messages),R=this.queryClassifier.classify(M),D=this.toolsConfig.maxToolRounds,_=l.maxToolRounds!==void 0?l.maxToolRounds:this.queryClassifier.getToolRoundsAdjustment(R,D);for(l.maxToolRounds!==void 0?y(`[AIClient][${n}] stream() maxToolRounds overridden per-request: ${_} (classifier bypassed)`):_!==D&&S(`[AIClient][${n}] stream() Query classified as ${R.type} (confidence: ${R.confidence.toFixed(2)}), adjusted maxToolRounds: ${D} \u2192 ${_}`);P<=_;){if(e.signal?.aborted){S(`[AIClient][${n}] stream() aborted by signal`);return}let W="",z=[];P++,this.currentRound=P,S(`[AIClient][${n}] stream() round_start ${P}/${_}`);let lt=null,ct={...l,messages:$,...C?{response_format:C}:{}},re=this.stripRequestTools((await this.enrichRequestWithTools(ct)).request);re=await this.enforceContextWindow(re,o),P>1&&re.tool_choice==="required"&&(re.tool_choice=b?"none":"auto",S(`[AIClient][${n}] stream() round_${P} tool_choice override required->${re.tool_choice}`));for await(let E of o.stream(re)){if(e.signal?.aborted){S(`[AIClient][${n}] stream() aborted by signal during chunk processing`);return}E.tool_calls&&E.tool_calls.length>0&&(z.push(...E.tool_calls),y(`[AIClient][${n}] stream() tool_calls_chunk count=${E.tool_calls.length} names=${E.tool_calls.map(ie=>ie.name).join(", ")}`),yield E),E.delta&&(W+=E.delta,yield E),E.finish_reason&&(lt=E.finish_reason),E.finish_reason==="stop"&&(yield E)}if(y(`[AIClient][${n}] stream() round_end finish_reason=${lt??"unknown"} accumulated_len=${W.length} tool_calls_total=${z.length} content_preview=${O(W,200)}`),z.length===0)break;S(`[AIClient][${n}] stream() received ${z.length} tool call(s): ${z.map(E=>E.name).join(", ")}`),S(`[AIClient][${n}] stream() tool round ${P}/${_}`),$.push({role:"assistant",content:W||"",tool_calls:z.map(E=>({id:E.id,type:"function",function:{name:E.name,arguments:JSON.stringify(E.arguments)}}))});let Ee=3,Y=z,de=z.filter(E=>E.name==="web.fetch");if(de.length>Ee){S(`[AIClient][${n}] Limiting web.fetch calls from ${de.length} \u2192 ${Ee} to prevent context overflow`);let E=de.slice(0,Ee);Y=[...z.filter(Dt=>Dt.name!=="web.fetch"),...E];let De=de.slice(Ee);for(let Dt of De)$.push({role:"tool",tool_call_id:Dt.id,content:"[Skipped: web.fetch fan-out limit exceeded]"})}let pt=5e4,we=0,K=[],U=!1,Q=setInterval(()=>{U||K.push({delta:""})},500),Te=Date.now(),se,Z;try{if(Y.length>=2)S(`[AIClient][${n}] stream() using parallel execution for ${Y.length} tools`),Z=new Map,se=await this.toolOrchestrator.executeWithDependencies(Y,async E=>{let ie=Date.now(),De=await this.executeTool(E,p);return Z.set(E.id,Date.now()-ie),De},5);else{S(`[AIClient][${n}] stream() executing single tool sequentially`),Z=new Map,se=new Map;for(let E of Y){let ie=Date.now(),De=await this.executeTool(E,p);Z.set(E.id,Date.now()-ie),se.set(E.id,De)}}}finally{U=!0,clearInterval(Q)}for(;K.length>0;)yield K.shift();await new Promise(E=>setTimeout(E,0)),y(`[AIClient][${n}] stream() tool batch completed in ${Date.now()-Te}ms`);for(let E of Y){let ie=se.get(E.id),De=typeof ie=="string"?ie:JSON.stringify(ie),Dt=pt-we,Yb=Z.get(E.id)??0,Je;we+De.length>pt?(I(`[AIClient][${n}] Tool output budget exceeded (${pt} chars)`),Je=this.budgetTruncate(De,Dt)):typeof ie=="string"&&ie.length>this.toolResultMaxChars?Je=`${ie.slice(0,this.toolResultMaxChars)}
403
+ [TRUNCATED tool result: ${ie.length} chars]`:Je=De;let Yi=typeof Je=="string"?Je:JSON.stringify(Je);we+=Yi.length,$.push({role:"tool",tool_call_id:E.id,content:Je}),yield{delta:"",tool_calls:[{...E,result:Yi,duration:Yb}]}}y(`[AIClient][${n}] Round tool output size: ${we} chars (budget: ${pt})`),Xe("debug")&&(y(`[AIClient][${n}] stream() after_tools messages=${$.length}`),xn(n,$))}}catch(n){throw this.wrapError(n)}}async embed(e,t){let o=this.getProvider(t);try{return await o.embed(e)}catch(n){throw this.wrapError(n)}}async enrichRequestWithTools(e){if(this.activeMode?.blockAllTools)return S(`[AIClient] Mode "${this.activeMode.displayName}" blocks all tools`),{request:e,requestToolMap:new Map};let t=this.buildRequestToolMap(e.requestTools),o=Array.from(t.values()).map(m=>this.requestToolToSchema(m)),n=t.size>0;if(!this.toolsConfig.enabled&&!n)return y("[AIClient] Tools disabled and no request-scoped tools"),{request:e,requestToolMap:t};let s=this.toolsConfig;if(this.activeMode?.toolSearch&&this.toolsConfig.toolSearch&&(s={...this.toolsConfig,toolSearch:{...this.toolsConfig.toolSearch,...this.activeMode.toolSearch.enabled!==void 0?{enabled:this.activeMode.toolSearch.enabled}:{},...this.activeMode.toolSearch.alwaysLoadedTools?{alwaysLoadedTools:this.activeMode.toolSearch.alwaysLoadedTools}:{},...this.activeMode.toolSearch.alwaysLoadedCategories?{alwaysLoadedCategories:this.activeMode.toolSearch.alwaysLoadedCategories}:{}}},y(`[AIClient] Merged mode toolSearch config: enabled=${s.toolSearch?.enabled}, alwaysLoadedTools=${s.toolSearch?.alwaysLoadedTools?.length||0}`)),e.tools&&e.tools.length>0){if(!s.toolSearch?.enabled||!this.toolRegistry){y(`[AIClient] Request already has ${e.tools.length} tools`);let b=this.mergeToolCallRequests(e.tools,this.schemasToToolCallRequests(o)),T=b===e.tools?e:{...e,tools:b};return{request:this.injectRequestToolGuidance(T,b),requestToolMap:t}}let m=await this.toolRouter.resolve(e.messages,this.toolRegistry,s);if(y(`[AIClient] Resolved ${m.length} tools to send: ${m.map(b=>b.name).join(", ")||"none"}`),this.activeMode&&m.length>0){let b=m.length;m=this.filterSchemasByMode(m,this.activeMode);let T=b-m.length;T>0&&S(`[AIClient] Mode "${this.activeMode.displayName}" filtered out ${T} tools`)}let f=new Set(e.tools.map(b=>b.function.name)),g=m.filter(b=>!f.has(b.name)).map(b=>({type:"function",function:{name:b.name,description:b.description,parameters:b.parameters}}));if(g.length===0){y(`[AIClient] Request already has ${e.tools.length} tools (no new discoveries)`);let b=this.mergeToolCallRequests(e.tools,this.schemasToToolCallRequests(o)),T=b===e.tools?e:{...e,tools:b};return{request:this.injectRequestToolGuidance(T,b),requestToolMap:t}}let w={...e,tools:this.mergeToolCallRequests([...e.tools,...g],this.schemasToToolCallRequests(o))};return s.toolSearch?.enabled&&this.toolRegistry&&(w=this.injectToolSearchPrompt(w)),{request:this.injectRequestToolGuidance(w,w.tools),requestToolMap:t}}if(!this.toolRegistry){y("[AIClient] Tool registry not configured, skipping tool resolution");let m=this.schemasToToolCallRequests(o),f=m.length>0?{...e,tools:m}:e;return{request:this.injectRequestToolGuidance(f,m),requestToolMap:t}}let i=this.toolRegistry,a=await this.toolRouter.resolve(e.messages,i,s);if(y(`[AIClient] Resolved ${a.length} tools to send: ${a.map(m=>m.name).join(", ")||"none"}`),this.activeMode&&a.length>0){let m=a.length;a=this.filterSchemasByMode(a,this.activeMode);let f=m-a.length;f>0&&S(`[AIClient] Mode "${this.activeMode.displayName}" filtered out ${f} tools`)}let l=this.schemasToToolCallRequests(this.mergeSchemas(a,o));if(l.length===0)return{request:e,requestToolMap:t};let p={...e,tools:l};return this.toolsConfig.toolSearch?.enabled&&i&&(p=this.injectToolSearchPrompt(p)),{request:this.injectRequestToolGuidance(p,l),requestToolMap:t}}buildRequestToolMap(e){let t=new Map;for(let o of e||[])t.set(o.name,o);return t}requestToolToSchema(e){return{name:e.name,displayName:e.displayName,description:e.description,parameters:e.parameters,category:e.category,cacheable:e.cacheable}}mergeSchemas(e,t){let o=new Map;for(let n of e)o.set(n.name,n);for(let n of t)o.set(n.name,n);return Array.from(o.values())}schemasToToolCallRequests(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:t.parameters}}))}mergeToolCallRequests(e,t){if(t.length===0)return e;let o=new Map;for(let n of e)o.set(n.function.name,n);for(let n of t)o.set(n.function.name,n);return Array.from(o.values())}injectRequestToolGuidance(e,t){let o=new Set((t||e.tools||[]).map(l=>l.function.name));if(o.size===0)return e;let n="<!-- TOOLPACK_REQUEST_TOOL_GUIDANCE -->",s=[];if(o.has("knowledge_search")||o.has("knowledge_add")){let l=["Knowledge Base:"];o.has("knowledge_search")&&l.push("- Use `knowledge_search` when you need factual or domain-specific information that may already be stored."),o.has("knowledge_add")&&l.push("- Use `knowledge_add` when you encounter a durable fact, user preference, or decision that future conversations should know. Do not add confidential information, routine task outputs, or context that is specific to this conversation only."),s.push(l.join(`
404
404
  `))}if(o.has("conversation_search")&&s.push("Conversation History:\n- Only recent messages may be present in context.\n- Use `conversation_search` to find relevant details from earlier in this conversation when needed."),s.length===0)return e;let i=`${n}
405
405
  ${s.join(`
406
406
 
407
- `)}`,a=e.messages.findIndex(c=>c.role==="system");if(a>=0){let c=e.messages.map((p,m)=>{if(m!==a)return p;let f=typeof p.content=="string"?p.content:"";return f.includes(n)?p:{...p,content:`${f}
407
+ `)}`,a=e.messages.findIndex(l=>l.role==="system");if(a>=0){let l=e.messages.map((p,m)=>{if(m!==a)return p;let f=typeof p.content=="string"?p.content:"";return f.includes(n)?p:{...p,content:`${f}
408
408
 
409
- ${i}`.trim()}});return{...e,messages:c}}return{...e,messages:[{role:"system",content:i},...e.messages]}}stripRequestTools(e){let{requestTools:t,...o}=e;return o}filterSchemasByMode(e,t){return e.filter(o=>{if(t.blockedTools.includes(o.name)||t.blockedToolCategories.includes(o.category))return!1;if(bn(o.name)){let i=t.toolSearch?.enabled;if(i!==void 0?i:this.toolsConfig.toolSearch?.enabled??!1)return!0}let n=t.allowedTools.length>0,s=t.allowedToolCategories.length>0;if(n||s){let i=n&&t.allowedTools.includes(o.name),a=s&&t.allowedToolCategories.includes(o.category);return i||a}return!0})}injectModeSystemPrompt(e){if(!this.activeMode||!this.activeMode.systemPrompt)return y(`[AIClient] injectModeSystemPrompt: No active mode or empty systemPrompt. activeMode=${this.activeMode?.name}, systemPrompt=${this.activeMode?.systemPrompt?.substring(0,50)}`),e;let t=this.activeMode.systemPrompt;if(y(`[AIClient] injectModeSystemPrompt: Injecting mode prompt for ${this.activeMode.name}, length=${t.length}`),e.messages.some(n=>n.role==="system")){let n=e.messages.map(s=>{if(s.role==="system"){let i=typeof s.content=="string"?s.content:"";return{...s,content:`${i}
409
+ ${i}`.trim()}});return{...e,messages:l}}return{...e,messages:[{role:"system",content:i},...e.messages]}}stripRequestTools(e){let{requestTools:t,...o}=e;return o}filterSchemasByMode(e,t){return e.filter(o=>{if(t.blockedTools.includes(o.name)||t.blockedToolCategories.includes(o.category))return!1;if(wn(o.name)){let i=t.toolSearch?.enabled;if(i!==void 0?i:this.toolsConfig.toolSearch?.enabled??!1)return!0}let n=t.allowedTools.length>0,s=t.allowedToolCategories.length>0;if(n||s){let i=n&&t.allowedTools.includes(o.name),a=s&&t.allowedToolCategories.includes(o.category);return i||a}return!0})}injectModeSystemPrompt(e){if(!this.activeMode||!this.activeMode.systemPrompt)return y(`[AIClient] injectModeSystemPrompt: No active mode or empty systemPrompt. activeMode=${this.activeMode?.name}, systemPrompt=${this.activeMode?.systemPrompt?.substring(0,50)}`),e;let t=this.activeMode.systemPrompt;if(y(`[AIClient] injectModeSystemPrompt: Injecting mode prompt for ${this.activeMode.name}, length=${t.length}`),e.messages.some(n=>n.role==="system")){let n=e.messages.map(s=>{if(s.role==="system"){let i=typeof s.content=="string"?s.content:"";return{...s,content:`${i}
410
410
 
411
411
  ${t}`}}return s});return{...e,messages:n}}else return{...e,messages:[{role:"system",content:t},...e.messages]}}injectOverrideSystemPrompt(e){if(!this.overrideSystemPrompt)return e;let t=this.overrideSystemPrompt;if(e.messages.some(n=>n.role==="system")){let n=e.messages.map(s=>{if(s.role==="system"){let i=typeof s.content=="string"?s.content:"";return{...s,content:`${i}
412
412
 
413
- ${t}`}}return s});return{...e,messages:n}}else return{...e,messages:[{role:"system",content:t},...e.messages]}}injectBaseAgentContext(e){let t=!0,o=!0,n,s=this.disableBaseContext;if(this.activeMode?.baseContext===!1)return e;this.activeMode?.baseContext&&(t=this.activeMode.baseContext.includeWorkingDirectory!==!1,o=this.activeMode.baseContext.includeToolCategories!==!1,n=this.activeMode.baseContext.custom);let i=n||pa({workingDirectory:process.cwd(),toolCategories:this.toolRegistry?this.toolRegistry.getCategories():[],disabled:s,includeWorkingDirectory:t,includeToolCategories:o});if(!i)return e;if(e.messages.some(c=>c.role==="system")){let c=e.messages.map(p=>{if(p.role==="system"){let m=typeof p.content=="string"?p.content:"";return{...p,content:`${i}
413
+ ${t}`}}return s});return{...e,messages:n}}else return{...e,messages:[{role:"system",content:t},...e.messages]}}injectBaseAgentContext(e){let t=!0,o=!0,n,s=this.disableBaseContext;if(this.activeMode?.baseContext===!1)return e;this.activeMode?.baseContext&&(t=this.activeMode.baseContext.includeWorkingDirectory!==!1,o=this.activeMode.baseContext.includeToolCategories!==!1,n=this.activeMode.baseContext.custom);let i=n||da({workingDirectory:process.cwd(),toolCategories:this.toolRegistry?this.toolRegistry.getCategories():[],disabled:s,includeWorkingDirectory:t,includeToolCategories:o});if(!i)return e;if(e.messages.some(l=>l.role==="system")){let l=e.messages.map(p=>{if(p.role==="system"){let m=typeof p.content=="string"?p.content:"";return{...p,content:`${i}
414
414
 
415
- ${m}`}}return p});return{...e,messages:c}}else return{...e,messages:[{role:"system",content:i},...e.messages]}}injectToolSearchPrompt(e){if(!this.toolRegistry)return e;let t=e.messages.some(i=>i.role==="system"),o=this.toolsConfig.toolSearch?.alwaysLoadedTools??[],n="";if(o.length>0){let i=o.map(a=>{let c=this.toolRegistry?.get(a);return c?` - **${c.name}**: ${c.description}`:null}).filter(Boolean).join(`
415
+ ${m}`}}return p});return{...e,messages:l}}else return{...e,messages:[{role:"system",content:i},...e.messages]}}injectToolSearchPrompt(e){if(!this.toolRegistry)return e;let t=e.messages.some(i=>i.role==="system"),o=this.toolsConfig.toolSearch?.alwaysLoadedTools??[],n="";if(o.length>0){let i=o.map(a=>{let l=this.toolRegistry?.get(a);return l?` - **${l.name}**: ${l.description}`:null}).filter(Boolean).join(`
416
416
  `);i&&(n=`
417
417
 
418
418
  You have these tools always available:
@@ -423,7 +423,7 @@ IMPORTANT: Tool Discovery Instructions
423
423
 
424
424
  You have access to a limited set of tools. If you need a tool that is not in your current list, you MUST use the 'tool.search' tool to discover it.${n}
425
425
 
426
- ${Ir(this.toolRegistry)}
426
+ ${Lr(this.toolRegistry)}
427
427
 
428
428
  When you need a tool:
429
429
  1. Check if it's in your current tool list
@@ -431,13 +431,13 @@ When you need a tool:
431
431
  3. After discovering tools, you can call them directly in subsequent turns
432
432
 
433
433
  NEVER guess or hallucinate tool names. ALWAYS use tool.search to discover tools you don't have.
434
- `.trim();if(t){let i=e.messages.map(a=>{if(a.role==="system"){let c=typeof a.content=="string"?a.content:"";return{...a,content:`${c}
434
+ `.trim();if(t){let i=e.messages.map(a=>{if(a.role==="system"){let l=typeof a.content=="string"?a.content:"";return{...a,content:`${l}
435
435
 
436
- ${s}`}}return a});return{...e,messages:i}}else return{...e,messages:[{role:"system",content:s},...e.messages]}}async executeTool(e,t){let o=Date.now();this.emit("tool:started",{toolName:e.name,toolCallId:e.id,status:"started",args:e.arguments}),P(`[AIClient] Executing tool: ${e.name} with args: ${O(e.arguments,500)}`);let n=t.get(e.name),s=n?void 0:this.toolRegistry?.get(e.name);if(!n&&!this.toolRegistry){let a="No tool registry configured";return this.emit("tool:failed",{toolName:e.name,toolCallId:e.id,status:"failed",error:a,duration:Date.now()-o}),JSON.stringify({error:a})}if(bn(e.name)){let a=this.executeToolSearch(e.arguments),c=Date.now()-o;return this.emit("tool:completed",{toolName:e.name,toolCallId:e.id,status:"completed",result:typeof a=="string"?a.substring(0,200):JSON.stringify(a).substring(0,200),duration:c}),this.emit("tool:log",{id:e.id,name:e.name,arguments:e.arguments,result:a,duration:c,status:"success",timestamp:Date.now()}),a}let i=n||s;if(!i){I(`[AIClient] Tool '${e.name}' not found in registry`);let a=this.findSimilarToolName(e.name),c=a?`Tool '${e.name}' not found. Did you mean '${a}'? Use tool.search to discover available tools.`:`Tool '${e.name}' not found. Use tool.search to discover available tools.`;return this.emit("tool:failed",{toolName:e.name,toolCallId:e.id,status:"failed",error:c,duration:Date.now()-o}),JSON.stringify({error:c})}try{let a=e.arguments;if(s?.confirmation&&this.onToolConfirm&&!this.isBypassed(s)){this.emit("tool:confirmation_requested",{tool:s,args:a,level:s.confirmation.level,reason:s.confirmation.reason});let g=await this.onToolConfirm(s,a,{roundNumber:this.currentRound,conversationId:this.conversationId});if(this.emit("tool:confirmation_resolved",{tool:s,args:a,level:s.confirmation.level,reason:s.confirmation.reason,decision:g}),g.action==="deny"){let w=`[Execution denied by user${g.reason?": "+g.reason:""}]`,b=Date.now()-o;return this.emit("tool:completed",{toolName:e.name,toolCallId:e.id,status:"completed",result:w,duration:b}),this.emit("tool:log",{id:e.id,name:e.name,arguments:a,result:w,duration:b,status:"success",timestamp:Date.now()}),w}g.action==="modify"&&(a=g.args)}let c={workspaceRoot:process.cwd(),config:this.toolsConfig?.additionalConfigurations??{},log:g=>P(`[Tool] ${g}`)},p=n?await n.execute(a):await i.execute(a,c),m=Date.now()-o;this.emit("tool:completed",{toolName:e.name,toolCallId:e.id,status:"completed",result:typeof p=="string"?p.substring(0,200):JSON.stringify(p).substring(0,200),duration:m}),this.emit("tool:log",{id:e.id,name:e.name,arguments:e.arguments,result:p,duration:m,status:"success",timestamp:Date.now()});let f=typeof p=="string"?p.length:JSON.stringify(p).length;return P(`[AIClient] Tool ${e.name} executed successfully in ${m}ms result_len=${f}`),Ye("debug")&&y(`[AIClient] Tool ${e.name} result_preview=${O(p,400)}`),typeof p=="string"?p:JSON.stringify(p)}catch(a){let c=Date.now()-o,p=a.message||"Tool execution failed";return this.emit("tool:failed",{toolName:e.name,toolCallId:e.id,status:"failed",error:p,duration:c}),this.emit("tool:log",{id:e.id,name:e.name,arguments:e.arguments,result:JSON.stringify({error:p}),duration:c,status:"error",timestamp:Date.now()}),pe(`[AIClient] Tool ${e.name} failed: ${O(p,300)}`),JSON.stringify({error:p})}}findSimilarToolName(e){if(!this.toolRegistry)return null;let t=this.toolRegistry.getAll(),o=e.replace(/_/g,".");if(t.some(c=>c.name===o))return o;let n=e.replace(/\./g,"_");if(t.some(c=>c.name===n))return n;let s=e.replace(/([a-z])([A-Z])/g,"$1_$2").toLowerCase().replace(/_/g,".");if(t.some(c=>c.name===s))return s;let i=null,a=1/0;for(let c of t){let p=this.levenshteinDistance(e.toLowerCase(),c.name.toLowerCase());p<=2&&p<a&&(a=p,i=c.name)}return i}levenshteinDistance(e,t){let o=[];for(let n=0;n<=t.length;n++)o[n]=[n];for(let n=0;n<=e.length;n++)o[0][n]=n;for(let n=1;n<=t.length;n++)for(let s=1;s<=e.length;s++)t.charAt(n-1)===e.charAt(s-1)?o[n][s]=o[n-1][s-1]:o[n][s]=Math.min(o[n-1][s-1]+1,o[n][s-1]+1,o[n-1][s]+1);return o[t.length][e.length]}executeToolSearch(e){let{query:t,category:o}=e,n=this.toolsConfig.toolSearch?.searchResultLimit??5,s=typeof o=="string"&&o.length>0?o:void 0;if(this.activeMode&&!(this.filterSchemasByMode([At()],this.activeMode).length>0))return I("[AIClient] tool.search blocked by active mode"),JSON.stringify({query:t,found:0,tools:[],hint:"tool.search is not allowed in the current mode."});P(`[AIClient] Executing tool.search: query="${t}" category=${s||"all"} limit=${n}`);let i=this.activeMode?Math.max(n*4,n):n,a=this.bm25Engine.search(t,{limit:i,category:s});if(this.activeMode&&a.length>0){let p=this.filterSchemasByMode(a.map(w=>w.tool),this.activeMode),m=new Set(p.map(w=>w.name)),f=a.length;a=a.filter(w=>m.has(w.toolName));let g=f-a.length;g>0&&y(`[AIClient] tool.search filtered out ${g} disallowed results for mode "${this.activeMode.displayName}"`)}a.length>n&&(a=a.slice(0,n));let c=a.map(p=>p.toolName);return this.toolRouter.getDiscoveryCache().recordDiscovery(t,c),y(`[AIClient] tool.search found ${a.length} tools: ${c.join(", ")||"none"}`),JSON.stringify({query:t,found:a.length,tools:a.map(p=>({name:p.tool.name,displayName:p.tool.displayName,description:p.tool.description,category:p.tool.category,parameters:p.tool.parameters,relevanceScore:Math.round(p.score*100)/100})),hint:a.length>0?`Found ${a.length} tools. You can now call any of these tools directly.`:`No tools found for "${t}". Try a different search term.`})}wrapError(e){return e instanceof A?e:new W(e.message||"Unknown provider error","UNKNOWN_PROVIDER_ERROR",500,e)}budgetTruncate(e,t){let o=`
437
- [Output truncated \u2014 round budget reached. Call the tool again with a narrower query to retrieve more.]`,s=t-o.length;return s>=100?e.slice(0,s)+o:"[Tool output omitted \u2014 round budget exhausted. Call the tool again with a narrower query.]"}};l();l();import Sa from"@anthropic-ai/sdk";l();ce();var Z=class{name;async getModels(){return[]}getDisplayName(){return this.name||this.constructor.name.replace(/Adapter$/,"")}supportsFileUpload(){return!1}async uploadFile(e){throw new j(`File upload API is not supported by ${this.getDisplayName()}`)}async deleteFile(e){throw new j(`File deletion API is not supported by ${this.getDisplayName()}`)}async countTokens(e,t){return null}};ce();k();var vn=class extends Z{client;constructor(e,t){super(),this.client=new Sa({apiKey:e,baseURL:t})}supportsFileUpload(){return!0}async uploadFile(e){try{let t=await import("fs");if(!e.filePath)throw new j("Anthropic uploadFile requires a filePath.");return{id:(await this.client.files.create({file:t.createReadStream(e.filePath),purpose:e.purpose||"vision"})).id}}catch(t){throw this.handleError(t)}}async deleteFile(e){try{await this.client.files.delete(e)}catch(t){throw this.handleError(t)}}getDisplayName(){return"Anthropic"}async getModels(){return[{id:"claude-haiku-4-5-20251001",displayName:"Claude Haiku 4.5",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:2e5,maxOutputTokens:64e3},{id:"claude-sonnet-4-5-20250929",displayName:"Claude Sonnet 4.5",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:2e5,maxOutputTokens:16384},{id:"claude-sonnet-4-6",displayName:"Claude Sonnet 4.6",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:2e5,maxOutputTokens:16384},{id:"claude-opus-4-5",displayName:"Claude Opus 4.5",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:2e5,maxOutputTokens:16384},{id:"claude-opus-4-6",displayName:"Claude Opus 4.6",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:2e5,maxOutputTokens:16384}]}sanitizeToolName(e){return e.replace(/\./g,"_")}restoreToolName(e,t){return t?.find(n=>this.sanitizeToolName(n.function.name)===e)?.function.name||e.replace(/_/g,".")}async generate(e){try{let t=e.__toolpack_request_id||`gen-${Date.now()}`,o=await this.toAnthropicMessages(e.messages,e.mediaOptions),n=o.system,s=o.userMessages,i={model:e.model,messages:s,system:n,max_tokens:e.max_tokens||4096,temperature:e.temperature,top_p:e.top_p,stream:!1};e.tools&&e.tools.length>0?(i.tools=e.tools.map(m=>({name:this.sanitizeToolName(m.function.name),description:m.function.description,input_schema:m.function.parameters})),e.tool_choice==="required"?i.tool_choice={type:"any"}:e.tool_choice==="none"?delete i.tools:i.tool_choice={type:"auto"},y(`[Anthropic][${t}] Sending ${i.tools?.length||0} tools with tool_choice: ${i.tool_choice?.type||"unset"}`),i.tools&&i.tools.length>0&&y(`[Anthropic][${t}] First tool: ${O(i.tools[0],800)}`)):y(`[Anthropic][${t}] NO TOOLS in request`),y(`[Anthropic][${t}] generate() request: model=${i.model}, messages=${i.messages.length}, tools=${i.tools?.length||0}, tool_choice=${i.tool_choice?.type??"unset"}`),Y(t,"Anthropic",i.messages);let a=await this.client.messages.create(i,e.signal?{signal:e.signal}:void 0),c=[],p=[];for(let m of a.content)m.type==="text"?c.push(m.text):m.type==="tool_use"&&p.push({id:m.id,name:this.restoreToolName(m.name,e.tools),arguments:m.input});return y(`[Anthropic][${t}] Response finish_reason=${a.stop_reason} tool_calls=${p.length} content_preview=${O(c.join(""),200)}`),{content:c.length>0?c.join(""):null,usage:{prompt_tokens:a.usage.input_tokens,completion_tokens:a.usage.output_tokens,total_tokens:a.usage.input_tokens+a.usage.output_tokens},finish_reason:this.mapFinishReason(a.stop_reason),tool_calls:p.length>0?p:void 0,raw:a}}catch(t){throw this.handleError(t)}}async*stream(e){try{let t=e.__toolpack_request_id||`str-${Date.now()}`,o=await this.toAnthropicMessages(e.messages,e.mediaOptions),n={model:e.model,messages:o.userMessages,system:o.system,max_tokens:e.max_tokens||4096,temperature:e.temperature,top_p:e.top_p,stream:!0};e.tools&&e.tools.length>0?(n.tools=e.tools.map(m=>({name:this.sanitizeToolName(m.function.name),description:m.function.description,input_schema:m.function.parameters})),e.tool_choice==="required"?n.tool_choice={type:"any"}:e.tool_choice==="none"?delete n.tools:n.tool_choice={type:"auto"},y(`[Anthropic][${t}] Sending ${n.tools?.length||0} tools with tool_choice: ${n.tool_choice?.type||"unset"}`),n.tools&&n.tools.length>0&&y(`[Anthropic][${t}] First tool: ${O(n.tools[0],800)}`)):y(`[Anthropic][${t}] NO TOOLS in request`),y(`[Anthropic][${t}] Stream request: model=${n.model}, messages=${n.messages.length}, tools=${n.tools?.length||0}, tool_choice=${n.tool_choice?.type??"unset"}`),Y(t,"Anthropic",n.messages);let s=await this.client.messages.create(n,e.signal?{signal:e.signal}:void 0),i="",a="",c="",p=!1;for await(let m of s)m.type==="content_block_start"&&m.content_block?.type==="tool_use"&&(p=!0,i=m.content_block.id,a=m.content_block.name,c=""),m.type==="content_block_delta"&&(m.delta.type==="text_delta"?yield{delta:m.delta.text}:m.delta.type==="input_json_delta"&&p&&(c+=m.delta.partial_json)),m.type==="content_block_stop"&&p&&(y(`[Anthropic][${t}] Stream finish_reason=tool_calls accumulated_call=${a}`),yield{delta:"",finish_reason:"tool_calls",tool_calls:[{id:i,name:this.restoreToolName(a,e.tools),arguments:JSON.parse(c||"{}")}]},p=!1),m.type==="message_stop"&&(Ae(`[Anthropic][${t}] Stream chunk finish_reason=stop`),yield{delta:"",finish_reason:"stop"})}catch(t){throw this.handleError(t)}}async embed(e){throw new j("Embeddings are not strictly supported by the Anthropic API currently.")}async toAnthropicMessages(e,t={}){let o,n=[],{normalizeImagePart:s}=await Promise.resolve().then(()=>(gt(),qt));for(let i of e)if(i.role==="system"){if(typeof i.content=="string")o=i.content;else if(i.content!==null){let a=i.content.filter(c=>typeof c=="object"&&c.type==="text").map(c=>c.text).join(`
438
- `);a&&(o=a)}}else if(i.role==="tool"&&i.tool_call_id)n.push({role:"user",content:[{type:"tool_result",tool_use_id:i.tool_call_id,content:typeof i.content=="string"?i.content:JSON.stringify(i.content)}]});else if(i.role==="assistant"&&i.tool_calls&&i.tool_calls.length>0){let a=[];if(typeof i.content=="string"&&i.content)a.push({type:"text",text:i.content});else if(Array.isArray(i.content)){let c=i.content.filter(p=>typeof p=="object"&&p.type==="text").map(p=>p.text).join(`
439
- `);c&&a.push({type:"text",text:c})}for(let c of i.tool_calls)a.push({type:"tool_use",id:c.id,name:this.sanitizeToolName(c.function.name),input:typeof c.function.arguments=="string"?JSON.parse(c.function.arguments||"{}"):c.function.arguments});n.push({role:"assistant",content:a})}else{let a=[];typeof i.content=="string"?a=i.content:i.content!==null&&(a=(await Promise.all(i.content.map(async c=>{if(c.type==="text")return{type:"text",text:c.text};if(c.type==="image_url"){let p=c.image_url.url;if(p.startsWith("data:")){let m=p.match(/^data:(image\/\w+);base64,(.+)$/);if(m)return{type:"image",source:{type:"base64",media_type:m[1],data:m[2]}}}return{type:"image",source:{type:"url",url:p}}}if(c.type==="image_data"||c.type==="image_file"){let{data:p,mimeType:m}=await s(c);return{type:"image",source:{type:"base64",media_type:m,data:p}}}return null}))).filter(Boolean)),n.push({role:i.role==="user"?"user":"assistant",content:a})}return{system:o,userMessages:n}}mapFinishReason(e){return e==="end_turn"?"stop":e==="max_tokens"?"length":e==="stop_sequence"?"stop":e}handleError(e){if(e instanceof Sa.APIError){let t=e.message;return e.status===401?new we(t,e):e.status===429?new Pe(t,void 0,e):e.status&&e.status>=400&&e.status<500?new j(t,e):new W(t,"ANTHROPIC_ERROR",e.status||500,e)}return new W("Unknown Anthropic error","UNKNOWN",500,e)}};l();import{VertexAI as vw}from"@google-cloud/vertexai";ce();k();var Cn=class extends Z{vertexAI;location;constructor(e={}){super(),this.name="vertexai";let t=e.projectId??process.env.TOOLPACK_VERTEXAI_PROJECT??process.env.VERTEX_AI_PROJECT??process.env.GOOGLE_CLOUD_PROJECT;if(!t)throw new we("Vertex AI requires a GCP project ID. Pass projectId in config or set TOOLPACK_VERTEXAI_PROJECT / VERTEX_AI_PROJECT / GOOGLE_CLOUD_PROJECT.");this.location=e.location??process.env.TOOLPACK_VERTEXAI_LOCATION??process.env.VERTEX_AI_LOCATION??"us-central1",this.vertexAI=new vw({project:t,location:this.location,googleAuthOptions:e.googleAuthOptions})}getDisplayName(){return"Google Vertex AI"}async getModels(){return[{id:"gemini-2.5-pro-preview-05-06",displayName:"Gemini 2.5 Pro Preview",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0},contextWindow:1048576,maxOutputTokens:65536},{id:"gemini-2.5-flash-preview-04-17",displayName:"Gemini 2.5 Flash Preview",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0},contextWindow:1048576,maxOutputTokens:65536},{id:"gemini-2.0-flash-001",displayName:"Gemini 2.0 Flash",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0},contextWindow:1048576,maxOutputTokens:8192},{id:"gemini-1.5-pro-002",displayName:"Gemini 1.5 Pro",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0},contextWindow:2097152,maxOutputTokens:8192},{id:"gemini-1.5-flash-002",displayName:"Gemini 1.5 Flash",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0},contextWindow:1048576,maxOutputTokens:8192}]}async generate(e){try{let t=e.__toolpack_request_id||`vtx-${Date.now()}`;y(`[VertexAI][${t}] generate() model=${e.model} messages=${e.messages.length} tools=${e.tools?.length??0}`),Y(t,"VertexAI",e.messages);let o=this.buildModel(e),{history:n,lastUserMessage:s}=this.formatHistory(e.messages),c=(await o.startChat({history:n}).sendMessage(s)).response,{content:p,toolCalls:m}=this.parseResponse(c,e.tools);return y(`[VertexAI][${t}] Response finish_reason=${m.length>0?"tool_calls":"stop"} tool_calls=${m.length} content_preview=${O(p,200)}`),{content:p||null,usage:{prompt_tokens:c.usageMetadata?.promptTokenCount??0,completion_tokens:c.usageMetadata?.candidatesTokenCount??0,total_tokens:c.usageMetadata?.totalTokenCount??0},finish_reason:m.length>0?"tool_calls":"stop",tool_calls:m.length>0?m:void 0,raw:c}}catch(t){throw this.handleError(t)}}async*stream(e){try{let t=e.__toolpack_request_id||`vtx-str-${Date.now()}`;y(`[VertexAI][${t}] stream() model=${e.model} messages=${e.messages.length} tools=${e.tools?.length??0}`),Y(t,"VertexAI",e.messages);let o=this.buildModel(e),{history:n,lastUserMessage:s}=this.formatHistory(e.messages),a=await o.startChat({history:n}).sendMessageStream(s);for await(let c of a.stream)for(let p of c.candidates??[])for(let m of p.content?.parts??[])if(m.functionCall){let f=m.functionCall;y(`[VertexAI][${t}] stream tool_call name=${f.name}`),yield{delta:"",finish_reason:"tool_calls",tool_calls:[{id:`vtx_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,name:this.restoreToolName(f.name,e.tools),arguments:f.args??{}}]}}else m.text&&(yield{delta:m.text})}catch(t){throw this.handleError(t)}}async embed(e){throw new j("Vertex AI embeddings are not supported by this adapter. Use the Gemini adapter (gemini provider) with text-embedding-004 instead.")}buildModel(e){let t={model:e.model,systemInstruction:this.extractSystemInstruction(e.messages),generationConfig:{maxOutputTokens:e.max_tokens,temperature:e.temperature,topP:e.top_p,responseMimeType:e.response_format==="json_object"?"application/json":"text/plain"}};return e.tools&&e.tools.length>0&&(t.tools=[{functionDeclarations:e.tools.map(o=>({name:this.sanitizeToolName(o.function.name),description:o.function.description,parameters:this.sanitizeSchema(o.function.parameters)}))}]),this.vertexAI.getGenerativeModel(t)}formatHistory(e){let t=e.filter(i=>i.role!=="system");if(t.length===0)return{history:[],lastUserMessage:""};let o=t.slice(0,-1),n=t[t.length-1];return{history:o.map(i=>{if(i.role==="tool"&&i.tool_call_id)return{role:"function",parts:[{functionResponse:{name:this.sanitizeToolName(i.name??i.tool_call_id),response:{name:this.sanitizeToolName(i.name??i.tool_call_id),content:typeof i.content=="string"?i.content:JSON.stringify(i.content)}}}]};if(i.role==="assistant"&&i.tool_calls&&i.tool_calls.length>0){let a=[];typeof i.content=="string"&&i.content&&a.push({text:i.content});for(let c of i.tool_calls)a.push({functionCall:{name:this.sanitizeToolName(c.function.name),args:typeof c.function.arguments=="string"?JSON.parse(c.function.arguments||"{}"):c.function.arguments}});return{role:"model",parts:a}}return{role:i.role==="user"?"user":"model",parts:this.contentToParts(i.content)}}),lastUserMessage:this.contentToParts(n.content)}}contentToParts(e){return typeof e=="string"?[{text:e}]:e?e.map(t=>t.type==="text"?{text:t.text}:t.type==="image_data"?{inlineData:{mimeType:t.mimeType??"image/jpeg",data:t.data}}:null).filter(t=>t!==null):[]}parseResponse(e,t){let o=[],n="";for(let s of e.candidates??[])for(let i of s.content?.parts??[])if(i.text&&(n+=i.text),i.functionCall){let a=i.functionCall;o.push({id:`vtx_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,name:this.restoreToolName(a.name,t),arguments:a.args??{}})}return{content:n,toolCalls:o}}extractSystemInstruction(e){let t=e.filter(o=>o.role==="system");if(t.length!==0)return t.map(o=>typeof o.content=="string"?o.content:"").join(`
440
- `)}sanitizeToolName(e){return e.replace(/\./g,"_")}restoreToolName(e,t){return t?.find(n=>this.sanitizeToolName(n.function.name)===e)?.function.name??e.replace(/_/g,".")}sanitizeSchema(e){if(!e||typeof e!="object")return e;let t={};for(let[o,n]of Object.entries(e))["additionalProperties","exclusiveMinimum","exclusiveMaximum","$schema","$id","definitions","$defs"].includes(o)||(t[o]=typeof n=="object"&&n!==null?Array.isArray(n)?n.map(s=>this.sanitizeSchema(s)):this.sanitizeSchema(n):n);return t}handleError(e){let t=e?.message??String(e);return e?.status===429||t.includes("RESOURCE_EXHAUSTED")?new Pe(t,void 0,e):e?.status===401||e?.status===403||t.includes("UNAUTHENTICATED")||t.includes("PERMISSION_DENIED")?new we(t,e):e?.status>=400&&e?.status<500?new j(t,e):new W(t||"Vertex AI Error","VERTEXAI_ERROR",e?.status??500,e)}};l();import{GoogleGenerativeAI as Cw}from"@google/generative-ai";ce();k();var kn=class extends Z{genAI;constructor(e){super(),this.genAI=new Cw(e)}supportsFileUpload(){return!0}sanitizeSchema(e){if(!e||typeof e!="object")return e;let t={};for(let[o,n]of Object.entries(e))o==="additionalProperties"||o==="exclusiveMinimum"||o==="exclusiveMaximum"||o==="$schema"||o==="$id"||o==="definitions"||o==="$defs"||(typeof n=="object"&&n!==null?Array.isArray(n)?t[o]=n.map(s=>this.sanitizeSchema(s)):t[o]=this.sanitizeSchema(n):t[o]=n);return t}async uploadFile(e){try{let t=await import("fs"),o=await import("path");if(!e.filePath)throw new j("Gemini uploadFile requires a filePath.");let n=await t.promises.readFile(e.filePath),s=o.basename(e.filePath),i=e.mimeType||"application/octet-stream",c=`https://generativelanguage.googleapis.com/upload/v1beta/files?key=${this.genAI.apiKey}`,p="----WebKitFormBoundary"+Math.random().toString(36).substring(2),m=JSON.stringify({file:{displayName:s}}),f=Buffer.concat([Buffer.from(`--${p}\r
436
+ ${s}`}}return a});return{...e,messages:i}}else return{...e,messages:[{role:"system",content:s},...e.messages]}}async executeTool(e,t){let o=Date.now();this.emit("tool:started",{toolName:e.name,toolCallId:e.id,status:"started",args:e.arguments}),S(`[AIClient] Executing tool: ${e.name} with args: ${O(e.arguments,500)}`);let n=t.get(e.name),s=n?void 0:this.toolRegistry?.get(e.name);if(!n&&!this.toolRegistry){let a="No tool registry configured";return this.emit("tool:failed",{toolName:e.name,toolCallId:e.id,status:"failed",error:a,duration:Date.now()-o}),JSON.stringify({error:a})}if(wn(e.name)){let a=this.executeToolSearch(e.arguments),l=Date.now()-o;return this.emit("tool:completed",{toolName:e.name,toolCallId:e.id,status:"completed",result:typeof a=="string"?a.substring(0,200):JSON.stringify(a).substring(0,200),duration:l}),this.emit("tool:log",{id:e.id,name:e.name,arguments:e.arguments,result:a,duration:l,status:"success",timestamp:Date.now()}),a}let i=n||s;if(!i){I(`[AIClient] Tool '${e.name}' not found in registry`);let a=this.findSimilarToolName(e.name),l=a?`Tool '${e.name}' not found. Did you mean '${a}'? Use tool.search to discover available tools.`:`Tool '${e.name}' not found. Use tool.search to discover available tools.`;return this.emit("tool:failed",{toolName:e.name,toolCallId:e.id,status:"failed",error:l,duration:Date.now()-o}),JSON.stringify({error:l})}try{let a=e.arguments;if(s?.confirmation&&this.onToolConfirm&&!this.isBypassed(s)){this.emit("tool:confirmation_requested",{tool:s,args:a,level:s.confirmation.level,reason:s.confirmation.reason});let g=await this.onToolConfirm(s,a,{roundNumber:this.currentRound,conversationId:this.conversationId});if(this.emit("tool:confirmation_resolved",{tool:s,args:a,level:s.confirmation.level,reason:s.confirmation.reason,decision:g}),g.action==="deny"){let w=`[Execution denied by user${g.reason?": "+g.reason:""}]`,b=Date.now()-o;return this.emit("tool:completed",{toolName:e.name,toolCallId:e.id,status:"completed",result:w,duration:b}),this.emit("tool:log",{id:e.id,name:e.name,arguments:a,result:w,duration:b,status:"success",timestamp:Date.now()}),w}g.action==="modify"&&(a=g.args)}let l={workspaceRoot:process.cwd(),config:this.toolsConfig?.additionalConfigurations??{},log:g=>S(`[Tool] ${g}`)},p=n?await n.execute(a):await i.execute(a,l),m=Date.now()-o;this.emit("tool:completed",{toolName:e.name,toolCallId:e.id,status:"completed",result:typeof p=="string"?p.substring(0,200):JSON.stringify(p).substring(0,200),duration:m}),this.emit("tool:log",{id:e.id,name:e.name,arguments:e.arguments,result:p,duration:m,status:"success",timestamp:Date.now()});let f=typeof p=="string"?p.length:JSON.stringify(p).length;return S(`[AIClient] Tool ${e.name} executed successfully in ${m}ms result_len=${f}`),Xe("debug")&&y(`[AIClient] Tool ${e.name} result_preview=${O(p,400)}`),typeof p=="string"?p:JSON.stringify(p)}catch(a){let l=Date.now()-o,p=a.message||"Tool execution failed";return this.emit("tool:failed",{toolName:e.name,toolCallId:e.id,status:"failed",error:p,duration:l}),this.emit("tool:log",{id:e.id,name:e.name,arguments:e.arguments,result:JSON.stringify({error:p}),duration:l,status:"error",timestamp:Date.now()}),ce(`[AIClient] Tool ${e.name} failed: ${O(p,300)}`),JSON.stringify({error:p})}}findSimilarToolName(e){if(!this.toolRegistry)return null;let t=this.toolRegistry.getAll(),o=e.replace(/_/g,".");if(t.some(l=>l.name===o))return o;let n=e.replace(/\./g,"_");if(t.some(l=>l.name===n))return n;let s=e.replace(/([a-z])([A-Z])/g,"$1_$2").toLowerCase().replace(/_/g,".");if(t.some(l=>l.name===s))return s;let i=null,a=1/0;for(let l of t){let p=this.levenshteinDistance(e.toLowerCase(),l.name.toLowerCase());p<=2&&p<a&&(a=p,i=l.name)}return i}levenshteinDistance(e,t){let o=[];for(let n=0;n<=t.length;n++)o[n]=[n];for(let n=0;n<=e.length;n++)o[0][n]=n;for(let n=1;n<=t.length;n++)for(let s=1;s<=e.length;s++)t.charAt(n-1)===e.charAt(s-1)?o[n][s]=o[n-1][s-1]:o[n][s]=Math.min(o[n-1][s-1]+1,o[n][s-1]+1,o[n-1][s]+1);return o[t.length][e.length]}executeToolSearch(e){let{query:t,category:o}=e,n=this.toolsConfig.toolSearch?.searchResultLimit??5,s=typeof o=="string"&&o.length>0?o:void 0;if(this.activeMode&&!(this.filterSchemasByMode([It()],this.activeMode).length>0))return I("[AIClient] tool.search blocked by active mode"),JSON.stringify({query:t,found:0,tools:[],hint:"tool.search is not allowed in the current mode."});S(`[AIClient] Executing tool.search: query="${t}" category=${s||"all"} limit=${n}`);let i=this.activeMode?Math.max(n*4,n):n,a=this.bm25Engine.search(t,{limit:i,category:s});if(this.activeMode&&a.length>0){let p=this.filterSchemasByMode(a.map(w=>w.tool),this.activeMode),m=new Set(p.map(w=>w.name)),f=a.length;a=a.filter(w=>m.has(w.toolName));let g=f-a.length;g>0&&y(`[AIClient] tool.search filtered out ${g} disallowed results for mode "${this.activeMode.displayName}"`)}a.length>n&&(a=a.slice(0,n));let l=a.map(p=>p.toolName);return this.toolRouter.getDiscoveryCache().recordDiscovery(t,l),y(`[AIClient] tool.search found ${a.length} tools: ${l.join(", ")||"none"}`),JSON.stringify({query:t,found:a.length,tools:a.map(p=>({name:p.tool.name,displayName:p.tool.displayName,description:p.tool.description,category:p.tool.category,parameters:p.tool.parameters,relevanceScore:Math.round(p.score*100)/100})),hint:a.length>0?`Found ${a.length} tools. You can now call any of these tools directly.`:`No tools found for "${t}". Try a different search term.`})}wrapError(e){return e instanceof A?e:new q(e.message||"Unknown provider error","UNKNOWN_PROVIDER_ERROR",500,e)}budgetTruncate(e,t){let o=`
437
+ [Output truncated \u2014 round budget reached. Call the tool again with a narrower query to retrieve more.]`,s=t-o.length;return s>=100?e.slice(0,s)+o:"[Tool output omitted \u2014 round budget exhausted. Call the tool again with a narrower query.]"}};c();c();import _a from"@anthropic-ai/sdk";c();ae();var te=class{name;async getModels(){return[]}getDisplayName(){return this.name||this.constructor.name.replace(/Adapter$/,"")}supportsFileUpload(){return!1}async uploadFile(e){throw new L(`File upload API is not supported by ${this.getDisplayName()}`)}async deleteFile(e){throw new L(`File deletion API is not supported by ${this.getDisplayName()}`)}async countTokens(e,t){return null}};ae();k();var Cn=class extends te{client;constructor(e,t){super(),this.client=new _a({apiKey:e,baseURL:t})}supportsFileUpload(){return!0}async uploadFile(e){try{let t=await import("fs");if(!e.filePath)throw new L("Anthropic uploadFile requires a filePath.");return{id:(await this.client.files.create({file:t.createReadStream(e.filePath),purpose:e.purpose||"vision"})).id}}catch(t){throw this.handleError(t)}}async deleteFile(e){try{await this.client.files.delete(e)}catch(t){throw this.handleError(t)}}getDisplayName(){return"Anthropic"}async getModels(){return[{id:"claude-haiku-4-5-20251001",displayName:"Claude Haiku 4.5",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:2e5,maxOutputTokens:64e3},{id:"claude-sonnet-4-5-20250929",displayName:"Claude Sonnet 4.5",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:2e5,maxOutputTokens:16384},{id:"claude-sonnet-4-6",displayName:"Claude Sonnet 4.6",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:2e5,maxOutputTokens:16384},{id:"claude-opus-4-5",displayName:"Claude Opus 4.5",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:2e5,maxOutputTokens:16384},{id:"claude-opus-4-6",displayName:"Claude Opus 4.6",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:2e5,maxOutputTokens:16384}]}sanitizeToolName(e){return e.replace(/\./g,"_")}restoreToolName(e,t){return t?.find(n=>this.sanitizeToolName(n.function.name)===e)?.function.name||e.replace(/_/g,".")}async generate(e){try{let t=e.__toolpack_request_id||`gen-${Date.now()}`,o=await this.toAnthropicMessages(e.messages,e.mediaOptions),n=o.system,s=o.userMessages,i={model:e.model,messages:s,system:n,max_tokens:e.max_tokens||4096,temperature:e.temperature,top_p:e.top_p,stream:!1};e.tools&&e.tools.length>0?(i.tools=e.tools.map(m=>({name:this.sanitizeToolName(m.function.name),description:m.function.description,input_schema:m.function.parameters})),e.tool_choice==="required"?i.tool_choice={type:"any"}:e.tool_choice==="none"?delete i.tools:i.tool_choice={type:"auto"},y(`[Anthropic][${t}] Sending ${i.tools?.length||0} tools with tool_choice: ${i.tool_choice?.type||"unset"}`),i.tools&&i.tools.length>0&&y(`[Anthropic][${t}] First tool: ${O(i.tools[0],800)}`)):y(`[Anthropic][${t}] NO TOOLS in request`),y(`[Anthropic][${t}] generate() request: model=${i.model}, messages=${i.messages.length}, tools=${i.tools?.length||0}, tool_choice=${i.tool_choice?.type??"unset"}`),ee(t,"Anthropic",i.messages);let a=await this.client.messages.create(i,e.signal?{signal:e.signal}:void 0),l=[],p=[];for(let m of a.content)m.type==="text"?l.push(m.text):m.type==="tool_use"&&p.push({id:m.id,name:this.restoreToolName(m.name,e.tools),arguments:m.input});return y(`[Anthropic][${t}] Response finish_reason=${a.stop_reason} tool_calls=${p.length} content_preview=${O(l.join(""),200)}`),{content:l.length>0?l.join(""):null,usage:{prompt_tokens:a.usage.input_tokens,completion_tokens:a.usage.output_tokens,total_tokens:a.usage.input_tokens+a.usage.output_tokens},finish_reason:this.mapFinishReason(a.stop_reason),tool_calls:p.length>0?p:void 0,raw:a}}catch(t){throw this.handleError(t)}}async*stream(e){try{let t=e.__toolpack_request_id||`str-${Date.now()}`,o=await this.toAnthropicMessages(e.messages,e.mediaOptions),n={model:e.model,messages:o.userMessages,system:o.system,max_tokens:e.max_tokens||4096,temperature:e.temperature,top_p:e.top_p,stream:!0};e.tools&&e.tools.length>0?(n.tools=e.tools.map(m=>({name:this.sanitizeToolName(m.function.name),description:m.function.description,input_schema:m.function.parameters})),e.tool_choice==="required"?n.tool_choice={type:"any"}:e.tool_choice==="none"?delete n.tools:n.tool_choice={type:"auto"},y(`[Anthropic][${t}] Sending ${n.tools?.length||0} tools with tool_choice: ${n.tool_choice?.type||"unset"}`),n.tools&&n.tools.length>0&&y(`[Anthropic][${t}] First tool: ${O(n.tools[0],800)}`)):y(`[Anthropic][${t}] NO TOOLS in request`),y(`[Anthropic][${t}] Stream request: model=${n.model}, messages=${n.messages.length}, tools=${n.tools?.length||0}, tool_choice=${n.tool_choice?.type??"unset"}`),ee(t,"Anthropic",n.messages);let s=await this.client.messages.create(n,e.signal?{signal:e.signal}:void 0),i="",a="",l="",p=!1;for await(let m of s)m.type==="content_block_start"&&m.content_block?.type==="tool_use"&&(p=!0,i=m.content_block.id,a=m.content_block.name,l=""),m.type==="content_block_delta"&&(m.delta.type==="text_delta"?yield{delta:m.delta.text}:m.delta.type==="input_json_delta"&&p&&(l+=m.delta.partial_json)),m.type==="content_block_stop"&&p&&(y(`[Anthropic][${t}] Stream finish_reason=tool_calls accumulated_call=${a}`),yield{delta:"",finish_reason:"tool_calls",tool_calls:[{id:i,name:this.restoreToolName(a,e.tools),arguments:JSON.parse(l||"{}")}]},p=!1),m.type==="message_stop"&&(Ae(`[Anthropic][${t}] Stream chunk finish_reason=stop`),yield{delta:"",finish_reason:"stop"})}catch(t){throw this.handleError(t)}}async embed(e){throw new L("Embeddings are not strictly supported by the Anthropic API currently.")}async toAnthropicMessages(e,t={}){let o,n=[],{normalizeImagePart:s}=await Promise.resolve().then(()=>(ht(),Wt));for(let i of e)if(i.role==="system"){if(typeof i.content=="string")o=i.content;else if(i.content!==null){let a=i.content.filter(l=>typeof l=="object"&&l.type==="text").map(l=>l.text).join(`
438
+ `);a&&(o=a)}}else if(i.role==="tool"&&i.tool_call_id)n.push({role:"user",content:[{type:"tool_result",tool_use_id:i.tool_call_id,content:typeof i.content=="string"?i.content:JSON.stringify(i.content)}]});else if(i.role==="assistant"&&i.tool_calls&&i.tool_calls.length>0){let a=[];if(typeof i.content=="string"&&i.content)a.push({type:"text",text:i.content});else if(Array.isArray(i.content)){let l=i.content.filter(p=>typeof p=="object"&&p.type==="text").map(p=>p.text).join(`
439
+ `);l&&a.push({type:"text",text:l})}for(let l of i.tool_calls)a.push({type:"tool_use",id:l.id,name:this.sanitizeToolName(l.function.name),input:typeof l.function.arguments=="string"?JSON.parse(l.function.arguments||"{}"):l.function.arguments});n.push({role:"assistant",content:a})}else{let a=[];typeof i.content=="string"?a=i.content:i.content!==null&&(a=(await Promise.all(i.content.map(async l=>{if(l.type==="text")return{type:"text",text:l.text};if(l.type==="image_url"){let p=l.image_url.url;if(p.startsWith("data:")){let m=p.match(/^data:(image\/\w+);base64,(.+)$/);if(m)return{type:"image",source:{type:"base64",media_type:m[1],data:m[2]}}}return{type:"image",source:{type:"url",url:p}}}if(l.type==="image_data"||l.type==="image_file"){let{data:p,mimeType:m}=await s(l);return{type:"image",source:{type:"base64",media_type:m,data:p}}}return null}))).filter(Boolean)),n.push({role:i.role==="user"?"user":"assistant",content:a})}return{system:o,userMessages:n}}mapFinishReason(e){return e==="end_turn"?"stop":e==="max_tokens"?"length":e==="stop_sequence"?"stop":e}handleError(e){if(e instanceof _a.APIError){let t=e.message;return e.status===401?new xe(t,e):e.status===429?new fe(t,void 0,e):e.status&&e.status>=400&&e.status<500?new L(t,e):new q(t,"ANTHROPIC_ERROR",e.status||500,e)}return new q("Unknown Anthropic error","UNKNOWN",500,e)}};c();import{GoogleGenAI as Pw}from"@google/genai";ae();k();var Pn=class extends te{ai;location;constructor(e={}){super(),this.name="vertexai";let t=e.projectId??process.env.TOOLPACK_VERTEXAI_PROJECT??process.env.VERTEX_AI_PROJECT??process.env.GOOGLE_CLOUD_PROJECT;if(!t)throw new xe("Vertex AI requires a GCP project ID. Pass projectId in config or set TOOLPACK_VERTEXAI_PROJECT / VERTEX_AI_PROJECT / GOOGLE_CLOUD_PROJECT.");this.location=e.location??process.env.TOOLPACK_VERTEXAI_LOCATION??process.env.VERTEX_AI_LOCATION??"us-central1",this.ai=new Pw({vertexai:!0,project:t,location:this.location,...e.googleAuthOptions?{googleAuthOptions:e.googleAuthOptions}:{}})}getDisplayName(){return"Google Vertex AI"}async getModels(){return[{id:"gemini-2.5-pro-preview-05-06",displayName:"Gemini 2.5 Pro Preview",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0},contextWindow:1048576,maxOutputTokens:65536},{id:"gemini-2.5-flash-preview-04-17",displayName:"Gemini 2.5 Flash Preview",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0},contextWindow:1048576,maxOutputTokens:65536},{id:"gemini-2.0-flash-001",displayName:"Gemini 2.0 Flash",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0},contextWindow:1048576,maxOutputTokens:8192},{id:"gemini-1.5-pro-002",displayName:"Gemini 1.5 Pro",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0},contextWindow:2097152,maxOutputTokens:8192},{id:"gemini-1.5-flash-002",displayName:"Gemini 1.5 Flash",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0},contextWindow:1048576,maxOutputTokens:8192}]}async generate(e){try{let t=e.__toolpack_request_id||`vtx-${Date.now()}`;y(`[VertexAI][${t}] generate() model=${e.model} messages=${e.messages.length} tools=${e.tools?.length??0}`),ee(t,"VertexAI",e.messages);let{model:o,config:n}=this.buildRequestParams(e),{history:s,lastUserMessage:i}=this.formatHistory(e.messages),a=[...s,{role:"user",parts:typeof i=="string"?[{text:i}]:i}],l=await this.ai.models.generateContent({model:o,contents:a,config:n}),{content:p,toolCalls:m}=this.parseResponse(l,e.tools);return y(`[VertexAI][${t}] Response finish_reason=${m.length>0?"tool_calls":"stop"} tool_calls=${m.length} content_preview=${O(p,200)}`),{content:p||null,usage:{prompt_tokens:l.usageMetadata?.promptTokenCount??0,completion_tokens:l.usageMetadata?.candidatesTokenCount??0,total_tokens:l.usageMetadata?.totalTokenCount??0},finish_reason:m.length>0?"tool_calls":"stop",tool_calls:m.length>0?m:void 0,raw:l}}catch(t){throw this.handleError(t)}}async*stream(e){try{let t=e.__toolpack_request_id||`vtx-str-${Date.now()}`;y(`[VertexAI][${t}] stream() model=${e.model} messages=${e.messages.length} tools=${e.tools?.length??0}`),ee(t,"VertexAI",e.messages);let{model:o,config:n}=this.buildRequestParams(e),{history:s,lastUserMessage:i}=this.formatHistory(e.messages),a=[...s,{role:"user",parts:typeof i=="string"?[{text:i}]:i}],l=await this.ai.models.generateContentStream({model:o,contents:a,config:n});for await(let p of l)for(let m of p.candidates??[])for(let f of m.content?.parts??[])if(f.functionCall){let g=f.functionCall;y(`[VertexAI][${t}] stream tool_call name=${g.name}`),yield{delta:"",finish_reason:"tool_calls",tool_calls:[{id:`vtx_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,name:this.restoreToolName(g.name,e.tools),arguments:g.args??{}}]}}else f.text&&(yield{delta:f.text})}catch(t){throw this.handleError(t)}}async embed(e){throw new L("Vertex AI embeddings are not supported by this adapter. Use the Gemini adapter (gemini provider) with text-embedding-004 instead.")}buildRequestParams(e){let t={systemInstruction:this.extractSystemInstruction(e.messages),maxOutputTokens:e.max_tokens,temperature:e.temperature,topP:e.top_p,responseMimeType:e.response_format==="json_object"&&!e.tools?.length?"application/json":"text/plain"};return e.tools&&e.tools.length>0&&(t.tools=[{functionDeclarations:e.tools.map(o=>({name:this.sanitizeToolName(o.function.name),description:o.function.description,parameters:this.sanitizeSchema(o.function.parameters)}))}]),{model:e.model,config:t}}formatHistory(e){let t=e.filter(i=>i.role!=="system");if(t.length===0)return{history:[],lastUserMessage:""};let o=t.slice(0,-1),n=t[t.length-1];return{history:o.map(i=>{if(i.role==="tool"&&i.tool_call_id)return{role:"function",parts:[{functionResponse:{name:this.sanitizeToolName(i.name??i.tool_call_id),response:{name:this.sanitizeToolName(i.name??i.tool_call_id),content:typeof i.content=="string"?i.content:JSON.stringify(i.content)}}}]};if(i.role==="assistant"&&i.tool_calls&&i.tool_calls.length>0){let a=[];typeof i.content=="string"&&i.content&&a.push({text:i.content});for(let l of i.tool_calls)a.push({functionCall:{name:this.sanitizeToolName(l.function.name),args:typeof l.function.arguments=="string"?JSON.parse(l.function.arguments||"{}"):l.function.arguments}});return{role:"model",parts:a}}return{role:i.role==="user"?"user":"model",parts:this.contentToParts(i.content)}}),lastUserMessage:this.contentToParts(n.content)}}contentToParts(e){return typeof e=="string"?[{text:e}]:e?e.map(t=>t.type==="text"?{text:t.text}:t.type==="image_data"?{inlineData:{mimeType:t.mimeType??"image/jpeg",data:t.data}}:null).filter(t=>t!==null):[]}parseResponse(e,t){let o=[],n="";for(let s of e.candidates??[])for(let i of s.content?.parts??[])if(i.text&&(n+=i.text),i.functionCall){let a=i.functionCall;o.push({id:`vtx_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,name:this.restoreToolName(a.name,t),arguments:a.args??{}})}return{content:n,toolCalls:o}}extractSystemInstruction(e){let t=e.filter(o=>o.role==="system");if(t.length!==0)return t.map(o=>typeof o.content=="string"?o.content:"").join(`
440
+ `)}sanitizeToolName(e){return e.replace(/\./g,"_")}restoreToolName(e,t){return t?.find(n=>this.sanitizeToolName(n.function.name)===e)?.function.name??e.replace(/_/g,".")}sanitizeSchema(e){if(!e||typeof e!="object")return e;let t={};for(let[o,n]of Object.entries(e))["additionalProperties","exclusiveMinimum","exclusiveMaximum","$schema","$id","definitions","$defs"].includes(o)||(t[o]=typeof n=="object"&&n!==null?Array.isArray(n)?n.map(s=>this.sanitizeSchema(s)):this.sanitizeSchema(n):n);return t}handleError(e){let t=e?.message??String(e);return e?.status===429||t.includes("RESOURCE_EXHAUSTED")?new fe(t,void 0,e):e?.status===401||e?.status===403||t.includes("UNAUTHENTICATED")||t.includes("PERMISSION_DENIED")?new xe(t,e):e?.status>=400&&e?.status<500?new L(t,e):new q(t||"Vertex AI Error","VERTEXAI_ERROR",e?.status??500,e)}};c();import{GoogleGenerativeAI as kw}from"@google/generative-ai";ae();k();var kn=class extends te{genAI;constructor(e){super(),this.genAI=new kw(e)}supportsFileUpload(){return!0}sanitizeSchema(e){if(!e||typeof e!="object")return e;let t={};for(let[o,n]of Object.entries(e))o==="additionalProperties"||o==="exclusiveMinimum"||o==="exclusiveMaximum"||o==="$schema"||o==="$id"||o==="definitions"||o==="$defs"||(typeof n=="object"&&n!==null?Array.isArray(n)?t[o]=n.map(s=>this.sanitizeSchema(s)):t[o]=this.sanitizeSchema(n):t[o]=n);return t}async uploadFile(e){try{let t=await import("fs"),o=await import("path");if(!e.filePath)throw new L("Gemini uploadFile requires a filePath.");let n=await t.promises.readFile(e.filePath),s=o.basename(e.filePath),i=e.mimeType||"application/octet-stream",l=`https://generativelanguage.googleapis.com/upload/v1beta/files?key=${this.genAI.apiKey}`,p="----WebKitFormBoundary"+Math.random().toString(36).substring(2),m=JSON.stringify({file:{displayName:s}}),f=Buffer.concat([Buffer.from(`--${p}\r
441
441
  Content-Type: application/json\r
442
442
  \r
443
443
  ${m}\r
@@ -446,54 +446,54 @@ Content-Type: ${i}\r
446
446
  \r
447
447
  `),n,Buffer.from(`\r
448
448
  --${p}--\r
449
- `)]),g=await fetch(c,{method:"POST",headers:{"Content-Type":`multipart/related; boundary=${p}`},body:f});if(!g.ok){let b=await g.text();throw new Error(`Gemini file upload failed: ${g.status} ${b}`)}let w=await g.json();return{id:w.file?.name||w.name,url:w.file?.uri||w.uri}}catch(t){throw this.handleError(t)}}async deleteFile(e){try{let t=this.genAI.apiKey,o=`https://generativelanguage.googleapis.com/v1beta/${e}?key=${t}`,n=await fetch(o,{method:"DELETE"});if(!n.ok){let s=await n.text();throw new Error(`Gemini file deletion failed: ${n.status} ${s}`)}}catch(t){throw this.handleError(t)}}getDisplayName(){return"Google Gemini"}async getModels(){return[{id:"gemini-3.1-flash-lite-preview",displayName:"Gemini 3.1 Flash-Lite Preview",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:1048576,maxOutputTokens:65536},{id:"gemini-3-flash-preview",displayName:"Gemini 3 Flash Preview",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:1048576,maxOutputTokens:65536},{id:"gemini-3.1-pro-preview",displayName:"Gemini 3.1 Pro Preview",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:1048576,maxOutputTokens:65536}]}sanitizeToolName(e){return e.replace(/\./g,"_")}restoreToolName(e,t){return t?.find(n=>this.sanitizeToolName(n.function.name)===e)?.function.name||e.replace(/_/g,".")}async generate(e){try{let t=e.__toolpack_request_id||`gen-${Date.now()}`,o={model:e.model,systemInstruction:this.extractSystemInstruction(e.messages)};e.tools&&e.tools.length>0?(o.tools=[{functionDeclarations:e.tools.map(g=>({name:this.sanitizeToolName(g.function.name),description:g.function.description,parameters:this.sanitizeSchema(g.function.parameters)}))}],y(`[Gemini][${t}] Sending ${e.tools.length} tools`),e.tools.length>0&&y(`[Gemini][${t}] First tool: ${O(e.tools[0],800)}`)):y(`[Gemini][${t}] NO TOOLS in request`),y(`[Gemini][${t}] generate() request: model=${e.model}, messages=${e.messages.length}, tools=${e.tools?.length||0}`),Y(t,"Gemini",e.messages);let n=this.genAI.getGenerativeModel(o),{history:s,lastUserMessage:i}=await this.formatHistory(e.messages,e.mediaOptions),p=await(await n.startChat({history:s,generationConfig:{maxOutputTokens:e.max_tokens,temperature:e.temperature,topP:e.top_p,responseMimeType:e.response_format==="json_object"?"application/json":"text/plain"}}).sendMessage(i)).response,m=[],f="";for(let g of p.candidates||[])for(let w of g.content?.parts||[])if(w.text&&(f+=w.text),w.functionCall){let b=w.functionCall;m.push({id:`gemini_${Date.now()}_${Math.random().toString(36).substring(2,8)}`,name:this.restoreToolName(b.name,e.tools),arguments:b.args||{}})}return y(`[Gemini][${t}] Response finish_reason=${m.length>0?"tool_calls":"stop"} tool_calls=${m.length} content_preview=${O(f,200)}`),{content:f||null,usage:{prompt_tokens:p.usageMetadata?.promptTokenCount||0,completion_tokens:p.usageMetadata?.candidatesTokenCount||0,total_tokens:p.usageMetadata?.totalTokenCount||0},finish_reason:m.length>0?"tool_calls":"stop",tool_calls:m.length>0?m:void 0,raw:p}}catch(t){throw this.handleError(t)}}async*stream(e){try{let t={model:e.model,systemInstruction:this.extractSystemInstruction(e.messages)};e.tools&&e.tools.length>0&&(t.tools=[{functionDeclarations:e.tools.map(p=>({name:this.sanitizeToolName(p.function.name),description:p.function.description,parameters:this.sanitizeSchema(p.function.parameters)}))}]);let o=e.__toolpack_request_id||`str-${Date.now()}`;y(`[Gemini][${o}] Stream request: model=${e.model}, messages=${e.messages.length}, tools=${e.tools?.length||0}`),e.tools&&e.tools.length>0&&y(`[Gemini][${o}] First tool: ${O(e.tools[0],800)}`),Y(o,"Gemini",e.messages);let n=this.genAI.getGenerativeModel(t),{history:s,lastUserMessage:i}=await this.formatHistory(e.messages,e.mediaOptions),c=await n.startChat({history:s,generationConfig:{maxOutputTokens:e.max_tokens,temperature:e.temperature,topP:e.top_p,responseMimeType:e.response_format==="json_object"?"application/json":"text/plain"}}).sendMessageStream(i);for await(let p of c.stream){for(let m of p.candidates?.[0]?.content?.parts||[])m.functionCall?(y(`[Gemini][${o}] Stream finish_reason=tool_calls name=${m.functionCall.name}`),yield{delta:"",finish_reason:"tool_calls",tool_calls:[{id:`gemini_${Date.now()}_${Math.random().toString(36).substring(2,8)}`,name:this.restoreToolName(m.functionCall.name,e.tools),arguments:m.functionCall.args||{}}]}):m.text&&(yield{delta:m.text});try{let m=p.text();m&&!p.candidates?.[0]?.content?.parts?.some(f=>f.text)&&(yield{delta:m})}catch{}}}catch(t){throw this.handleError(t)}}async embed(e){try{let t=this.genAI.getGenerativeModel({model:e.model});return Array.isArray(e.input)?{embeddings:await Promise.all(e.input.map(async n=>(await t.embedContent(n)).embedding.values))}:{embeddings:[(await t.embedContent(e.input)).embedding.values]}}catch(t){throw this.handleError(t)}}extractSystemInstruction(e){let t=e.filter(o=>o.role==="system");if(t.length!==0)return t.map(o=>typeof o.content=="string"?o.content:o.content===null?"":o.content.map(n=>n.text).join(`
449
+ `)]),g=await fetch(l,{method:"POST",headers:{"Content-Type":`multipart/related; boundary=${p}`},body:f});if(!g.ok){let b=await g.text();throw new Error(`Gemini file upload failed: ${g.status} ${b}`)}let w=await g.json();return{id:w.file?.name||w.name,url:w.file?.uri||w.uri}}catch(t){throw this.handleError(t)}}async deleteFile(e){try{let t=this.genAI.apiKey,o=`https://generativelanguage.googleapis.com/v1beta/${e}?key=${t}`,n=await fetch(o,{method:"DELETE"});if(!n.ok){let s=await n.text();throw new Error(`Gemini file deletion failed: ${n.status} ${s}`)}}catch(t){throw this.handleError(t)}}getDisplayName(){return"Google Gemini"}async getModels(){return[{id:"gemini-3.1-flash-lite-preview",displayName:"Gemini 3.1 Flash-Lite Preview",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:1048576,maxOutputTokens:65536},{id:"gemini-3-flash-preview",displayName:"Gemini 3 Flash Preview",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:1048576,maxOutputTokens:65536},{id:"gemini-3.1-pro-preview",displayName:"Gemini 3.1 Pro Preview",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:1048576,maxOutputTokens:65536}]}sanitizeToolName(e){return e.replace(/\./g,"_")}restoreToolName(e,t){return t?.find(n=>this.sanitizeToolName(n.function.name)===e)?.function.name||e.replace(/_/g,".")}async generate(e){try{let t=e.__toolpack_request_id||`gen-${Date.now()}`,o={model:e.model,systemInstruction:this.extractSystemInstruction(e.messages)};e.tools&&e.tools.length>0?(o.tools=[{functionDeclarations:e.tools.map(g=>({name:this.sanitizeToolName(g.function.name),description:g.function.description,parameters:this.sanitizeSchema(g.function.parameters)}))}],y(`[Gemini][${t}] Sending ${e.tools.length} tools`),e.tools.length>0&&y(`[Gemini][${t}] First tool: ${O(e.tools[0],800)}`)):y(`[Gemini][${t}] NO TOOLS in request`),y(`[Gemini][${t}] generate() request: model=${e.model}, messages=${e.messages.length}, tools=${e.tools?.length||0}`),ee(t,"Gemini",e.messages);let n=this.genAI.getGenerativeModel(o),{history:s,lastUserMessage:i}=await this.formatHistory(e.messages,e.mediaOptions),p=await(await n.startChat({history:s,generationConfig:{maxOutputTokens:e.max_tokens,temperature:e.temperature,topP:e.top_p,responseMimeType:e.response_format==="json_object"&&!e.tools?.length?"application/json":"text/plain"}}).sendMessage(i)).response,m=[],f="";for(let g of p.candidates||[])for(let w of g.content?.parts||[])if(w.text&&(f+=w.text),w.functionCall){let b=w.functionCall;m.push({id:`gemini_${Date.now()}_${Math.random().toString(36).substring(2,8)}`,name:this.restoreToolName(b.name,e.tools),arguments:b.args||{}})}return y(`[Gemini][${t}] Response finish_reason=${m.length>0?"tool_calls":"stop"} tool_calls=${m.length} content_preview=${O(f,200)}`),{content:f||null,usage:{prompt_tokens:p.usageMetadata?.promptTokenCount||0,completion_tokens:p.usageMetadata?.candidatesTokenCount||0,total_tokens:p.usageMetadata?.totalTokenCount||0},finish_reason:m.length>0?"tool_calls":"stop",tool_calls:m.length>0?m:void 0,raw:p}}catch(t){throw this.handleError(t)}}async*stream(e){try{let t={model:e.model,systemInstruction:this.extractSystemInstruction(e.messages)};e.tools&&e.tools.length>0&&(t.tools=[{functionDeclarations:e.tools.map(p=>({name:this.sanitizeToolName(p.function.name),description:p.function.description,parameters:this.sanitizeSchema(p.function.parameters)}))}]);let o=e.__toolpack_request_id||`str-${Date.now()}`;y(`[Gemini][${o}] Stream request: model=${e.model}, messages=${e.messages.length}, tools=${e.tools?.length||0}`),e.tools&&e.tools.length>0&&y(`[Gemini][${o}] First tool: ${O(e.tools[0],800)}`),ee(o,"Gemini",e.messages);let n=this.genAI.getGenerativeModel(t),{history:s,lastUserMessage:i}=await this.formatHistory(e.messages,e.mediaOptions),l=await n.startChat({history:s,generationConfig:{maxOutputTokens:e.max_tokens,temperature:e.temperature,topP:e.top_p,responseMimeType:e.response_format==="json_object"&&!e.tools?.length?"application/json":"text/plain"}}).sendMessageStream(i);for await(let p of l.stream){for(let m of p.candidates?.[0]?.content?.parts||[])m.functionCall?(y(`[Gemini][${o}] Stream finish_reason=tool_calls name=${m.functionCall.name}`),yield{delta:"",finish_reason:"tool_calls",tool_calls:[{id:`gemini_${Date.now()}_${Math.random().toString(36).substring(2,8)}`,name:this.restoreToolName(m.functionCall.name,e.tools),arguments:m.functionCall.args||{}}]}):m.text&&(yield{delta:m.text});try{let m=p.text();m&&!p.candidates?.[0]?.content?.parts?.some(f=>f.text)&&(yield{delta:m})}catch{}}}catch(t){throw this.handleError(t)}}async embed(e){try{let t=this.genAI.getGenerativeModel({model:e.model});return Array.isArray(e.input)?{embeddings:await Promise.all(e.input.map(async n=>(await t.embedContent(n)).embedding.values))}:{embeddings:[(await t.embedContent(e.input)).embedding.values]}}catch(t){throw this.handleError(t)}}extractSystemInstruction(e){let t=e.filter(o=>o.role==="system");if(t.length!==0)return t.map(o=>typeof o.content=="string"?o.content:o.content===null?"":o.content.map(n=>n.text).join(`
450
450
  `)).join(`
451
- `)}async formatHistory(e,t={}){let o=e.filter(m=>m.role!=="system");if(o.length===0)return{history:[],lastUserMessage:""};let n=o[o.length-1],s=o.slice(0,o.length-1),{normalizeImagePart:i}=await Promise.resolve().then(()=>(gt(),qt)),a=async m=>typeof m=="string"?[{text:m}]:m===null?[]:(await Promise.all(m.map(async g=>{if(g.type==="text")return{text:g.text};if(g.type==="image_data"||g.type==="image_file"||g.type==="image_url")try{let{data:w,mimeType:b}=await i(g);return{inlineData:{mimeType:b,data:w}}}catch{return g.type==="image_url"?{text:`[Image: ${g.image_url.url}]`}:{text:"[Unresolvable Image]"}}return null}))).filter(Boolean),c=await Promise.all(s.map(async m=>{if(m.role==="tool"&&m.tool_call_id)return{role:"function",parts:[{functionResponse:{name:this.sanitizeToolName(m.name||m.tool_call_id),response:{name:this.sanitizeToolName(m.name||m.tool_call_id),content:typeof m.content=="string"?m.content:JSON.stringify(m.content)}}}]};if(m.role==="assistant"&&m.tool_calls&&m.tool_calls.length>0){let f=[];if(typeof m.content=="string"&&m.content)f.push({text:m.content});else if(Array.isArray(m.content)){let g=m.content.filter(w=>typeof w=="object"&&w.type==="text").map(w=>w.text).join(`
452
- `);g&&f.push({text:g})}for(let g of m.tool_calls)f.push({functionCall:{name:this.sanitizeToolName(g.function.name),args:typeof g.function.arguments=="string"?JSON.parse(g.function.arguments||"{}"):g.function.arguments}});return{role:"model",parts:f}}return{role:m.role==="user"?"user":"model",parts:await a(m.content)}})),p=typeof n.content=="string"?n.content:await a(n.content);return{history:c,lastUserMessage:p}}handleError(e){return e.status===429?new Pe(e.message,void 0,e):e.status>=400&&e.status<500?new j(e.message,e):e.message&&e.message.includes("API key")?new we(e.message,e):new W(e.message||"Gemini Error","GEMINI_ERROR",e.status||500,e)}};l();ce();import*as Ie from"fs";import*as Fr from"path";var Ra="toolpack.config.json",Pn=new Map;async function _a(r){for(;Pn.has(r);)await Pn.get(r);let e,t=new Promise(o=>{e=o});return Pn.set(r,t),()=>{Pn.delete(r),e()}}function Ze(r){if(r&&Ie.existsSync(r))return r;let e=Fr.join(process.cwd(),Ra);return Ie.existsSync(e)?e:null}function Ut(r){if(!r)return null;try{let e=Ie.readFileSync(r,"utf-8");return JSON.parse(e)}catch{return null}}var Wt=null;function qr(r){if(Wt)return Wt;let e=r||Ze();return Wt=Ut(e)||{},Wt}function Wr(){Wt=null}function kw(r){return(qr(r).ollama?.models||[]).map(o=>({type:`ollama-${o.model.replace(/[:.]/g,"-")}`,model:o.model,label:o.label||o.model}))}function Sn(r){return qr(r).ollama?.baseUrl||"http://localhost:11434"}async function Pw(r){let{type:e,value:t,configPath:o}=r,n=o||Ze();n||(n=Fr.join(process.cwd(),Ra));let s=await _a(n);try{let i=Ut(n)||{};switch(i.hitl||(i.hitl={}),i.hitl.bypass||(i.hitl.bypass={}),e){case"tool":i.hitl.bypass.tools||(i.hitl.bypass.tools=[]),i.hitl.bypass.tools.includes(t)||i.hitl.bypass.tools.push(t);break;case"category":i.hitl.bypass.categories||(i.hitl.bypass.categories=[]),i.hitl.bypass.categories.includes(t)||i.hitl.bypass.categories.push(t);break;case"level":{i.hitl.bypass.levels||(i.hitl.bypass.levels=[]);let a=t;i.hitl.bypass.levels.includes(a)||i.hitl.bypass.levels.push(a);break}}try{Ie.writeFileSync(n,JSON.stringify(i,null,4),"utf-8")}catch(a){throw new A(`Failed to write bypass rule to config file: ${a instanceof Error?a.message:String(a)}`,"CONFIG_WRITE_ERROR")}Wr()}finally{s()}}async function Sw(r){let{type:e,value:t,configPath:o}=r,n=o||Ze();if(!n)return;let s=await _a(n);try{let i=Ut(n);if(!i?.hitl?.bypass)return;switch(e){case"tool":i.hitl.bypass.tools&&(i.hitl.bypass.tools=i.hitl.bypass.tools.filter(a=>a!==t));break;case"category":i.hitl.bypass.categories&&(i.hitl.bypass.categories=i.hitl.bypass.categories.filter(a=>a!==t));break;case"level":i.hitl.bypass.levels&&(i.hitl.bypass.levels=i.hitl.bypass.levels.filter(a=>a!==t));break}try{Ie.writeFileSync(n,JSON.stringify(i,null,4),"utf-8")}catch(a){throw new A(`Failed to remove bypass rule from config file: ${a instanceof Error?a.message:String(a)}`,"CONFIG_WRITE_ERROR")}Wr()}finally{s()}}l();l();ce();k();l();import $a from"http";function Se(r,e,t,o,n=12e4){return new Promise((s,i)=>{let a=new URL(e,r),c={hostname:a.hostname,port:a.port,path:a.pathname,method:t,headers:{"Content-Type":"application/json"},timeout:n},p=$a.request(c,m=>{let f=[];m.on("data",g=>f.push(g)),m.on("end",()=>{s({status:m.statusCode||0,body:Buffer.concat(f).toString("utf-8")})})});p.on("error",m=>i(m)),p.on("timeout",()=>{p.destroy(),i(new Error("Request timed out"))}),o&&p.write(JSON.stringify(o)),p.end()})}function Ur(r,e,t,o=12e4,n){let s,i=!1;return n&&n.addEventListener("abort",()=>{i=!0,s&&s.destroy()},{once:!0}),{stream:async function*(){let c=new URL(e,r),p={hostname:c.hostname,port:c.port,path:c.pathname,method:"POST",headers:{"Content-Type":"application/json"},timeout:o},m=await new Promise((g,w)=>{s=$a.request(p,g),s.on("error",w),s.on("timeout",()=>{s.destroy(),w(new Error("Stream request timed out"))}),s.write(JSON.stringify(t)),s.end()});if(m.statusCode&&m.statusCode>=400){let g="";for await(let w of m)g+=w.toString();throw new Error(`Ollama HTTP ${m.statusCode}: ${g}`)}let f="";for await(let g of m){if(i)break;let w=g.toString();if(f+=w,f.includes('"error"'))try{let T=JSON.parse(f.trim());if(T.error)throw new Error(`Ollama: ${T.error}`)}catch(T){if(T.message.startsWith("Ollama:"))throw T}let b=f.split(`
453
- `);f=b.pop()||"";for(let T of b)T.trim()&&(yield T)}f.trim()&&!i&&(yield f.trim())}(),abort:()=>{i=!0,s&&s.destroy()}}}var et=class extends Z{config;baseUrl;timeout;modelName;constructor(e){super(),this.config=e,this.baseUrl=e.baseUrl||"http://localhost:11434",this.timeout=e.timeout||12e4,this.modelName=e.model}getDisplayName(){return"Ollama"}async getModels(){try{return(await this.listModels()).map(t=>({id:t.name,displayName:t.name,capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!0,vision:!0}}))}catch{return[]}}async connect(){let e=await this.listModels(),t=this.config.model.split(":")[0].toLowerCase();if(!e.some(n=>n.name.split(":")[0].toLowerCase()===t||n.name.toLowerCase()===this.config.model.toLowerCase()))throw new j(`Model "${this.config.model}" is not pulled in Ollama. Run: ollama pull ${this.config.model}
454
- Available models: ${e.map(n=>n.name).join(", ")||"(none)"}`);return e}async listModels(){try{let e=await Se(this.baseUrl,"/api/tags","GET",void 0,5e3);if(e.status!==200)throw new W(`Ollama returned status ${e.status}`,"OLLAMA_ERROR",e.status);return JSON.parse(e.body).models||[]}catch(e){throw e instanceof W?e:new Qe(`Cannot connect to Ollama at ${this.baseUrl}. Is Ollama running? (ollama serve)`,e)}}async isAvailable(){try{return await Se(this.baseUrl,"/api/tags","GET",void 0,3e3),!0}catch{return!1}}async isModelAvailable(e){try{let t=await this.listModels(),o=(e||this.config.model).toLowerCase(),n=o.split(":")[0];return t.some(s=>s.name.split(":")[0].toLowerCase()===n||s.name.toLowerCase()===o)}catch{return!1}}sanitizeToolName(e){return e.replace(/\./g,"_")}restoreToolName(e,t){return t?.find(n=>this.sanitizeToolName(n.function.name)===e)?.function.name||e.replace(/_/g,".")}async generate(e){let t=e.__toolpack_request_id||`gen-${Date.now()}`,o=await Promise.all(e.messages.map(i=>this.toOllamaMessage(i,e.mediaOptions))),n=e.model||this.config.model,s={model:n,messages:o,stream:!1,options:{temperature:e.temperature??this.config.temperature??.7,num_ctx:this.config.numCtx}};e.tools&&e.tools.length>0&&e.tool_choice!=="none"&&(s.tools=e.tools.map(i=>({type:"function",function:{name:this.sanitizeToolName(i.function.name),description:i.function.description,parameters:i.function.parameters}})),y(`[Ollama][${t}] Sending ${e.tools.length} tools with tool_choice: ${e.tool_choice||"unset"}`),e.tools.length>0&&y(`[Ollama][${t}] First tool: ${O(e.tools[0],800)}`),y(`[Ollama][${t}] NO TOOLS in request`)),y(`[Ollama][${t}] generate() request: model=${n}, messages=${e.messages.length}, tools=${e.tools?.length||0}`),Y(t,"Ollama",e.messages);try{let i=await Se(this.baseUrl,"/api/chat","POST",s,this.timeout);if(i.status!==200)throw this.handleHttpError(i.status,i.body);let a=JSON.parse(i.body),c=[];if(a.message?.tool_calls)for(let m of a.message.tool_calls)c.push({id:`ollama_${Date.now()}_${Math.random().toString(36).substring(2,8)}`,name:this.restoreToolName(m.function.name,e.tools),arguments:m.function.arguments||{}});let p={content:a.message?.content||null,usage:a.prompt_eval_count!=null?{prompt_tokens:a.prompt_eval_count||0,completion_tokens:a.eval_count||0,total_tokens:(a.prompt_eval_count||0)+(a.eval_count||0)}:void 0,finish_reason:c.length>0?"tool_calls":a.done?"stop":void 0,tool_calls:c.length>0?c:void 0,raw:a};return y(`[Ollama][${t}] Response finish_reason=${p.finish_reason} tool_calls=${c.length} content_preview=${O(p.content,200)}`),p}catch(i){throw i instanceof W?i:new Qe(`Failed to generate with Ollama model "${n}": ${i.message}`,i)}}async*stream(e){let t=e.__toolpack_request_id||`str-${Date.now()}`,o=await Promise.all(e.messages.map(a=>this.toOllamaMessage(a,e.mediaOptions))),n=e.model||this.config.model,s={model:n,messages:o,stream:!0,options:{temperature:e.temperature??this.config.temperature??.7,num_ctx:this.config.numCtx}};e.tools&&e.tools.length>0&&e.tool_choice!=="none"&&(s.tools=e.tools.map(a=>({type:"function",function:{name:this.sanitizeToolName(a.function.name),description:a.function.description,parameters:a.function.parameters}})),y(`[Ollama][${t}] Sending ${e.tools.length} tools with tool_choice: ${e.tool_choice||"unset"}`),e.tools.length>0&&y(`[Ollama][${t}] First tool: ${O(e.tools[0],800)}`),y(`[Ollama][${t}] NO TOOLS in request`)),y(`[Ollama][${t}] Stream request: model=${n}, messages=${e.messages.length}, tools=${e.tools?.length||0}`),Y(t,"Ollama",e.messages);let{stream:i}=Ur(this.baseUrl,"/api/chat",s,this.timeout,e.signal);try{for await(let a of i)try{let c=JSON.parse(a);if(c.message?.content){let p=c.message.tool_calls&&c.message.tool_calls.length>0;yield{delta:c.message.content,finish_reason:c.done&&!p?"stop":void 0,usage:c.done&&c.prompt_eval_count!=null?{prompt_tokens:c.prompt_eval_count||0,completion_tokens:c.eval_count||0,total_tokens:(c.prompt_eval_count||0)+(c.eval_count||0)}:void 0}}if(c.message?.tool_calls&&c.message.tool_calls.length>0){let p=c.message.tool_calls.map(m=>({id:`ollama_${Date.now()}_${Math.random().toString(36).substring(2,8)}`,name:this.restoreToolName(m.function.name,e.tools),arguments:m.function.arguments||{}}));y(`[Ollama][${t}] Stream finish_reason=tool_calls name=${p[0]?.name}`),yield{delta:"",finish_reason:"tool_calls",tool_calls:p}}if(c.done&&!c.message?.content&&!c.message?.tool_calls){Ae(`[Ollama][${t}] Stream chunk finish_reason=stop`),yield{delta:"",finish_reason:"stop"};return}}catch{}}catch(a){throw new Qe(`Stream failed for Ollama model "${n}": ${a.message}`,a)}}async embed(e){let t=e.__toolpack_request_id||`emb-${Date.now()}`,o=typeof e.input=="string"?[e.input]:e.input,n=e.model||this.config.model;y(`[Ollama][${t}] Embedding request: model=${n}, inputs=${o.length}`);try{let s=await Se(this.baseUrl,"/api/embed","POST",{model:n,input:o},this.timeout);if(s.status!==200)throw this.handleHttpError(s.status,s.body);return{embeddings:JSON.parse(s.body).embeddings||[]}}catch(s){throw s instanceof W?s:new Qe(`Embedding failed for Ollama model "${n}": ${s.message}`,s)}}async disconnect(){}async toOllamaMessage(e,t={}){let o="",n=[],{normalizeImagePart:s}=await Promise.resolve().then(()=>(gt(),qt));if(typeof e.content=="string")o=e.content;else if(e.content!==null){for(let a of e.content)if(a.type==="text")o+=a.text+`
455
- `;else if(a.type==="image_url"||a.type==="image_data"||a.type==="image_file")try{let{data:c}=await s(a);n.push(c)}catch{a.type==="image_url"?o+=`[Image: ${a.image_url.url}]
451
+ `)}async formatHistory(e,t={}){let o=e.filter(m=>m.role!=="system");if(o.length===0)return{history:[],lastUserMessage:""};let n=o[o.length-1],s=o.slice(0,o.length-1),{normalizeImagePart:i}=await Promise.resolve().then(()=>(ht(),Wt)),a=async m=>typeof m=="string"?[{text:m}]:m===null?[]:(await Promise.all(m.map(async g=>{if(g.type==="text")return{text:g.text};if(g.type==="image_data"||g.type==="image_file"||g.type==="image_url")try{let{data:w,mimeType:b}=await i(g);return{inlineData:{mimeType:b,data:w}}}catch{return g.type==="image_url"?{text:`[Image: ${g.image_url.url}]`}:{text:"[Unresolvable Image]"}}return null}))).filter(Boolean),l=await Promise.all(s.map(async m=>{if(m.role==="tool"&&m.tool_call_id)return{role:"function",parts:[{functionResponse:{name:this.sanitizeToolName(m.name||m.tool_call_id),response:{name:this.sanitizeToolName(m.name||m.tool_call_id),content:typeof m.content=="string"?m.content:JSON.stringify(m.content)}}}]};if(m.role==="assistant"&&m.tool_calls&&m.tool_calls.length>0){let f=[];if(typeof m.content=="string"&&m.content)f.push({text:m.content});else if(Array.isArray(m.content)){let g=m.content.filter(w=>typeof w=="object"&&w.type==="text").map(w=>w.text).join(`
452
+ `);g&&f.push({text:g})}for(let g of m.tool_calls)f.push({functionCall:{name:this.sanitizeToolName(g.function.name),args:typeof g.function.arguments=="string"?JSON.parse(g.function.arguments||"{}"):g.function.arguments}});return{role:"model",parts:f}}return{role:m.role==="user"?"user":"model",parts:await a(m.content)}})),p=typeof n.content=="string"?n.content:await a(n.content);return{history:l,lastUserMessage:p}}handleError(e){return e.status===429?new fe(e.message,void 0,e):e.status>=400&&e.status<500?new L(e.message,e):e.message&&e.message.includes("API key")?new xe(e.message,e):new q(e.message||"Gemini Error","GEMINI_ERROR",e.status||500,e)}};c();ae();import*as Ie from"fs";import*as qr from"path";var $a="toolpack.config.json",Sn=new Map;async function Ea(r){for(;Sn.has(r);)await Sn.get(r);let e,t=new Promise(o=>{e=o});return Sn.set(r,t),()=>{Sn.delete(r),e()}}function Ye(r){if(r&&Ie.existsSync(r))return r;let e=qr.join(process.cwd(),$a);return Ie.existsSync(e)?e:null}function Gt(r){if(!r)return null;try{let e=Ie.readFileSync(r,"utf-8");return JSON.parse(e)}catch{return null}}var Ut=null;function Wr(r){if(Ut)return Ut;let e=r||Ye();return Ut=Gt(e)||{},Ut}function Ur(){Ut=null}function Sw(r){return(Wr(r).ollama?.models||[]).map(o=>({type:`ollama-${o.model.replace(/[:.]/g,"-")}`,model:o.model,label:o.label||o.model}))}function Rn(r){return Wr(r).ollama?.baseUrl||"http://localhost:11434"}async function Rw(r){let{type:e,value:t,configPath:o}=r,n=o||Ye();n||(n=qr.join(process.cwd(),$a));let s=await Ea(n);try{let i=Gt(n)||{};switch(i.hitl||(i.hitl={}),i.hitl.bypass||(i.hitl.bypass={}),e){case"tool":i.hitl.bypass.tools||(i.hitl.bypass.tools=[]),i.hitl.bypass.tools.includes(t)||i.hitl.bypass.tools.push(t);break;case"category":i.hitl.bypass.categories||(i.hitl.bypass.categories=[]),i.hitl.bypass.categories.includes(t)||i.hitl.bypass.categories.push(t);break;case"level":{i.hitl.bypass.levels||(i.hitl.bypass.levels=[]);let a=t;i.hitl.bypass.levels.includes(a)||i.hitl.bypass.levels.push(a);break}}try{Ie.writeFileSync(n,JSON.stringify(i,null,4),"utf-8")}catch(a){throw new A(`Failed to write bypass rule to config file: ${a instanceof Error?a.message:String(a)}`,"CONFIG_WRITE_ERROR")}Ur()}finally{s()}}async function _w(r){let{type:e,value:t,configPath:o}=r,n=o||Ye();if(!n)return;let s=await Ea(n);try{let i=Gt(n);if(!i?.hitl?.bypass)return;switch(e){case"tool":i.hitl.bypass.tools&&(i.hitl.bypass.tools=i.hitl.bypass.tools.filter(a=>a!==t));break;case"category":i.hitl.bypass.categories&&(i.hitl.bypass.categories=i.hitl.bypass.categories.filter(a=>a!==t));break;case"level":i.hitl.bypass.levels&&(i.hitl.bypass.levels=i.hitl.bypass.levels.filter(a=>a!==t));break}try{Ie.writeFileSync(n,JSON.stringify(i,null,4),"utf-8")}catch(a){throw new A(`Failed to remove bypass rule from config file: ${a instanceof Error?a.message:String(a)}`,"CONFIG_WRITE_ERROR")}Ur()}finally{s()}}c();c();ae();k();c();import Da from"http";function Re(r,e,t,o,n=12e4){return new Promise((s,i)=>{let a=new URL(e,r),l={hostname:a.hostname,port:a.port,path:a.pathname,method:t,headers:{"Content-Type":"application/json"},timeout:n},p=Da.request(l,m=>{let f=[];m.on("data",g=>f.push(g)),m.on("end",()=>{s({status:m.statusCode||0,body:Buffer.concat(f).toString("utf-8")})})});p.on("error",m=>i(m)),p.on("timeout",()=>{p.destroy(),i(new Error("Request timed out"))}),o&&p.write(JSON.stringify(o)),p.end()})}function Gr(r,e,t,o=12e4,n){let s,i=!1;return n&&n.addEventListener("abort",()=>{i=!0,s&&s.destroy()},{once:!0}),{stream:async function*(){let l=new URL(e,r),p={hostname:l.hostname,port:l.port,path:l.pathname,method:"POST",headers:{"Content-Type":"application/json"},timeout:o},m=await new Promise((g,w)=>{s=Da.request(p,g),s.on("error",w),s.on("timeout",()=>{s.destroy(),w(new Error("Stream request timed out"))}),s.write(JSON.stringify(t)),s.end()});if(m.statusCode&&m.statusCode>=400){let g="";for await(let w of m)g+=w.toString();throw new Error(`Ollama HTTP ${m.statusCode}: ${g}`)}let f="";for await(let g of m){if(i)break;let w=g.toString();if(f+=w,f.includes('"error"'))try{let T=JSON.parse(f.trim());if(T.error)throw new Error(`Ollama: ${T.error}`)}catch(T){if(T.message.startsWith("Ollama:"))throw T}let b=f.split(`
453
+ `);f=b.pop()||"";for(let T of b)T.trim()&&(yield T)}f.trim()&&!i&&(yield f.trim())}(),abort:()=>{i=!0,s&&s.destroy()}}}var Ze=class extends te{config;baseUrl;timeout;modelName;constructor(e){super(),this.config=e,this.baseUrl=e.baseUrl||"http://localhost:11434",this.timeout=e.timeout||12e4,this.modelName=e.model}getDisplayName(){return"Ollama"}async getModels(){try{return(await this.listModels()).map(t=>({id:t.name,displayName:t.name,capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!0,vision:!0}}))}catch{return[]}}async connect(){let e=await this.listModels(),t=this.config.model.split(":")[0].toLowerCase();if(!e.some(n=>n.name.split(":")[0].toLowerCase()===t||n.name.toLowerCase()===this.config.model.toLowerCase()))throw new L(`Model "${this.config.model}" is not pulled in Ollama. Run: ollama pull ${this.config.model}
454
+ Available models: ${e.map(n=>n.name).join(", ")||"(none)"}`);return e}async listModels(){try{let e=await Re(this.baseUrl,"/api/tags","GET",void 0,5e3);if(e.status!==200)throw new q(`Ollama returned status ${e.status}`,"OLLAMA_ERROR",e.status);return JSON.parse(e.body).models||[]}catch(e){throw e instanceof q?e:new Ve(`Cannot connect to Ollama at ${this.baseUrl}. Is Ollama running? (ollama serve)`,e)}}async isAvailable(){try{return await Re(this.baseUrl,"/api/tags","GET",void 0,3e3),!0}catch{return!1}}async isModelAvailable(e){try{let t=await this.listModels(),o=(e||this.config.model).toLowerCase(),n=o.split(":")[0];return t.some(s=>s.name.split(":")[0].toLowerCase()===n||s.name.toLowerCase()===o)}catch{return!1}}sanitizeToolName(e){return e.replace(/\./g,"_")}restoreToolName(e,t){return t?.find(n=>this.sanitizeToolName(n.function.name)===e)?.function.name||e.replace(/_/g,".")}async generate(e){let t=e.__toolpack_request_id||`gen-${Date.now()}`,o=await Promise.all(e.messages.map(i=>this.toOllamaMessage(i,e.mediaOptions))),n=e.model||this.config.model,s={model:n,messages:o,stream:!1,options:{temperature:e.temperature??this.config.temperature??.7,num_ctx:this.config.numCtx}};e.tools&&e.tools.length>0&&e.tool_choice!=="none"&&(s.tools=e.tools.map(i=>({type:"function",function:{name:this.sanitizeToolName(i.function.name),description:i.function.description,parameters:i.function.parameters}})),y(`[Ollama][${t}] Sending ${e.tools.length} tools with tool_choice: ${e.tool_choice||"unset"}`),e.tools.length>0&&y(`[Ollama][${t}] First tool: ${O(e.tools[0],800)}`),y(`[Ollama][${t}] NO TOOLS in request`)),y(`[Ollama][${t}] generate() request: model=${n}, messages=${e.messages.length}, tools=${e.tools?.length||0}`),ee(t,"Ollama",e.messages);try{let i=await Re(this.baseUrl,"/api/chat","POST",s,this.timeout);if(i.status!==200)throw this.handleHttpError(i.status,i.body);let a=JSON.parse(i.body),l=[];if(a.message?.tool_calls)for(let m of a.message.tool_calls)l.push({id:`ollama_${Date.now()}_${Math.random().toString(36).substring(2,8)}`,name:this.restoreToolName(m.function.name,e.tools),arguments:m.function.arguments||{}});let p={content:a.message?.content||null,usage:a.prompt_eval_count!=null?{prompt_tokens:a.prompt_eval_count||0,completion_tokens:a.eval_count||0,total_tokens:(a.prompt_eval_count||0)+(a.eval_count||0)}:void 0,finish_reason:l.length>0?"tool_calls":a.done?"stop":void 0,tool_calls:l.length>0?l:void 0,raw:a};return y(`[Ollama][${t}] Response finish_reason=${p.finish_reason} tool_calls=${l.length} content_preview=${O(p.content,200)}`),p}catch(i){throw i instanceof q?i:new Ve(`Failed to generate with Ollama model "${n}": ${i.message}`,i)}}async*stream(e){let t=e.__toolpack_request_id||`str-${Date.now()}`,o=await Promise.all(e.messages.map(a=>this.toOllamaMessage(a,e.mediaOptions))),n=e.model||this.config.model,s={model:n,messages:o,stream:!0,options:{temperature:e.temperature??this.config.temperature??.7,num_ctx:this.config.numCtx}};e.tools&&e.tools.length>0&&e.tool_choice!=="none"&&(s.tools=e.tools.map(a=>({type:"function",function:{name:this.sanitizeToolName(a.function.name),description:a.function.description,parameters:a.function.parameters}})),y(`[Ollama][${t}] Sending ${e.tools.length} tools with tool_choice: ${e.tool_choice||"unset"}`),e.tools.length>0&&y(`[Ollama][${t}] First tool: ${O(e.tools[0],800)}`),y(`[Ollama][${t}] NO TOOLS in request`)),y(`[Ollama][${t}] Stream request: model=${n}, messages=${e.messages.length}, tools=${e.tools?.length||0}`),ee(t,"Ollama",e.messages);let{stream:i}=Gr(this.baseUrl,"/api/chat",s,this.timeout,e.signal);try{for await(let a of i)try{let l=JSON.parse(a);if(l.message?.content){let p=l.message.tool_calls&&l.message.tool_calls.length>0;yield{delta:l.message.content,finish_reason:l.done&&!p?"stop":void 0,usage:l.done&&l.prompt_eval_count!=null?{prompt_tokens:l.prompt_eval_count||0,completion_tokens:l.eval_count||0,total_tokens:(l.prompt_eval_count||0)+(l.eval_count||0)}:void 0}}if(l.message?.tool_calls&&l.message.tool_calls.length>0){let p=l.message.tool_calls.map(m=>({id:`ollama_${Date.now()}_${Math.random().toString(36).substring(2,8)}`,name:this.restoreToolName(m.function.name,e.tools),arguments:m.function.arguments||{}}));y(`[Ollama][${t}] Stream finish_reason=tool_calls name=${p[0]?.name}`),yield{delta:"",finish_reason:"tool_calls",tool_calls:p}}if(l.done&&!l.message?.content&&!l.message?.tool_calls){Ae(`[Ollama][${t}] Stream chunk finish_reason=stop`),yield{delta:"",finish_reason:"stop"};return}}catch{}}catch(a){throw new Ve(`Stream failed for Ollama model "${n}": ${a.message}`,a)}}async embed(e){let t=e.__toolpack_request_id||`emb-${Date.now()}`,o=typeof e.input=="string"?[e.input]:e.input,n=e.model||this.config.model;y(`[Ollama][${t}] Embedding request: model=${n}, inputs=${o.length}`);try{let s=await Re(this.baseUrl,"/api/embed","POST",{model:n,input:o},this.timeout);if(s.status!==200)throw this.handleHttpError(s.status,s.body);return{embeddings:JSON.parse(s.body).embeddings||[]}}catch(s){throw s instanceof q?s:new Ve(`Embedding failed for Ollama model "${n}": ${s.message}`,s)}}async disconnect(){}async toOllamaMessage(e,t={}){let o="",n=[],{normalizeImagePart:s}=await Promise.resolve().then(()=>(ht(),Wt));if(typeof e.content=="string")o=e.content;else if(e.content!==null){for(let a of e.content)if(a.type==="text")o+=a.text+`
455
+ `;else if(a.type==="image_url"||a.type==="image_data"||a.type==="image_file")try{let{data:l}=await s(a);n.push(l)}catch{a.type==="image_url"?o+=`[Image: ${a.image_url.url}]
456
456
  `:o+=`[Unresolvable Image]
457
- `}o=o.trim()}let i={role:e.role,content:o};return n.length>0&&(i.images=n),e.role==="assistant"&&e.tool_calls&&e.tool_calls.length>0?i.tool_calls=e.tool_calls.map(a=>({function:{name:this.sanitizeToolName(a.function.name),arguments:typeof a.function.arguments=="string"?JSON.parse(a.function.arguments||"{}"):a.function.arguments}})):e.role==="tool"&&(i.content=o||JSON.stringify(e.content),e.name&&(i.tool_name=this.sanitizeToolName(e.name))),i}handleHttpError(e,t){let o=`Ollama error (HTTP ${e})`;try{let n=JSON.parse(t);n.error&&(o=`Ollama: ${n.error}`)}catch{}return e===404?new j(`Model not found: ${o}`):new W(o,"OLLAMA_ERROR",e)}};l();var Gt=class extends Z{baseUrl;timeout;adapterCache=new Map;capabilityCache=new Map;constructor(e){super(),this.baseUrl=e?.baseUrl||"http://localhost:11434",this.timeout=12e4}getDisplayName(){return"Ollama"}async getModels(){let e;try{let t=await Se(this.baseUrl,"/api/tags","GET",void 0,5e3);if(t.status!==200)return[];e=JSON.parse(t.body).models||[]}catch{return[]}return Promise.all(e.map(t=>this.buildModelInfo(t)))}async generate(e){return this.getAdapterForModel(e.model).generate(this.stripToolsIfNeeded(e))}async*stream(e){yield*this.getAdapterForModel(e.model).stream(this.stripToolsIfNeeded(e))}async embed(e){return this.getAdapterForModel(e.model).embed(e)}async disconnect(){this.adapterCache.clear(),this.capabilityCache.clear()}stripToolsIfNeeded(e){let t=this.capabilityCache.get(e.model);if(t&&!t.toolCalling&&e.tools&&e.tools.length>0){let{tools:o,tool_choice:n,...s}=e,i=s,a={role:"system",content:"You do not have access to any tools or functions. Do not attempt to call tools, output tool invocations, or reference tool usage. Answer the user directly using only your own knowledge."};return i.messages=[...i.messages,a],i}return e}getAdapterForModel(e){let t=this.adapterCache.get(e);return t||(t=new et({model:e,baseUrl:this.baseUrl,timeout:this.timeout}),this.adapterCache.set(e,t)),t}async buildModelInfo(e){let t=!1,o=!1,n=!1;try{let a=await Se(this.baseUrl,"/api/show","POST",{model:e.name},3e3);if(a.status===200){let p=(JSON.parse(a.body).details?.families||[]).map(m=>m.toLowerCase());o=p.some(m=>["clip","mllama"].includes(m)),n=p.some(m=>m.includes("bert")||m.includes("nomic"))}}catch{}t=await this.probeToolSupport(e.name);let s=e.name.toLowerCase();o||(o=["llava","vision","bakllava","moondream"].some(c=>s.includes(c))),n||(n=["nomic-embed","mxbai-embed","all-minilm","bge-","snowflake-arctic-embed"].some(c=>s.includes(c)));let i={toolCalling:t,vision:o,embeddings:n};return this.capabilityCache.set(e.name,i),{id:e.name,displayName:e.name,capabilities:{chat:!0,streaming:!0,toolCalling:t,embeddings:n,vision:o}}}async probeToolSupport(e){try{let t=await Se(this.baseUrl,"/api/chat","POST",{model:e,messages:[{role:"user",content:"hi"}],tools:[{type:"function",function:{name:"__probe",description:"probe",parameters:{type:"object",properties:{}}}}],stream:!1},1e4);return t.status>=400?!1:!JSON.parse(t.body).error}catch{return!1}}};l();var Gr=[{model:"qwen2.5-coder:3b",label:"Qwen 2.5 Coder 3B",params:"3B",size:"~2GB",selectorCapability:5,description:"Best code understanding at small size. Excellent HTML/CSS comprehension."},{model:"phi3:mini",label:"Phi-3 Mini",params:"3.8B",size:"~2.3GB",selectorCapability:4,description:"Strong reasoning for its size. Good at structured output."},{model:"codegemma:2b",label:"CodeGemma 2B",params:"2B",size:"~1.4GB",selectorCapability:4,description:"Compact code model from Google. Fast inference."},{model:"deepseek-coder:1.3b",label:"DeepSeek Coder 1.3B",params:"1.3B",size:"~0.8GB",selectorCapability:3,description:"Smallest viable option. Very fast but less accurate."},{model:"qwen2.5-coder:7b",label:"Qwen 2.5 Coder 7B",params:"7B",size:"~4.5GB",selectorCapability:5,description:"Higher accuracy than 3B variant. Requires more RAM/VRAM."},{model:"codellama:7b",label:"Code Llama 7B",params:"7B",size:"~3.8GB",selectorCapability:4,description:"Meta code model. Solid HTML/CSS understanding."}];function Rw(){return Gr[0].model}function _w(r){let e=r.toLowerCase();return Gr.some(t=>t.model.toLowerCase()===e||t.model.split(":")[0].toLowerCase()===e.split(":")[0].toLowerCase())}function $w(){return[...Gr]}l();import Ea from"openai";ce();k();var ht=class extends Z{client;constructor(e,t){super(),this.client=new Ea({apiKey:e,baseURL:t,timeout:6e4,maxRetries:2})}supportsFileUpload(){return!0}async uploadFile(e){try{let t=await import("fs");if(!e.filePath)throw new j("OpenAI uploadFile requires a filePath.");return{id:(await this.client.files.create({file:t.createReadStream(e.filePath),purpose:e.purpose||"vision"})).id}}catch(t){throw this.handleError(t)}}async deleteFile(e){try{await this.client.files.delete(e)}catch(t){throw this.handleError(t)}}getDisplayName(){return"OpenAI"}async getModels(){return[{id:"gpt-4.1-mini",displayName:"GPT-4.1 Mini",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:1047576,maxOutputTokens:32768,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:null,costTier:"low"},{id:"gpt-4.1",displayName:"GPT-4.1",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:1047576,maxOutputTokens:32768,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:null,costTier:"medium"},{id:"gpt-5.1",displayName:"GPT-5.1",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:4e5,maxOutputTokens:128e3,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:"standard",costTier:"medium"},{id:"gpt-5.2",displayName:"GPT-5.2",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:4e5,maxOutputTokens:128e3,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:"standard",costTier:"high"},{id:"gpt-5.4",displayName:"GPT-5.4",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:105e4,maxOutputTokens:128e3,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:"standard",costTier:"high"},{id:"gpt-5.4-pro",displayName:"GPT-5.4 Pro",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:105e4,maxOutputTokens:128e3,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:"extended",costTier:"premium"}]}sanitizeToolName(e){return e.replace(/\./g,"_")}async generate(e){try{let t=e.__toolpack_request_id||`gen-${Date.now()}`,n={messages:await Promise.all(e.messages.map(f=>this.toOpenAIMessage(f,e.mediaOptions))),model:e.model,temperature:e.temperature,max_tokens:e.max_tokens,top_p:e.top_p,response_format:e.response_format==="json_object"?{type:"json_object"}:void 0,stream:!1},s=new Map;e.tools&&e.tools.length>0&&(n.tools=e.tools.map(f=>{let g=this.sanitizeToolName(f.function.name);return s.set(g,f.function.name),{type:"function",function:{name:g,description:f.function.description,parameters:f.function.parameters}}}),n.tool_choice=e.tool_choice||"auto",y(`[OpenAI][${t}] Sending ${n.tools.length} tools with tool_choice: ${n.tool_choice}`),y(`[OpenAI][${t}] First tool: ${O(n.tools[0],800)}`)),y(`[OpenAI][${t}] Request params: ${O({model:n.model,messages_count:n.messages.length,has_tools:!!n.tools,tools_count:n.tools?.length,tool_choice:n.tool_choice},800)}`),Y(t,"OpenAI",n.messages);let i=await this.client.chat.completions.create(n,e.signal?{signal:e.signal}:void 0);Ae(`[OpenAI][${t}] Raw completion: ${JSON.stringify(i)}`);let a=i.choices[0].message;y(`[OpenAI][${t}] Response: finish_reason=${i.choices[0].finish_reason}`),y(`[OpenAI][${t}] Response has tool_calls: ${!!a.tool_calls}, count: ${a.tool_calls?.length||0}`),y(`[OpenAI][${t}] Response content: ${JSON.stringify(a.content)}`),a.content&&y(`[OpenAI][${t}] Response content preview: ${O(a.content,200)}`);let c=i.choices[0],p,m=c.message.tool_calls;return m&&m.length>0&&(p=m.map(f=>({id:f.id,name:s.get(f.function.name)||f.function.name,arguments:JSON.parse(f.function.arguments)}))),{content:c.message.content,usage:i.usage?{prompt_tokens:i.usage.prompt_tokens,completion_tokens:i.usage.completion_tokens,total_tokens:i.usage.total_tokens}:void 0,finish_reason:c.finish_reason,tool_calls:p,raw:i}}catch(t){throw this.handleError(t)}}async*stream(e){try{let t=e.__toolpack_request_id||`str-${Date.now()}`,n={messages:await Promise.all(e.messages.map(c=>this.toOpenAIMessage(c,e.mediaOptions))),model:e.model,temperature:e.temperature,max_tokens:e.max_tokens,top_p:e.top_p,response_format:e.response_format==="json_object"?{type:"json_object"}:void 0,stream:!0},s=new Map;e.tools&&e.tools.length>0?(n.tools=e.tools.map(c=>{let p=this.sanitizeToolName(c.function.name);return s.set(p,c.function.name),{type:"function",function:{name:p,description:c.function.description,parameters:c.function.parameters}}}),n.tool_choice=e.tool_choice||"auto",y(`[OpenAI][${t}] Sending ${n.tools.length} tools with tool_choice: ${n.tool_choice}`),y(`[OpenAI][${t}] First tool: ${O(n.tools[0],800)}`)):y(`[OpenAI][${t}] NO TOOLS in request`),y(`[OpenAI][${t}] Stream request: model=${n.model}, messages=${n.messages.length}, tools=${n.tools?.length||0}, tool_choice=${n.tool_choice??"unset"}`),Y(t,"OpenAI",n.messages);let i=await this.client.chat.completions.create(n,e.signal?{signal:e.signal}:void 0),a=new Map;for await(let c of i){let p=c.choices[0];if(p.finish_reason&&Ae(`[OpenAI][${t}] Stream chunk finish_reason=${p.finish_reason}`),p.delta.tool_calls)for(let m of p.delta.tool_calls){let f=m.index;a.has(f)||a.set(f,{id:m.id||"",name:m.function?.name||"",args:""});let g=a.get(f);m.id&&(g.id=m.id),m.function?.name&&(g.name=m.function.name),m.function?.arguments&&(g.args+=m.function.arguments),Ae(`[OpenAI][${t}] tool_call_delta idx=${f} id=${m.id||g.id||""} name=${m.function?.name||g.name||""} args_delta=${O(m.function?.arguments||"",200)}`)}if(p.delta.content&&(yield{delta:p.delta.content,finish_reason:p.finish_reason,usage:c.usage}),!p.delta.content&&p.finish_reason&&p.finish_reason!=="tool_calls"&&(yield{delta:"",finish_reason:p.finish_reason,usage:c.usage}),p.finish_reason==="tool_calls"&&a.size>0){let m=Array.from(a.values()).map(f=>({id:f.id,name:s.get(f.name)||f.name,arguments:JSON.parse(f.args||"{}")}));y(`[OpenAI][${t}] Stream finish_reason=tool_calls accumulated_calls=${m.length} names=${m.map(f=>f.name).join(", ")}`),yield{delta:"",finish_reason:"tool_calls",tool_calls:m}}}}catch(t){throw this.handleError(t)}}async embed(e){try{let t=typeof e.input=="string"?[e.input]:e.input,o=await this.client.embeddings.create({model:e.model,input:t});return{embeddings:o.data.map(n=>n.embedding),usage:o.usage}}catch(t){throw this.handleError(t)}}async toOpenAIMessage(e,t={}){if(e.role==="tool"&&e.tool_call_id)return{role:"tool",tool_call_id:e.tool_call_id,content:typeof e.content=="string"?e.content:JSON.stringify(e.content??"")};if(e.role==="assistant"&&e.tool_calls&&e.tool_calls.length>0)return{role:"assistant",content:typeof e.content=="string"?e.content:"",tool_calls:e.tool_calls.map(s=>({id:s.id,type:"function",function:{name:this.sanitizeToolName(s.function.name),arguments:s.function.arguments}}))};if(typeof e.content=="string")return{role:e.role,content:e.content};if(e.content===null||e.content===void 0)return{role:e.role,content:""};let{normalizeImagePart:o}=await Promise.resolve().then(()=>(gt(),qt)),n=await Promise.all(e.content.map(async s=>{if(s.type==="text")return{type:"text",text:s.text};if(s.type==="image_url")return{type:"image_url",image_url:{url:s.image_url.url}};if(s.type==="image_data"||s.type==="image_file"){let{data:i,mimeType:a}=await o(s);return{type:"image_url",image_url:{url:`data:${a};base64,${i}`}}}return null}));return{role:e.role,content:n.filter(Boolean)}}handleError(e){if(e instanceof Ea.APIError){let t=e.message;return e.status===401?new we(t,e):e.status===429?new Pe(t,void 0,e):e.status&&e.status>=400&&e.status<500?new j(t,e):new W(t,e.code||"OPENAI_ERROR",e.status||500,e)}return new W("Unknown error","UNKNOWN",500,e)}};l();var Da="https://openrouter.ai/api/v1",Rn=class extends ht{name="openrouter";_apiKey;constructor(e,t={}){super(e,Da),this._apiKey=e}getDisplayName(){return"OpenRouter"}supportsFileUpload(){return!1}async generate(e){return super.generate(this.normalizeRequest(e))}async*stream(e){yield*super.stream(this.normalizeRequest(e))}normalizeRequest(e){return e.tool_choice==="none"?{...e,tools:void 0,tool_choice:void 0}:e}async getModels(){try{let e=await fetch(`${Da}/models`,{headers:{Authorization:`Bearer ${this._apiKey}`}});return e.ok?(await e.json()).data.map(o=>this.mapModel(o)):[]}catch{return[]}}mapModel(e){let o=(e.architecture?.modality??"text->text").includes("image");return{id:e.id,displayName:e.name??e.id,capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:o},contextWindow:e.context_length??void 0,maxOutputTokens:e.top_provider?.max_completion_tokens??void 0,inputModalities:o?["text","image"]:["text"],outputModalities:["text"],reasoningTier:null,costTier:this.deriveCostTier(e.pricing)}}deriveCostTier(e){if(!e?.prompt)return"unknown";let t=parseFloat(e.prompt)*1e6;return t<1?"low":t<5?"medium":t<20?"high":"premium"}};gt();l();Lt();l();Lt();var un=class{tools=new Map;projects=new Map;config=re;register(e){this.tools.set(e.name,e)}registerCustom(e){this.tools.set(e.name,e)}get(e){return this.tools.get(e)}has(e){return this.tools.has(e)}getNames(){return Array.from(this.tools.keys())}getByCategory(e){return Array.from(this.tools.values()).filter(t=>t.category===e)}getEnabled(){if(this.config.enabledTools.length===0&&this.config.enabledToolCategories.length===0)return Array.from(this.tools.values());let e=this.getByNames(this.config.enabledTools),t=this.getByCategories(this.config.enabledToolCategories),o=new Set,n=[];for(let s of[...e,...t])o.has(s.name)||(o.add(s.name),n.push(s));return n}getSchemas(e){return(e?e.map(o=>this.tools.get(o)).filter(Boolean):this.getEnabled()).map(o=>({name:o.name,displayName:o.displayName,description:o.description,parameters:o.parameters,category:o.category}))}getByNames(e){return e.map(t=>this.tools.get(t)).filter(Boolean)}getByCategories(e){let t=new Set(e);return Array.from(this.tools.values()).filter(o=>t.has(o.category))}getCategories(){let e=new Set;for(let t of this.tools.values())e.add(t.category);return Array.from(e)}getAll(){return Array.from(this.tools.values())}setConfig(e){this.config=e}getConfig(){return this.config}get size(){return this.tools.size}async validateDependencies(e){let t=e.dependencies;if(!t||Object.keys(t).length===0)return[];let o=[];for(let n of Object.keys(t))try{await import(n)}catch{o.push(n)}return o}async loadProject(e){let t=await this.validateDependencies(e);if(t.length>0)throw new Error(`Tool project "${e.manifest.name}" has missing dependencies: ${t.join(", ")}. Install them with: npm install ${t.join(" ")}`);this.projects.set(e.manifest.name,e);for(let o of e.tools)this.register(o)}async loadProjects(e){for(let t of e)await this.loadProject(t)}getProject(e){return this.projects.get(e)}getProjects(){return Array.from(this.projects.values())}getProjectNames(){return Array.from(this.projects.keys())}async loadBuiltIn(){let{fsToolsProject:e}=await Promise.resolve().then(()=>(ls(),zc)),{execToolsProject:t}=await Promise.resolve().then(()=>(gs(),Mp)),{systemToolsProject:o}=await Promise.resolve().then(()=>(vs(),um)),{httpToolsProject:n}=await Promise.resolve().then(()=>(_s(),Qm)),{githubToolsProject:s}=await Promise.resolve().then(()=>(Fs(),ou)),{webToolsProject:i}=await Promise.resolve().then(()=>(Ys(),Pf)),{codingToolsProject:a}=await Promise.resolve().then(()=>(hi(),fh)),{gitToolsProject:c}=await Promise.resolve().then(()=>(yi(),Kh)),{diffToolsProject:p}=await Promise.resolve().then(()=>(bi(),ly)),{dbToolsProject:m}=await Promise.resolve().then(()=>(Ti(),Ay)),{cloudToolsProject:f}=await Promise.resolve().then(()=>(xi(),Hy)),{slackToolsProject:g}=await Promise.resolve().then(()=>(_i(),Eb));await this.loadProjects([e,t,o,n,s,i,a,c,p,m,f,g])}};Us();l();k();function Ov(r){if(!r.key||!/^[a-z0-9-]+$/.test(r.key))throw new Error(`Invalid tool project key: "${r.key}". Must be non-empty, lowercase, and contain no spaces (use hyphens).`);if(!r.name.trim())throw new Error("Tool project name cannot be empty.");if(!r.tools||r.tools.length===0)throw new Error("Tool project must contain at least one tool.");for(let t of r.tools){if(!t.name)throw new Error("Tool is missing a name.");if(!t.description)throw new Error(`Tool "${t.name}" is missing a description.`);if(!t.parameters)throw new Error(`Tool "${t.name}" is missing parameters.`);if(typeof t.execute!="function")throw new Error(`Tool "${t.name}" is missing an execute function.`);t.category!==r.category&&I(`[Toolpack] Tool "${t.name}" has category "${t.category}" which does not match project category "${r.category}".`)}let e=r.tools.map(t=>t.name);return{manifest:{key:r.key,name:r.name,displayName:r.displayName,version:r.version,description:r.description,author:r.author,repository:r.repository,category:r.category,tools:e},dependencies:r.dependencies,tools:r.tools}}ls();gs();vs();_s();Fs();Ys();hi();yi();bi();Ti();xi();l();l();k();import{execFileSync as Nv}from"child_process";function N(r,e){if(r.includes("\0")||r.includes(`
458
- `)||r.includes("\r"))throw new Error(`Invalid ${e}: contains disallowed characters.`);return r}function Av(r){let e=typeof r.stdout=="string"?r.stdout:"",t=typeof r.stderr=="string"?r.stderr:"",o=r.status??"unknown",n=t.split(/\r?\n/).filter(i=>i.trim().length>0),s=n.find(i=>i.toLowerCase().startsWith("error:"))||n[0]||r.message||"";return`kubectl failed (exit code ${o})${s?`: ${s.trim()}`:""}
457
+ `}o=o.trim()}let i={role:e.role,content:o};return n.length>0&&(i.images=n),e.role==="assistant"&&e.tool_calls&&e.tool_calls.length>0?i.tool_calls=e.tool_calls.map(a=>({function:{name:this.sanitizeToolName(a.function.name),arguments:typeof a.function.arguments=="string"?JSON.parse(a.function.arguments||"{}"):a.function.arguments}})):e.role==="tool"&&(i.content=o||JSON.stringify(e.content),e.name&&(i.tool_name=this.sanitizeToolName(e.name))),i}handleHttpError(e,t){let o=`Ollama error (HTTP ${e})`;try{let n=JSON.parse(t);n.error&&(o=`Ollama: ${n.error}`)}catch{}return e===404?new L(`Model not found: ${o}`):new q(o,"OLLAMA_ERROR",e)}};c();var Bt=class extends te{baseUrl;timeout;adapterCache=new Map;capabilityCache=new Map;constructor(e){super(),this.baseUrl=e?.baseUrl||"http://localhost:11434",this.timeout=12e4}getDisplayName(){return"Ollama"}async getModels(){let e;try{let t=await Re(this.baseUrl,"/api/tags","GET",void 0,5e3);if(t.status!==200)return[];e=JSON.parse(t.body).models||[]}catch{return[]}return Promise.all(e.map(t=>this.buildModelInfo(t)))}async generate(e){return this.getAdapterForModel(e.model).generate(this.stripToolsIfNeeded(e))}async*stream(e){yield*this.getAdapterForModel(e.model).stream(this.stripToolsIfNeeded(e))}async embed(e){return this.getAdapterForModel(e.model).embed(e)}async disconnect(){this.adapterCache.clear(),this.capabilityCache.clear()}stripToolsIfNeeded(e){let t=this.capabilityCache.get(e.model);if(t&&!t.toolCalling&&e.tools&&e.tools.length>0){let{tools:o,tool_choice:n,...s}=e,i=s,a={role:"system",content:"You do not have access to any tools or functions. Do not attempt to call tools, output tool invocations, or reference tool usage. Answer the user directly using only your own knowledge."};return i.messages=[...i.messages,a],i}return e}getAdapterForModel(e){let t=this.adapterCache.get(e);return t||(t=new Ze({model:e,baseUrl:this.baseUrl,timeout:this.timeout}),this.adapterCache.set(e,t)),t}async buildModelInfo(e){let t=!1,o=!1,n=!1;try{let a=await Re(this.baseUrl,"/api/show","POST",{model:e.name},3e3);if(a.status===200){let p=(JSON.parse(a.body).details?.families||[]).map(m=>m.toLowerCase());o=p.some(m=>["clip","mllama"].includes(m)),n=p.some(m=>m.includes("bert")||m.includes("nomic"))}}catch{}t=await this.probeToolSupport(e.name);let s=e.name.toLowerCase();o||(o=["llava","vision","bakllava","moondream"].some(l=>s.includes(l))),n||(n=["nomic-embed","mxbai-embed","all-minilm","bge-","snowflake-arctic-embed"].some(l=>s.includes(l)));let i={toolCalling:t,vision:o,embeddings:n};return this.capabilityCache.set(e.name,i),{id:e.name,displayName:e.name,capabilities:{chat:!0,streaming:!0,toolCalling:t,embeddings:n,vision:o}}}async probeToolSupport(e){try{let t=await Re(this.baseUrl,"/api/chat","POST",{model:e,messages:[{role:"user",content:"hi"}],tools:[{type:"function",function:{name:"__probe",description:"probe",parameters:{type:"object",properties:{}}}}],stream:!1},1e4);return t.status>=400?!1:!JSON.parse(t.body).error}catch{return!1}}};c();var Br=[{model:"qwen2.5-coder:3b",label:"Qwen 2.5 Coder 3B",params:"3B",size:"~2GB",selectorCapability:5,description:"Best code understanding at small size. Excellent HTML/CSS comprehension."},{model:"phi3:mini",label:"Phi-3 Mini",params:"3.8B",size:"~2.3GB",selectorCapability:4,description:"Strong reasoning for its size. Good at structured output."},{model:"codegemma:2b",label:"CodeGemma 2B",params:"2B",size:"~1.4GB",selectorCapability:4,description:"Compact code model from Google. Fast inference."},{model:"deepseek-coder:1.3b",label:"DeepSeek Coder 1.3B",params:"1.3B",size:"~0.8GB",selectorCapability:3,description:"Smallest viable option. Very fast but less accurate."},{model:"qwen2.5-coder:7b",label:"Qwen 2.5 Coder 7B",params:"7B",size:"~4.5GB",selectorCapability:5,description:"Higher accuracy than 3B variant. Requires more RAM/VRAM."},{model:"codellama:7b",label:"Code Llama 7B",params:"7B",size:"~3.8GB",selectorCapability:4,description:"Meta code model. Solid HTML/CSS understanding."}];function $w(){return Br[0].model}function Ew(r){let e=r.toLowerCase();return Br.some(t=>t.model.toLowerCase()===e||t.model.split(":")[0].toLowerCase()===e.split(":")[0].toLowerCase())}function Dw(){return[...Br]}c();import Ma from"openai";ae();k();var yt=class extends te{client;constructor(e,t){super(),this.client=new Ma({apiKey:e,baseURL:t,timeout:6e4,maxRetries:2})}supportsFileUpload(){return!0}async uploadFile(e){try{let t=await import("fs");if(!e.filePath)throw new L("OpenAI uploadFile requires a filePath.");return{id:(await this.client.files.create({file:t.createReadStream(e.filePath),purpose:e.purpose||"vision"})).id}}catch(t){throw this.handleError(t)}}async deleteFile(e){try{await this.client.files.delete(e)}catch(t){throw this.handleError(t)}}getDisplayName(){return"OpenAI"}async getModels(){return[{id:"gpt-4.1-mini",displayName:"GPT-4.1 Mini",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:1047576,maxOutputTokens:32768,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:null,costTier:"low"},{id:"gpt-4.1",displayName:"GPT-4.1",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:1047576,maxOutputTokens:32768,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:null,costTier:"medium"},{id:"gpt-5.1",displayName:"GPT-5.1",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:4e5,maxOutputTokens:128e3,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:"standard",costTier:"medium"},{id:"gpt-5.2",displayName:"GPT-5.2",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:4e5,maxOutputTokens:128e3,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:"standard",costTier:"high"},{id:"gpt-5.4",displayName:"GPT-5.4",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:105e4,maxOutputTokens:128e3,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:"standard",costTier:"high"},{id:"gpt-5.4-pro",displayName:"GPT-5.4 Pro",capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:!0,fileUpload:!0},contextWindow:105e4,maxOutputTokens:128e3,inputModalities:["text","image"],outputModalities:["text"],reasoningTier:"extended",costTier:"premium"}]}sanitizeToolName(e){return e.replace(/\./g,"_")}async generate(e){try{let t=e.__toolpack_request_id||`gen-${Date.now()}`,n={messages:await Promise.all(e.messages.map(f=>this.toOpenAIMessage(f,e.mediaOptions))),model:e.model,temperature:e.temperature,max_tokens:e.max_tokens,top_p:e.top_p,response_format:e.response_format==="json_object"?{type:"json_object"}:void 0,stream:!1},s=new Map;e.tools&&e.tools.length>0&&(n.tools=e.tools.map(f=>{let g=this.sanitizeToolName(f.function.name);return s.set(g,f.function.name),{type:"function",function:{name:g,description:f.function.description,parameters:f.function.parameters}}}),n.tool_choice=e.tool_choice||"auto",y(`[OpenAI][${t}] Sending ${n.tools.length} tools with tool_choice: ${n.tool_choice}`),y(`[OpenAI][${t}] First tool: ${O(n.tools[0],800)}`)),y(`[OpenAI][${t}] Request params: ${O({model:n.model,messages_count:n.messages.length,has_tools:!!n.tools,tools_count:n.tools?.length,tool_choice:n.tool_choice},800)}`),ee(t,"OpenAI",n.messages);let i=await this.client.chat.completions.create(n,e.signal?{signal:e.signal}:void 0);Ae(`[OpenAI][${t}] Raw completion: ${JSON.stringify(i)}`);let a=i.choices[0].message;y(`[OpenAI][${t}] Response: finish_reason=${i.choices[0].finish_reason}`),y(`[OpenAI][${t}] Response has tool_calls: ${!!a.tool_calls}, count: ${a.tool_calls?.length||0}`),y(`[OpenAI][${t}] Response content: ${JSON.stringify(a.content)}`),a.content&&y(`[OpenAI][${t}] Response content preview: ${O(a.content,200)}`);let l=i.choices[0],p,m=l.message.tool_calls;return m&&m.length>0&&(p=m.map(f=>({id:f.id,name:s.get(f.function.name)||f.function.name,arguments:JSON.parse(f.function.arguments)}))),{content:l.message.content,usage:i.usage?{prompt_tokens:i.usage.prompt_tokens,completion_tokens:i.usage.completion_tokens,total_tokens:i.usage.total_tokens}:void 0,finish_reason:l.finish_reason,tool_calls:p,raw:i}}catch(t){throw this.handleError(t)}}async*stream(e){try{let t=e.__toolpack_request_id||`str-${Date.now()}`,n={messages:await Promise.all(e.messages.map(l=>this.toOpenAIMessage(l,e.mediaOptions))),model:e.model,temperature:e.temperature,max_tokens:e.max_tokens,top_p:e.top_p,response_format:e.response_format==="json_object"?{type:"json_object"}:void 0,stream:!0},s=new Map;e.tools&&e.tools.length>0?(n.tools=e.tools.map(l=>{let p=this.sanitizeToolName(l.function.name);return s.set(p,l.function.name),{type:"function",function:{name:p,description:l.function.description,parameters:l.function.parameters}}}),n.tool_choice=e.tool_choice||"auto",y(`[OpenAI][${t}] Sending ${n.tools.length} tools with tool_choice: ${n.tool_choice}`),y(`[OpenAI][${t}] First tool: ${O(n.tools[0],800)}`)):y(`[OpenAI][${t}] NO TOOLS in request`),y(`[OpenAI][${t}] Stream request: model=${n.model}, messages=${n.messages.length}, tools=${n.tools?.length||0}, tool_choice=${n.tool_choice??"unset"}`),ee(t,"OpenAI",n.messages);let i=await this.client.chat.completions.create(n,e.signal?{signal:e.signal}:void 0),a=new Map;for await(let l of i){let p=l.choices[0];if(p.finish_reason&&Ae(`[OpenAI][${t}] Stream chunk finish_reason=${p.finish_reason}`),p.delta.tool_calls)for(let m of p.delta.tool_calls){let f=m.index;a.has(f)||a.set(f,{id:m.id||"",name:m.function?.name||"",args:""});let g=a.get(f);m.id&&(g.id=m.id),m.function?.name&&(g.name=m.function.name),m.function?.arguments&&(g.args+=m.function.arguments),Ae(`[OpenAI][${t}] tool_call_delta idx=${f} id=${m.id||g.id||""} name=${m.function?.name||g.name||""} args_delta=${O(m.function?.arguments||"",200)}`)}if(p.delta.content&&(yield{delta:p.delta.content,finish_reason:p.finish_reason,usage:l.usage}),!p.delta.content&&p.finish_reason&&p.finish_reason!=="tool_calls"&&(yield{delta:"",finish_reason:p.finish_reason,usage:l.usage}),p.finish_reason==="tool_calls"&&a.size>0){let m=Array.from(a.values()).map(f=>({id:f.id,name:s.get(f.name)||f.name,arguments:JSON.parse(f.args||"{}")}));y(`[OpenAI][${t}] Stream finish_reason=tool_calls accumulated_calls=${m.length} names=${m.map(f=>f.name).join(", ")}`),yield{delta:"",finish_reason:"tool_calls",tool_calls:m}}}}catch(t){throw this.handleError(t)}}async embed(e){try{let t=typeof e.input=="string"?[e.input]:e.input,o=await this.client.embeddings.create({model:e.model,input:t});return{embeddings:o.data.map(n=>n.embedding),usage:o.usage}}catch(t){throw this.handleError(t)}}async toOpenAIMessage(e,t={}){if(e.role==="tool"&&e.tool_call_id)return{role:"tool",tool_call_id:e.tool_call_id,content:typeof e.content=="string"?e.content:JSON.stringify(e.content??"")};if(e.role==="assistant"&&e.tool_calls&&e.tool_calls.length>0)return{role:"assistant",content:typeof e.content=="string"?e.content:"",tool_calls:e.tool_calls.map(s=>({id:s.id,type:"function",function:{name:this.sanitizeToolName(s.function.name),arguments:s.function.arguments}}))};if(typeof e.content=="string")return{role:e.role,content:e.content};if(e.content===null||e.content===void 0)return{role:e.role,content:""};let{normalizeImagePart:o}=await Promise.resolve().then(()=>(ht(),Wt)),n=await Promise.all(e.content.map(async s=>{if(s.type==="text")return{type:"text",text:s.text};if(s.type==="image_url")return{type:"image_url",image_url:{url:s.image_url.url}};if(s.type==="image_data"||s.type==="image_file"){let{data:i,mimeType:a}=await o(s);return{type:"image_url",image_url:{url:`data:${a};base64,${i}`}}}return null}));return{role:e.role,content:n.filter(Boolean)}}handleError(e){if(e instanceof Ma.APIError){let t=e.message;return e.status===401?new xe(t,e):e.status===429?new fe(t,void 0,e):e.status&&e.status>=400&&e.status<500?new L(t,e):new q(t,e.code||"OPENAI_ERROR",e.status||500,e)}return new q("Unknown error","UNKNOWN",500,e)}};c();var Oa="https://openrouter.ai/api/v1",_n=class extends yt{name="openrouter";_apiKey;constructor(e,t={}){super(e,Oa),this._apiKey=e}getDisplayName(){return"OpenRouter"}supportsFileUpload(){return!1}async generate(e){return super.generate(this.normalizeRequest(e))}async*stream(e){yield*super.stream(this.normalizeRequest(e))}normalizeRequest(e){return e.tool_choice==="none"?{...e,tools:void 0,tool_choice:void 0}:e}async getModels(){try{let e=await fetch(`${Oa}/models`,{headers:{Authorization:`Bearer ${this._apiKey}`}});return e.ok?(await e.json()).data.map(o=>this.mapModel(o)):[]}catch{return[]}}mapModel(e){let o=(e.architecture?.modality??"text->text").includes("image");return{id:e.id,displayName:e.name??e.id,capabilities:{chat:!0,streaming:!0,toolCalling:!0,embeddings:!1,vision:o},contextWindow:e.context_length??void 0,maxOutputTokens:e.top_provider?.max_completion_tokens??void 0,inputModalities:o?["text","image"]:["text"],outputModalities:["text"],reasoningTier:null,costTier:this.deriveCostTier(e.pricing)}}deriveCostTier(e){if(!e?.prompt)return"unknown";let t=parseFloat(e.prompt)*1e6;return t<1?"low":t<5?"medium":t<20?"high":"premium"}};ht();c();jt();c();jt();var fn=class{tools=new Map;projects=new Map;config=le;register(e){this.tools.set(e.name,e)}registerCustom(e){this.tools.set(e.name,e)}get(e){return this.tools.get(e)}has(e){return this.tools.has(e)}getNames(){return Array.from(this.tools.keys())}getByCategory(e){return Array.from(this.tools.values()).filter(t=>t.category===e)}getEnabled(){if(this.config.enabledTools.length===0&&this.config.enabledToolCategories.length===0)return Array.from(this.tools.values());let e=this.getByNames(this.config.enabledTools),t=this.getByCategories(this.config.enabledToolCategories),o=new Set,n=[];for(let s of[...e,...t])o.has(s.name)||(o.add(s.name),n.push(s));return n}getSchemas(e){return(e?e.map(o=>this.tools.get(o)).filter(Boolean):this.getEnabled()).map(o=>({name:o.name,displayName:o.displayName,description:o.description,parameters:o.parameters,category:o.category}))}getByNames(e){return e.map(t=>this.tools.get(t)).filter(Boolean)}getByCategories(e){let t=new Set(e);return Array.from(this.tools.values()).filter(o=>t.has(o.category))}getCategories(){let e=new Set;for(let t of this.tools.values())e.add(t.category);return Array.from(e)}getAll(){return Array.from(this.tools.values())}setConfig(e){this.config=e}getConfig(){return this.config}get size(){return this.tools.size}async validateDependencies(e){let t=e.dependencies;if(!t||Object.keys(t).length===0)return[];let o=[];for(let n of Object.keys(t))try{await import(n)}catch{o.push(n)}return o}async loadProject(e){let t=await this.validateDependencies(e);if(t.length>0)throw new Error(`Tool project "${e.manifest.name}" has missing dependencies: ${t.join(", ")}. Install them with: npm install ${t.join(" ")}`);this.projects.set(e.manifest.name,e);for(let o of e.tools)this.register(o)}async loadProjects(e){for(let t of e)await this.loadProject(t)}getProject(e){return this.projects.get(e)}getProjects(){return Array.from(this.projects.values())}getProjectNames(){return Array.from(this.projects.keys())}async loadBuiltIn(){let{fsToolsProject:e}=await Promise.resolve().then(()=>(cs(),Kc)),{execToolsProject:t}=await Promise.resolve().then(()=>(hs(),Np)),{systemToolsProject:o}=await Promise.resolve().then(()=>(Cs(),gm)),{httpToolsProject:n}=await Promise.resolve().then(()=>($s(),Ym)),{githubToolsProject:s}=await Promise.resolve().then(()=>(qs(),ru)),{webToolsProject:i}=await Promise.resolve().then(()=>(Zs(),Rf)),{codingToolsProject:a}=await Promise.resolve().then(()=>(yi(),hh)),{gitToolsProject:l}=await Promise.resolve().then(()=>(bi(),Vh)),{diffToolsProject:p}=await Promise.resolve().then(()=>(wi(),py)),{dbToolsProject:m}=await Promise.resolve().then(()=>(xi(),Ly)),{cloudToolsProject:f}=await Promise.resolve().then(()=>(vi(),Jy)),{slackToolsProject:g}=await Promise.resolve().then(()=>($i(),Mb));await this.loadProjects([e,t,o,n,s,i,a,l,p,m,f,g])}};Gs();c();k();function Av(r){if(!r.key||!/^[a-z0-9-]+$/.test(r.key))throw new Error(`Invalid tool project key: "${r.key}". Must be non-empty, lowercase, and contain no spaces (use hyphens).`);if(!r.name.trim())throw new Error("Tool project name cannot be empty.");if(!r.tools||r.tools.length===0)throw new Error("Tool project must contain at least one tool.");for(let t of r.tools){if(!t.name)throw new Error("Tool is missing a name.");if(!t.description)throw new Error(`Tool "${t.name}" is missing a description.`);if(!t.parameters)throw new Error(`Tool "${t.name}" is missing parameters.`);if(typeof t.execute!="function")throw new Error(`Tool "${t.name}" is missing an execute function.`);t.category!==r.category&&I(`[Toolpack] Tool "${t.name}" has category "${t.category}" which does not match project category "${r.category}".`)}let e=r.tools.map(t=>t.name);return{manifest:{key:r.key,name:r.name,displayName:r.displayName,version:r.version,description:r.description,author:r.author,repository:r.repository,category:r.category,tools:e},dependencies:r.dependencies,tools:r.tools}}cs();hs();Cs();$s();qs();Zs();yi();bi();wi();xi();vi();c();c();k();import{execFileSync as Iv}from"child_process";function N(r,e){if(r.includes("\0")||r.includes(`
458
+ `)||r.includes("\r"))throw new Error(`Invalid ${e}: contains disallowed characters.`);return r}function Lv(r){let e=typeof r.stdout=="string"?r.stdout:"",t=typeof r.stderr=="string"?r.stderr:"",o=r.status??"unknown",n=t.split(/\r?\n/).filter(i=>i.trim().length>0),s=n.find(i=>i.toLowerCase().startsWith("error:"))||n[0]||r.message||"";return`kubectl failed (exit code ${o})${s?`: ${s.trim()}`:""}
459
459
  STDOUT:
460
460
  ${e}
461
461
  STDERR:
462
- ${t}`}function me(r,e,t=3e4){r.forEach((o,n)=>N(o,`kubectl argument #${n}`)),y(`[k8s-tools] execute: kubectl ${r.join(" ")}`);try{return Nv("kubectl",r,{input:e,encoding:"utf-8",maxBuffer:10485760,stdio:["pipe","pipe","pipe"],timeout:t})||"(kubectl completed with no output)"}catch(o){return Av(o)}}function Iv(r){if(!r)return 3e5;let e=r.trim().toLowerCase(),t=/^([0-9]+)(s|m|h)?$/.exec(e);if(!t)return 3e5;let o=Number(t[1]);switch(t[2]){case"h":return o*60*60*1e3;case"m":return o*60*1e3;default:return o*1e3}}var ke="kubernetes";function Db(r){if(!r)return;if(typeof r=="string")return r;let e=Object.entries(r).filter(([,t])=>t!==void 0&&t!=="");if(e.length)return e.map(([t,o])=>`${N(t,"label key")}=${N(o,"label value")}`).join(",")}var $i={name:"k8s.list_pods",displayName:"Kubernetes List Pods",description:"List pods in the current or a specific Kubernetes namespace.",category:ke,parameters:{type:"object",properties:{namespace:{type:"string",description:"Namespace to query. If omitted, uses the current namespace."},labels:{type:"string",description:"Label selector to filter pods."},labelSelector:{type:"object",description:"Map of label key/value pairs to filter pods.",additionalProperties:{type:"string"}},output:{type:"string",description:"Output format for the pod list.",enum:["wide","name","json","yaml"],default:"wide"},allNamespaces:{type:"boolean",description:"If true, list pods across all namespaces.",default:!1}},required:[]},execute:async r=>{let e=["get","pods"],t=r.output;t?e.push("-o",t):e.push("-o","wide"),r.allNamespaces&&e.push("--all-namespaces"),r.namespace&&!r.allNamespaces&&e.push("-n",N(r.namespace,"namespace"));let o=Db(r.labelSelector)??r.labels;return o&&e.push("-l",N(o,"labels")),me(e)}},Ei={name:"k8s.describe",displayName:"Kubernetes Describe Resource",description:"Describe a Kubernetes resource or resource instance.",category:ke,parameters:{type:"object",properties:{resource:{type:"string",description:"Resource type to describe, such as pod, service, deployment."},name:{type:"string",description:"Resource name. Optional for cluster-wide descriptions."},namespace:{type:"string",description:"Namespace containing the resource."}},required:["resource"]},execute:async r=>{let t=["describe",N(r.resource,"resource")];return r.name&&t.push(N(r.name,"name")),r.namespace&&t.push("-n",N(r.namespace,"namespace")),me(t)}},Di={name:"k8s.get_logs",displayName:"Kubernetes Get Pod Logs",description:"Fetch logs from a Kubernetes pod, optionally from a specific container.",category:ke,parameters:{type:"object",properties:{podName:{type:"string",description:"The name of the pod to fetch logs from."},namespace:{type:"string",description:"Namespace of the pod."},container:{type:"string",description:"Container name inside the pod."},tailLines:{type:"number",description:"Number of log lines to show from the end.",default:100},since:{type:"string",description:"Return logs newer than a relative duration like 5m or 1h."}},required:["podName"]},execute:async r=>{let e=["logs",N(r.podName,"podName")];return r.container&&e.push("-c",N(r.container,"container")),r.namespace&&e.push("-n",N(r.namespace,"namespace")),typeof r.tailLines=="number"&&e.push("--tail",`${r.tailLines}`),r.since&&e.push("--since",N(r.since,"since")),me(e)}},Mi={name:"k8s.apply_manifest",displayName:"Kubernetes Apply Manifest",description:"Apply a Kubernetes manifest from a file path or inline YAML content.",category:ke,parameters:{type:"object",properties:{path:{type:"string",description:"Path to the manifest file to apply."},manifest:{type:"string",description:"Inline YAML manifest to apply if no path is provided."},namespace:{type:"string",description:"Namespace to apply the manifest into, if supported by the manifest."},dryRun:{type:"boolean",description:"If true, perform a client-side dry run without applying changes.",default:!1}},required:[]},confirmation:{level:"high",reason:"This will change cluster state by applying a Kubernetes manifest.",showArgs:["path","namespace"]},execute:async r=>{let e=r.path,t=r.manifest,o=["apply"];if(r.dryRun&&o.push("--dry-run=client"),o.push("-f"),e)return o.push(N(e,"path")),r.namespace&&o.push("-n",N(r.namespace,"namespace")),me(o);if(!t)throw new Error("Either path or manifest is required to apply a Kubernetes manifest.");return r.namespace&&o.push("-n",N(r.namespace,"namespace")),o.push("-"),me(o,t)}},Oi={name:"k8s.delete_resource",displayName:"Kubernetes Delete Resource",description:"Delete a Kubernetes resource by type and name, or delete resources from a manifest file.",category:ke,parameters:{type:"object",properties:{resource:{type:"string",description:"Resource type to delete, such as pod, service, deployment."},name:{type:"string",description:"Name of the resource to delete."},namespace:{type:"string",description:"Namespace containing the resource."},path:{type:"string",description:"Path to a manifest file that contains the resources to delete."},force:{type:"boolean",description:"Force deletion of the resource.",default:!1},dryRun:{type:"boolean",description:"If true, perform a client-side dry run without deleting resources.",default:!1}},required:[]},confirmation:{level:"high",reason:"This will delete resources from the Kubernetes cluster.",showArgs:["resource","name","path"]},execute:async r=>{let e=r.path,t=r.resource,o=r.name;if(e){let s=["delete"];return r.dryRun&&s.push("--dry-run=client"),s.push("-f",N(e,"path")),r.namespace&&s.push("-n",N(r.namespace,"namespace")),me(s)}if(!t||!o)throw new Error("resource and name are required unless a manifest path is provided.");let n=["delete",N(t,"resource"),N(o,"name")];return r.namespace&&n.push("-n",N(r.namespace,"namespace")),r.force&&n.push("--force","--grace-period=0"),r.dryRun&&n.push("--dry-run=client"),me(n)}},Ni={name:"k8s.list_services",displayName:"Kubernetes List Services",description:"List services in the current or a specific Kubernetes namespace.",category:ke,parameters:{type:"object",properties:{namespace:{type:"string",description:"Namespace to query. If omitted, uses the current namespace."},output:{type:"string",description:"Output format for the service list.",enum:["wide","name","json","yaml"],default:"wide"},allNamespaces:{type:"boolean",description:"List services across all namespaces.",default:!1}},required:[]},execute:async r=>{let e=["get","services"],t=r.output;return e.push("-o",t||"wide"),r.allNamespaces&&e.push("--all-namespaces"),r.namespace&&!r.allNamespaces&&e.push("-n",N(r.namespace,"namespace")),me(e)}},Ai={name:"k8s.list_deployments",displayName:"Kubernetes List Deployments",description:"List deployments in the current or a specific Kubernetes namespace.",category:ke,parameters:{type:"object",properties:{namespace:{type:"string",description:"Namespace to query. If omitted, uses the current namespace."},labels:{type:"string",description:"Label selector to filter deployments."},labelSelector:{type:"object",description:"Map of label key/value pairs to filter deployments.",additionalProperties:{type:"string"}},output:{type:"string",description:"Output format for the deployment list.",enum:["wide","name","json","yaml"],default:"wide"},allNamespaces:{type:"boolean",description:"List deployments across all namespaces.",default:!1}},required:[]},execute:async r=>{let e=["get","deployments"],t=r.output;e.push("-o",t||"wide"),r.allNamespaces&&e.push("--all-namespaces"),r.namespace&&!r.allNamespaces&&e.push("-n",N(r.namespace,"namespace"));let o=Db(r.labelSelector)??r.labels;return o&&e.push("-l",N(o,"labels")),me(e)}},Ii={name:"k8s.get_config_map",displayName:"Kubernetes Get ConfigMap",description:"Retrieve a ConfigMap from a Kubernetes namespace.",category:ke,parameters:{type:"object",properties:{name:{type:"string",description:"ConfigMap name."},namespace:{type:"string",description:"Namespace containing the ConfigMap."},output:{type:"string",description:"Output format, such as yaml or json.",enum:["yaml","json"],default:"yaml"}},required:["name"]},execute:async r=>{let e=["get","configmap",N(r.name,"name"),"-o",r.output||"yaml"];return r.namespace&&e.push("-n",N(r.namespace,"namespace")),me(e)}},Li={name:"k8s.switch_context",displayName:"Kubernetes Switch Context",description:"Switch the active kubectl context to a different Kubernetes cluster or namespace configuration.",category:ke,parameters:{type:"object",properties:{context:{type:"string",description:"The kubeconfig context to switch to."}},required:["context"]},execute:async r=>me(["config","use-context",N(r.context,"context")])},ji={name:"k8s.get_namespaces",displayName:"Kubernetes Get Namespaces",description:"List namespaces in the current Kubernetes context.",category:ke,parameters:{type:"object",properties:{output:{type:"string",description:"Output format for the namespace list.",enum:["wide","name","json","yaml"],default:"wide"}},required:[]},execute:async r=>me(["get","namespaces","-o",r.output||"wide"])},Fi={name:"k8s.wait_for_deployment",displayName:"Kubernetes Wait For Deployment",description:"Wait for a Kubernetes deployment to complete its rollout.",category:ke,parameters:{type:"object",properties:{name:{type:"string",description:"Deployment name to wait for."},namespace:{type:"string",description:"Namespace containing the deployment."},timeout:{type:"string",description:"Timeout duration, e.g. 300s or 5m.",default:"300s"}},required:["name"]},execute:async r=>{let e=r.timeout,t=["rollout","status",`deployment/${N(r.name,"name")}`,"--timeout",e||"300s"];return r.namespace&&t.push("-n",N(r.namespace,"namespace")),me(t,void 0,Iv(e))}};var Lv={manifest:{key:"k8s",name:"k8s-tools",displayName:"Kubernetes",version:"1.0.0",description:"Kubernetes command and cluster inspection tools for working with kubectl and manifests.",author:"toolpack-sdk",tools:["k8s.list_pods","k8s.describe","k8s.get_logs","k8s.apply_manifest","k8s.delete_resource","k8s.list_services","k8s.list_deployments","k8s.get_config_map","k8s.switch_context","k8s.get_namespaces","k8s.wait_for_deployment"],category:"kubernetes"},tools:[$i,Ei,Di,Mi,Oi,Ni,Ai,Ii,Li,ji,Fi]};_i();l();l();k();import{spawn as jv}from"child_process";import{EventEmitter as Fv}from"events";var br=class extends Error{constructor(e,t){super(`MCP request timed out after ${t}ms: ${e}`),this.name="McpTimeoutError"}},Me=class extends Error{constructor(t,o){super(t);this.exitCode=o;this.name="McpConnectionError"}exitCode},fn=class extends Fv{constructor(t){super();this.config=t;this.defaultTimeoutMs=t.requestTimeoutMs??3e4,this.autoReconnect=t.autoReconnect??!1,this.maxReconnectAttempts=t.maxReconnectAttempts??3,this.reconnectDelayMs=t.reconnectDelayMs??1e3}config;process=null;messageQueue=new Map;nextId=1;buffer="";_connected=!1;_shuttingDown=!1;_reconnectAttempts=0;defaultTimeoutMs;autoReconnect;maxReconnectAttempts;reconnectDelayMs;get connected(){return this._connected&&this.process!==null}async initializeServer(){await this.request("initialize",{client:"toolpack-sdk"})}async connect(){if(this._shuttingDown)throw new Me("Client is shutting down");if(this.buffer="",this.process=jv(this.config.command,this.config.args||[],{env:{...process.env,...this.config.env},stdio:["pipe","pipe","pipe"]}),!this.process.stdout||!this.process.stdin)throw new Me("Failed to spawn MCP server: stdout/stdin unavailable");this.process.stdout.on("data",t=>{this.handleData(t)}),this.process.stderr&&this.process.stderr.on("data",t=>{I(`[MCP server stderr] ${t.toString().trim()}`)}),this.process.on("error",t=>{this._connected=!1,this.emit("error",t)}),this.process.on("exit",t=>{let o=this._connected;this._connected=!1,this.process=null,this.rejectAllPending(new Me(`MCP server exited with code ${t}`,t)),this.emit("close",t),o&&!this._shuttingDown&&this.autoReconnect&&this.attemptReconnect()}),this._reconnectAttempts=0,await this.initializeServer(),this._connected=!0}async attemptReconnect(){if(this._reconnectAttempts>=this.maxReconnectAttempts){this.emit("reconnect_failed",this._reconnectAttempts);return}this._reconnectAttempts++;let t=this._reconnectAttempts;if(this.emit("reconnecting",{attempt:t,max:this.maxReconnectAttempts}),await new Promise(o=>setTimeout(o,this.reconnectDelayMs*t)),!this._shuttingDown)try{await this.connect(),this.emit("reconnected",{attempt:t})}catch(o){this.emit("reconnect_error",{attempt:t,error:o})}}handleData(t){this.buffer+=t.toString();let o;for(;(o=this.buffer.indexOf(`
463
- `))!==-1;){let n=this.buffer.slice(0,o).trim();if(this.buffer=this.buffer.slice(o+1),n)try{let s=JSON.parse(n);this.handleMessage(s)}catch{}}}handleMessage(t){if(t.id&&(t.result!==void 0||t.error)){let o=this.messageQueue.get(t.id);o&&(o.timer&&clearTimeout(o.timer),t.error?o.reject(new Error(t.error.message)):o.resolve(t.result),this.messageQueue.delete(t.id))}else t.method&&(this.emit("notification",t),this.emit(t.method,t.params))}async callTool(t,o={},n){return this.request("tools/call",{name:t,arguments:o},n)}async readResource(t,o){return this.request("resources/read",{uri:t},o)}async request(t,o,n){if(!this.process||!this.process.stdin)throw new Me("Client not connected");let s=this.nextId++,i=n??this.defaultTimeoutMs,a={jsonrpc:"2.0",id:s,method:t,params:o};return new Promise((c,p)=>{let m;i>0&&(m=setTimeout(()=>{let f=this.messageQueue.get(s);f&&(this.messageQueue.delete(s),f.reject(new br(t,i)))},i)),this.messageQueue.set(s,{resolve:c,reject:p,timer:m});try{this.process.stdin.write(JSON.stringify(a)+`
464
- `)}catch(f){m&&clearTimeout(m),this.messageQueue.delete(s),p(f)}})}async disconnect(t=3e3){if(this._shuttingDown=!0,this.rejectAllPending(new Me("Client disconnecting")),!this.process){this._shuttingDown=!1;return}let o=this.process;return new Promise(n=>{let s=!1,i=()=>{s||(s=!0,this.process=null,this._connected=!1,this._shuttingDown=!1,n())};o.once("exit",i),o.kill("SIGTERM"),setTimeout(()=>{if(!s){try{o.kill("SIGKILL")}catch{}i()}},t)})}kill(){this._shuttingDown=!0,this.rejectAllPending(new Me("Client killed")),this.process&&(this.process.kill("SIGKILL"),this.process=null),this._connected=!1,this._shuttingDown=!1}rejectAllPending(t){for(let[o,n]of this.messageQueue)n.timer&&clearTimeout(n.timer),n.reject(t);this.messageQueue.clear()}};k();var wr=class{constructor(e){this.config=e}config;clients=new Map;serverConfigs=new Map;toolDefinitions=new Map;toolOwners=new Map;async connectServer(e){let{name:t,displayName:o,toolPrefix:n,...s}=e;P(`[MCP] Connecting to server: ${o||t}`);try{let i=new fn({...s,requestTimeoutMs:s.requestTimeoutMs??this.config.defaultTimeoutMs,autoReconnect:s.autoReconnect??this.config.autoReconnect??!0});this.setupClientEvents(i,t),await i.connect(),this.clients.set(t,i),this.serverConfigs.set(t,e),await this.discoverServerTools(t,i,e)}catch(i){throw pe(`[MCP] Failed to connect to ${t}: ${i}`),i}}async connectAll(){let e=this.config.servers.filter(t=>t.autoConnect!==!1).map(t=>this.connectServer(t));await Promise.allSettled(e)}async disconnectServer(e){let t=this.clients.get(e);if(!t){I(`[MCP] Server ${e} not found`);return}P(`[MCP] Disconnecting from ${e}`);for(let[o,n]of this.toolOwners)n===e&&(this.toolDefinitions.delete(o),this.toolOwners.delete(o));await t.disconnect(),this.clients.delete(e),this.serverConfigs.delete(e)}async disconnectAll(){let e=Array.from(this.clients.keys()).map(t=>this.disconnectServer(t));await Promise.allSettled(e)}getToolDefinitions(){return Array.from(this.toolDefinitions.values())}getConnectedServers(){return Array.from(this.clients.keys())}isServerConnected(e){return this.clients.get(e)?.connected??!1}convertMcpTool(e,t,o,n){let s={type:"object",properties:e.inputSchema.properties||{},required:e.inputSchema.required||[]};return{name:`${o}${e.name}`,displayName:e.name,description:e.description||`MCP tool from ${t}`,category:"mcp",parameters:s,execute:async i=>{try{P(`[MCP] Executing ${e.name} on ${t}`);let a=await n.callTool(e.name,i);return JSON.stringify(a)}catch(a){throw pe(`[MCP] Tool execution failed: ${a}`),a}}}}setupClientEvents(e,t){e.on("error",o=>{pe(`[MCP] ${t} error: ${o}`)}),e.on("close",o=>{I(`[MCP] ${t} closed with code ${o}`)}),e.on("reconnecting",({attempt:o,max:n})=>{P(`[MCP] ${t} reconnecting (${o}/${n})`)}),e.on("reconnected",({attempt:o})=>{P(`[MCP] ${t} reconnected after ${o} attempts`),this.refreshServerTools(t).catch(n=>{pe(`[MCP] ${t} tool refresh failed after reconnect: ${n}`)})}),e.on("reconnect_failed",o=>{pe(`[MCP] ${t} failed to reconnect after ${o} attempts`)}),e.on("notification",o=>{P(`[MCP] ${t} notification: ${JSON.stringify(o)}`)})}removeServerToolDefinitions(e){for(let[t,o]of this.toolOwners)o===e&&(this.toolDefinitions.delete(t),this.toolOwners.delete(t))}async discoverServerTools(e,t,o){let s=(await t.request("tools/list"))?.tools||[];P(`[MCP] Discovered ${s.length} tools from ${e}`),this.removeServerToolDefinitions(e);let i=o.toolPrefix||`mcp.${e}.`;for(let a of s){let c=this.convertMcpTool(a,e,i,t);this.toolDefinitions.set(c.name,c),this.toolOwners.set(c.name,e)}}async refreshServerTools(e){let t=this.clients.get(e),o=this.serverConfigs.get(e);!t||!o||await this.discoverServerTools(e,t,o)}};async function qi(r){let e=new wr(r);await e.connectAll();let t=e.getToolDefinitions();return{manifest:{key:"mcp-tools",name:"mcp-tools",displayName:"MCP Tools",version:"1.0.0",description:`Tools from ${e.getConnectedServers().length} MCP server(s)`,category:"mcp",author:"Toolpack SDK",tools:t.map(n=>n.name)},tools:t,mcpManager:e}}async function Wi(r){"mcpManager"in r&&await r.mcpManager.disconnectAll()}l();import*as H from"fs/promises";import*as ee from"path";function Gi(r){let e={},t=r.match(/^---\n([\s\S]*?)\n---/);if(!t||!t[1])return e;for(let o of t[1].split(`
465
- `)){let n=o.indexOf(":");if(n===-1)continue;let s=o.substring(0,n).trim(),i=o.substring(n+1).trim();e[s]=i}return e}function Bi(r){let e=r.match(/\[(.*)\]/);return!e||!e[1]?[]:e[1].split(",").map(t=>t.trim().replace(/"/g,"")).filter(Boolean)}function Ui(r){let e=[],t=r.match(/## Triggers\n\n([\s\S]*?)(?=\n## |$)/);if(!t||!t[1])return e;for(let o of t[1].split(`
466
- `).filter(n=>n.startsWith("- "))){let n=o.match(/^- "(.*)"/);n&&n[1]&&e.push(n[1])}return e}function at(r,e){let t=r.match(new RegExp(`## ${e}\\n\\n([\\s\\S]*?)(?=\\n## |$)`));return t&&t[1]?t[1].trim():""}async function Mb(r,e){async function t(o){let n;try{n=await H.readdir(o)}catch{return null}for(let s of n){let i=ee.join(o,s),a;try{a=await H.stat(i)}catch{continue}if(a.isDirectory()){let c=await t(i);if(c)return c}else if(a.isFile()&&s===`${e}.skill.md`)return i}return null}return t(r)}async function qv(r){let e=[];async function t(o){let n;try{n=await H.readdir(o)}catch{return}for(let s of n){let i=ee.join(o,s),a;try{a=await H.stat(i)}catch{continue}a.isDirectory()?await t(i):a.isFile()&&s.endsWith(".skill.md")&&e.push(i)}}return await t(r),e}function Wv(r){let{name:e,title:t,description:o,triggers:n,instructions:s,examples:i,tags:a}=r,c=new Date().toISOString(),p=a&&a.length>0?a.map(f=>`"${f}"`).join(", "):"",m=["---",`name: ${e}`,`title: ${t}`,"version: 1.0.0",`updated: ${c}`,`tags: [${p}]`,"---","","## Description","",o,"","## Triggers","",n.map(f=>`- "${f}"`).join(`
462
+ ${t}`}function ge(r,e,t=3e4){r.forEach((o,n)=>N(o,`kubectl argument #${n}`)),y(`[k8s-tools] execute: kubectl ${r.join(" ")}`);try{return Iv("kubectl",r,{input:e,encoding:"utf-8",maxBuffer:10485760,stdio:["pipe","pipe","pipe"],timeout:t})||"(kubectl completed with no output)"}catch(o){return Lv(o)}}function jv(r){if(!r)return 3e5;let e=r.trim().toLowerCase(),t=/^([0-9]+)(s|m|h)?$/.exec(e);if(!t)return 3e5;let o=Number(t[1]);switch(t[2]){case"h":return o*60*60*1e3;case"m":return o*60*1e3;default:return o*1e3}}var Se="kubernetes";function Ob(r){if(!r)return;if(typeof r=="string")return r;let e=Object.entries(r).filter(([,t])=>t!==void 0&&t!=="");if(e.length)return e.map(([t,o])=>`${N(t,"label key")}=${N(o,"label value")}`).join(",")}var Ei={name:"k8s.list_pods",displayName:"Kubernetes List Pods",description:"List pods in the current or a specific Kubernetes namespace.",category:Se,parameters:{type:"object",properties:{namespace:{type:"string",description:"Namespace to query. If omitted, uses the current namespace."},labels:{type:"string",description:"Label selector to filter pods."},labelSelector:{type:"object",description:"Map of label key/value pairs to filter pods.",additionalProperties:{type:"string"}},output:{type:"string",description:"Output format for the pod list.",enum:["wide","name","json","yaml"],default:"wide"},allNamespaces:{type:"boolean",description:"If true, list pods across all namespaces.",default:!1}},required:[]},execute:async r=>{let e=["get","pods"],t=r.output;t?e.push("-o",t):e.push("-o","wide"),r.allNamespaces&&e.push("--all-namespaces"),r.namespace&&!r.allNamespaces&&e.push("-n",N(r.namespace,"namespace"));let o=Ob(r.labelSelector)??r.labels;return o&&e.push("-l",N(o,"labels")),ge(e)}},Di={name:"k8s.describe",displayName:"Kubernetes Describe Resource",description:"Describe a Kubernetes resource or resource instance.",category:Se,parameters:{type:"object",properties:{resource:{type:"string",description:"Resource type to describe, such as pod, service, deployment."},name:{type:"string",description:"Resource name. Optional for cluster-wide descriptions."},namespace:{type:"string",description:"Namespace containing the resource."}},required:["resource"]},execute:async r=>{let t=["describe",N(r.resource,"resource")];return r.name&&t.push(N(r.name,"name")),r.namespace&&t.push("-n",N(r.namespace,"namespace")),ge(t)}},Mi={name:"k8s.get_logs",displayName:"Kubernetes Get Pod Logs",description:"Fetch logs from a Kubernetes pod, optionally from a specific container.",category:Se,parameters:{type:"object",properties:{podName:{type:"string",description:"The name of the pod to fetch logs from."},namespace:{type:"string",description:"Namespace of the pod."},container:{type:"string",description:"Container name inside the pod."},tailLines:{type:"number",description:"Number of log lines to show from the end.",default:100},since:{type:"string",description:"Return logs newer than a relative duration like 5m or 1h."}},required:["podName"]},execute:async r=>{let e=["logs",N(r.podName,"podName")];return r.container&&e.push("-c",N(r.container,"container")),r.namespace&&e.push("-n",N(r.namespace,"namespace")),typeof r.tailLines=="number"&&e.push("--tail",`${r.tailLines}`),r.since&&e.push("--since",N(r.since,"since")),ge(e)}},Oi={name:"k8s.apply_manifest",displayName:"Kubernetes Apply Manifest",description:"Apply a Kubernetes manifest from a file path or inline YAML content.",category:Se,parameters:{type:"object",properties:{path:{type:"string",description:"Path to the manifest file to apply."},manifest:{type:"string",description:"Inline YAML manifest to apply if no path is provided."},namespace:{type:"string",description:"Namespace to apply the manifest into, if supported by the manifest."},dryRun:{type:"boolean",description:"If true, perform a client-side dry run without applying changes.",default:!1}},required:[]},confirmation:{level:"high",reason:"This will change cluster state by applying a Kubernetes manifest.",showArgs:["path","namespace"]},execute:async r=>{let e=r.path,t=r.manifest,o=["apply"];if(r.dryRun&&o.push("--dry-run=client"),o.push("-f"),e)return o.push(N(e,"path")),r.namespace&&o.push("-n",N(r.namespace,"namespace")),ge(o);if(!t)throw new Error("Either path or manifest is required to apply a Kubernetes manifest.");return r.namespace&&o.push("-n",N(r.namespace,"namespace")),o.push("-"),ge(o,t)}},Ni={name:"k8s.delete_resource",displayName:"Kubernetes Delete Resource",description:"Delete a Kubernetes resource by type and name, or delete resources from a manifest file.",category:Se,parameters:{type:"object",properties:{resource:{type:"string",description:"Resource type to delete, such as pod, service, deployment."},name:{type:"string",description:"Name of the resource to delete."},namespace:{type:"string",description:"Namespace containing the resource."},path:{type:"string",description:"Path to a manifest file that contains the resources to delete."},force:{type:"boolean",description:"Force deletion of the resource.",default:!1},dryRun:{type:"boolean",description:"If true, perform a client-side dry run without deleting resources.",default:!1}},required:[]},confirmation:{level:"high",reason:"This will delete resources from the Kubernetes cluster.",showArgs:["resource","name","path"]},execute:async r=>{let e=r.path,t=r.resource,o=r.name;if(e){let s=["delete"];return r.dryRun&&s.push("--dry-run=client"),s.push("-f",N(e,"path")),r.namespace&&s.push("-n",N(r.namespace,"namespace")),ge(s)}if(!t||!o)throw new Error("resource and name are required unless a manifest path is provided.");let n=["delete",N(t,"resource"),N(o,"name")];return r.namespace&&n.push("-n",N(r.namespace,"namespace")),r.force&&n.push("--force","--grace-period=0"),r.dryRun&&n.push("--dry-run=client"),ge(n)}},Ai={name:"k8s.list_services",displayName:"Kubernetes List Services",description:"List services in the current or a specific Kubernetes namespace.",category:Se,parameters:{type:"object",properties:{namespace:{type:"string",description:"Namespace to query. If omitted, uses the current namespace."},output:{type:"string",description:"Output format for the service list.",enum:["wide","name","json","yaml"],default:"wide"},allNamespaces:{type:"boolean",description:"List services across all namespaces.",default:!1}},required:[]},execute:async r=>{let e=["get","services"],t=r.output;return e.push("-o",t||"wide"),r.allNamespaces&&e.push("--all-namespaces"),r.namespace&&!r.allNamespaces&&e.push("-n",N(r.namespace,"namespace")),ge(e)}},Ii={name:"k8s.list_deployments",displayName:"Kubernetes List Deployments",description:"List deployments in the current or a specific Kubernetes namespace.",category:Se,parameters:{type:"object",properties:{namespace:{type:"string",description:"Namespace to query. If omitted, uses the current namespace."},labels:{type:"string",description:"Label selector to filter deployments."},labelSelector:{type:"object",description:"Map of label key/value pairs to filter deployments.",additionalProperties:{type:"string"}},output:{type:"string",description:"Output format for the deployment list.",enum:["wide","name","json","yaml"],default:"wide"},allNamespaces:{type:"boolean",description:"List deployments across all namespaces.",default:!1}},required:[]},execute:async r=>{let e=["get","deployments"],t=r.output;e.push("-o",t||"wide"),r.allNamespaces&&e.push("--all-namespaces"),r.namespace&&!r.allNamespaces&&e.push("-n",N(r.namespace,"namespace"));let o=Ob(r.labelSelector)??r.labels;return o&&e.push("-l",N(o,"labels")),ge(e)}},Li={name:"k8s.get_config_map",displayName:"Kubernetes Get ConfigMap",description:"Retrieve a ConfigMap from a Kubernetes namespace.",category:Se,parameters:{type:"object",properties:{name:{type:"string",description:"ConfigMap name."},namespace:{type:"string",description:"Namespace containing the ConfigMap."},output:{type:"string",description:"Output format, such as yaml or json.",enum:["yaml","json"],default:"yaml"}},required:["name"]},execute:async r=>{let e=["get","configmap",N(r.name,"name"),"-o",r.output||"yaml"];return r.namespace&&e.push("-n",N(r.namespace,"namespace")),ge(e)}},ji={name:"k8s.switch_context",displayName:"Kubernetes Switch Context",description:"Switch the active kubectl context to a different Kubernetes cluster or namespace configuration.",category:Se,parameters:{type:"object",properties:{context:{type:"string",description:"The kubeconfig context to switch to."}},required:["context"]},execute:async r=>ge(["config","use-context",N(r.context,"context")])},Fi={name:"k8s.get_namespaces",displayName:"Kubernetes Get Namespaces",description:"List namespaces in the current Kubernetes context.",category:Se,parameters:{type:"object",properties:{output:{type:"string",description:"Output format for the namespace list.",enum:["wide","name","json","yaml"],default:"wide"}},required:[]},execute:async r=>ge(["get","namespaces","-o",r.output||"wide"])},qi={name:"k8s.wait_for_deployment",displayName:"Kubernetes Wait For Deployment",description:"Wait for a Kubernetes deployment to complete its rollout.",category:Se,parameters:{type:"object",properties:{name:{type:"string",description:"Deployment name to wait for."},namespace:{type:"string",description:"Namespace containing the deployment."},timeout:{type:"string",description:"Timeout duration, e.g. 300s or 5m.",default:"300s"}},required:["name"]},execute:async r=>{let e=r.timeout,t=["rollout","status",`deployment/${N(r.name,"name")}`,"--timeout",e||"300s"];return r.namespace&&t.push("-n",N(r.namespace,"namespace")),ge(t,void 0,jv(e))}};var Fv={manifest:{key:"k8s",name:"k8s-tools",displayName:"Kubernetes",version:"1.0.0",description:"Kubernetes command and cluster inspection tools for working with kubectl and manifests.",author:"toolpack-sdk",tools:["k8s.list_pods","k8s.describe","k8s.get_logs","k8s.apply_manifest","k8s.delete_resource","k8s.list_services","k8s.list_deployments","k8s.get_config_map","k8s.switch_context","k8s.get_namespaces","k8s.wait_for_deployment"],category:"kubernetes"},tools:[Ei,Di,Mi,Oi,Ni,Ai,Ii,Li,ji,Fi,qi]};$i();c();c();k();import{spawn as qv}from"child_process";import{EventEmitter as Wv}from"events";var wr=class extends Error{constructor(e,t){super(`MCP request timed out after ${t}ms: ${e}`),this.name="McpTimeoutError"}},Oe=class extends Error{constructor(t,o){super(t);this.exitCode=o;this.name="McpConnectionError"}exitCode},gn=class extends Wv{constructor(t){super();this.config=t;this.defaultTimeoutMs=t.requestTimeoutMs??3e4,this.autoReconnect=t.autoReconnect??!1,this.maxReconnectAttempts=t.maxReconnectAttempts??3,this.reconnectDelayMs=t.reconnectDelayMs??1e3}config;process=null;messageQueue=new Map;nextId=1;buffer="";_connected=!1;_shuttingDown=!1;_reconnectAttempts=0;defaultTimeoutMs;autoReconnect;maxReconnectAttempts;reconnectDelayMs;get connected(){return this._connected&&this.process!==null}async initializeServer(){await this.request("initialize",{client:"toolpack-sdk"})}async connect(){if(this._shuttingDown)throw new Oe("Client is shutting down");if(this.buffer="",this.process=qv(this.config.command,this.config.args||[],{env:{...process.env,...this.config.env},stdio:["pipe","pipe","pipe"]}),!this.process.stdout||!this.process.stdin)throw new Oe("Failed to spawn MCP server: stdout/stdin unavailable");this.process.stdout.on("data",t=>{this.handleData(t)}),this.process.stderr&&this.process.stderr.on("data",t=>{I(`[MCP server stderr] ${t.toString().trim()}`)}),this.process.on("error",t=>{this._connected=!1,this.emit("error",t)}),this.process.on("exit",t=>{let o=this._connected;this._connected=!1,this.process=null,this.rejectAllPending(new Oe(`MCP server exited with code ${t}`,t)),this.emit("close",t),o&&!this._shuttingDown&&this.autoReconnect&&this.attemptReconnect()}),this._reconnectAttempts=0,await this.initializeServer(),this._connected=!0}async attemptReconnect(){if(this._reconnectAttempts>=this.maxReconnectAttempts){this.emit("reconnect_failed",this._reconnectAttempts);return}this._reconnectAttempts++;let t=this._reconnectAttempts;if(this.emit("reconnecting",{attempt:t,max:this.maxReconnectAttempts}),await new Promise(o=>setTimeout(o,this.reconnectDelayMs*t)),!this._shuttingDown)try{await this.connect(),this.emit("reconnected",{attempt:t})}catch(o){this.emit("reconnect_error",{attempt:t,error:o})}}handleData(t){this.buffer+=t.toString();let o;for(;(o=this.buffer.indexOf(`
463
+ `))!==-1;){let n=this.buffer.slice(0,o).trim();if(this.buffer=this.buffer.slice(o+1),n)try{let s=JSON.parse(n);this.handleMessage(s)}catch{}}}handleMessage(t){if(t.id&&(t.result!==void 0||t.error)){let o=this.messageQueue.get(t.id);o&&(o.timer&&clearTimeout(o.timer),t.error?o.reject(new Error(t.error.message)):o.resolve(t.result),this.messageQueue.delete(t.id))}else t.method&&(this.emit("notification",t),this.emit(t.method,t.params))}async callTool(t,o={},n){return this.request("tools/call",{name:t,arguments:o},n)}async readResource(t,o){return this.request("resources/read",{uri:t},o)}async request(t,o,n){if(!this.process||!this.process.stdin)throw new Oe("Client not connected");let s=this.nextId++,i=n??this.defaultTimeoutMs,a={jsonrpc:"2.0",id:s,method:t,params:o};return new Promise((l,p)=>{let m;i>0&&(m=setTimeout(()=>{let f=this.messageQueue.get(s);f&&(this.messageQueue.delete(s),f.reject(new wr(t,i)))},i)),this.messageQueue.set(s,{resolve:l,reject:p,timer:m});try{this.process.stdin.write(JSON.stringify(a)+`
464
+ `)}catch(f){m&&clearTimeout(m),this.messageQueue.delete(s),p(f)}})}async disconnect(t=3e3){if(this._shuttingDown=!0,this.rejectAllPending(new Oe("Client disconnecting")),!this.process){this._shuttingDown=!1;return}let o=this.process;return new Promise(n=>{let s=!1,i=()=>{s||(s=!0,this.process=null,this._connected=!1,this._shuttingDown=!1,n())};o.once("exit",i),o.kill("SIGTERM"),setTimeout(()=>{if(!s){try{o.kill("SIGKILL")}catch{}i()}},t)})}kill(){this._shuttingDown=!0,this.rejectAllPending(new Oe("Client killed")),this.process&&(this.process.kill("SIGKILL"),this.process=null),this._connected=!1,this._shuttingDown=!1}rejectAllPending(t){for(let[o,n]of this.messageQueue)n.timer&&clearTimeout(n.timer),n.reject(t);this.messageQueue.clear()}};k();var Tr=class{constructor(e){this.config=e}config;clients=new Map;serverConfigs=new Map;toolDefinitions=new Map;toolOwners=new Map;async connectServer(e){let{name:t,displayName:o,toolPrefix:n,...s}=e;S(`[MCP] Connecting to server: ${o||t}`);try{let i=new gn({...s,requestTimeoutMs:s.requestTimeoutMs??this.config.defaultTimeoutMs,autoReconnect:s.autoReconnect??this.config.autoReconnect??!0});this.setupClientEvents(i,t),await i.connect(),this.clients.set(t,i),this.serverConfigs.set(t,e),await this.discoverServerTools(t,i,e)}catch(i){throw ce(`[MCP] Failed to connect to ${t}: ${i}`),i}}async connectAll(){let e=this.config.servers.filter(t=>t.autoConnect!==!1).map(t=>this.connectServer(t));await Promise.allSettled(e)}async disconnectServer(e){let t=this.clients.get(e);if(!t){I(`[MCP] Server ${e} not found`);return}S(`[MCP] Disconnecting from ${e}`);for(let[o,n]of this.toolOwners)n===e&&(this.toolDefinitions.delete(o),this.toolOwners.delete(o));await t.disconnect(),this.clients.delete(e),this.serverConfigs.delete(e)}async disconnectAll(){let e=Array.from(this.clients.keys()).map(t=>this.disconnectServer(t));await Promise.allSettled(e)}getToolDefinitions(){return Array.from(this.toolDefinitions.values())}getConnectedServers(){return Array.from(this.clients.keys())}isServerConnected(e){return this.clients.get(e)?.connected??!1}convertMcpTool(e,t,o,n){let s={type:"object",properties:e.inputSchema.properties||{},required:e.inputSchema.required||[]};return{name:`${o}${e.name}`,displayName:e.name,description:e.description||`MCP tool from ${t}`,category:"mcp",parameters:s,execute:async i=>{try{S(`[MCP] Executing ${e.name} on ${t}`);let a=await n.callTool(e.name,i);return JSON.stringify(a)}catch(a){throw ce(`[MCP] Tool execution failed: ${a}`),a}}}}setupClientEvents(e,t){e.on("error",o=>{ce(`[MCP] ${t} error: ${o}`)}),e.on("close",o=>{I(`[MCP] ${t} closed with code ${o}`)}),e.on("reconnecting",({attempt:o,max:n})=>{S(`[MCP] ${t} reconnecting (${o}/${n})`)}),e.on("reconnected",({attempt:o})=>{S(`[MCP] ${t} reconnected after ${o} attempts`),this.refreshServerTools(t).catch(n=>{ce(`[MCP] ${t} tool refresh failed after reconnect: ${n}`)})}),e.on("reconnect_failed",o=>{ce(`[MCP] ${t} failed to reconnect after ${o} attempts`)}),e.on("notification",o=>{S(`[MCP] ${t} notification: ${JSON.stringify(o)}`)})}removeServerToolDefinitions(e){for(let[t,o]of this.toolOwners)o===e&&(this.toolDefinitions.delete(t),this.toolOwners.delete(t))}async discoverServerTools(e,t,o){let s=(await t.request("tools/list"))?.tools||[];S(`[MCP] Discovered ${s.length} tools from ${e}`),this.removeServerToolDefinitions(e);let i=o.toolPrefix||`mcp.${e}.`;for(let a of s){let l=this.convertMcpTool(a,e,i,t);this.toolDefinitions.set(l.name,l),this.toolOwners.set(l.name,e)}}async refreshServerTools(e){let t=this.clients.get(e),o=this.serverConfigs.get(e);!t||!o||await this.discoverServerTools(e,t,o)}};async function Wi(r){let e=new Tr(r);await e.connectAll();let t=e.getToolDefinitions();return{manifest:{key:"mcp-tools",name:"mcp-tools",displayName:"MCP Tools",version:"1.0.0",description:`Tools from ${e.getConnectedServers().length} MCP server(s)`,category:"mcp",author:"Toolpack SDK",tools:t.map(n=>n.name)},tools:t,mcpManager:e}}async function Ui(r){"mcpManager"in r&&await r.mcpManager.disconnectAll()}c();import*as V from"fs/promises";import*as oe from"path";function Bi(r){let e={},t=r.match(/^---\n([\s\S]*?)\n---/);if(!t||!t[1])return e;for(let o of t[1].split(`
465
+ `)){let n=o.indexOf(":");if(n===-1)continue;let s=o.substring(0,n).trim(),i=o.substring(n+1).trim();e[s]=i}return e}function zi(r){let e=r.match(/\[(.*)\]/);return!e||!e[1]?[]:e[1].split(",").map(t=>t.trim().replace(/"/g,"")).filter(Boolean)}function Gi(r){let e=[],t=r.match(/## Triggers\n\n([\s\S]*?)(?=\n## |$)/);if(!t||!t[1])return e;for(let o of t[1].split(`
466
+ `).filter(n=>n.startsWith("- "))){let n=o.match(/^- "(.*)"/);n&&n[1]&&e.push(n[1])}return e}function it(r,e){let t=r.match(new RegExp(`## ${e}\\n\\n([\\s\\S]*?)(?=\\n## |$)`));return t&&t[1]?t[1].trim():""}async function Nb(r,e){async function t(o){let n;try{n=await V.readdir(o)}catch{return null}for(let s of n){let i=oe.join(o,s),a;try{a=await V.stat(i)}catch{continue}if(a.isDirectory()){let l=await t(i);if(l)return l}else if(a.isFile()&&s===`${e}.skill.md`)return i}return null}return t(r)}async function Uv(r){let e=[];async function t(o){let n;try{n=await V.readdir(o)}catch{return}for(let s of n){let i=oe.join(o,s),a;try{a=await V.stat(i)}catch{continue}a.isDirectory()?await t(i):a.isFile()&&s.endsWith(".skill.md")&&e.push(i)}}return await t(r),e}function Gv(r){let{name:e,title:t,description:o,triggers:n,instructions:s,examples:i,tags:a}=r,l=new Date().toISOString(),p=a&&a.length>0?a.map(f=>`"${f}"`).join(", "):"",m=["---",`name: ${e}`,`title: ${t}`,"version: 1.0.0",`updated: ${l}`,`tags: [${p}]`,"---","","## Description","",o,"","## Triggers","",n.map(f=>`- "${f}"`).join(`
467
467
  `),"","## Instructions","",s,""];return i&&m.push("## Examples","",i,""),m.join(`
468
- `)}function Uv(r){return{name:"skill.create",displayName:"Create Skill",description:"Create a new .skill.md file in the skill library.",category:"skills",parameters:{type:"object",properties:{name:{type:"string",description:'Skill name in kebab-case (e.g. "code-review"). Used as the filename.'},title:{type:"string",description:"Human-readable title for the skill (max 100 chars)."},description:{type:"string",description:"Short description for BM25 search indexing (max 300 chars)."},triggers:{type:"array",items:{type:"string"},description:"List of trigger phrases that activate this skill (min 1, max 10)."},instructions:{type:"string",description:"Behavioral instructions injected into context when the skill activates (max 2000 chars)."},examples:{type:"string",description:"Optional examples section (max 3000 chars, never auto-injected)."},tags:{type:"array",items:{type:"string"},description:"Optional tags for filtering and search (max 10)."},subfolder:{type:"string",description:'Optional subfolder within the skills directory (e.g. "coding").'}},required:["name","title","description","triggers","instructions"]},async execute(e){let t=e.name,o=e.title,n=e.description,s=e.triggers??[],i=e.instructions,a=e.examples,c=e.tags??[],p=e.subfolder;if(!/^[a-z][a-z0-9-]*$/.test(t))return JSON.stringify({error:"invalid_name",message:"Skill name must be kebab-case (lowercase letters, numbers, hyphens, starting with a letter)"},null,2);let m=p?ee.join(r,p):r;await H.mkdir(m,{recursive:!0});let f=ee.join(m,`${t}.skill.md`);try{return await H.access(f),JSON.stringify({error:"skill_exists",message:`Skill "${t}" already exists at ${f}. Use skill.update to modify it.`},null,2)}catch{}let g=Wv({name:t,title:o,description:n,triggers:s,instructions:i,examples:a,tags:c});return await H.writeFile(f,g,"utf-8"),JSON.stringify({success:!0,skill:t,path:f,message:`Skill "${o}" created successfully`},null,2)}}}function Gv(r){return{name:"skill.read",displayName:"Read Skill",description:"Read a skill file by name. Optionally read only a specific section.",category:"skills",parameters:{type:"object",properties:{name:{type:"string",description:"Skill name (without the .skill.md extension)."},section:{type:"string",enum:["all","metadata","description","triggers","instructions","examples"],description:"Which section to return (default: all).",default:"all"}},required:["name"]},async execute(e){let t=e.name,o=e.section||"all",n=await Mb(r,t);if(!n)return JSON.stringify({error:"skill_not_found",message:`Skill "${t}" not found. Use skill.list to see available skills.`},null,2);let s=(await H.readFile(n,"utf-8")).replace(/\r\n/g,`
469
- `),i=Gi(s),a={name:i.name||t,title:i.title||t,version:i.version,tags:i.tags?Bi(i.tags):[],updated:i.updated,path:n};return JSON.stringify(o==="metadata"?{skill:t,metadata:a}:o==="description"?{skill:t,description:at(s,"Description")}:o==="triggers"?{skill:t,triggers:Ui(s)}:o==="instructions"?{skill:t,instructions:at(s,"Instructions")}:o==="examples"?{skill:t,examples:at(s,"Examples")}:{skill:t,path:n,metadata:a,description:at(s,"Description"),triggers:Ui(s),instructions:at(s,"Instructions"),examples:at(s,"Examples")||void 0},null,2)}}}function Bv(r){return{name:"skill.update",displayName:"Update Skill",description:"Update fields of an existing skill. Only provided fields are changed.",category:"skills",parameters:{type:"object",properties:{name:{type:"string",description:"Skill name to update."},title:{type:"string",description:"New title (optional)."},description:{type:"string",description:"New description replacing the existing one (optional)."},triggers:{type:"array",items:{type:"string"},description:"New triggers list replacing the existing one (optional)."},instructions:{type:"string",description:"New instructions replacing the existing ones (optional)."},addExamples:{type:"string",description:"Additional examples text to append to the Examples section (optional)."},addTags:{type:"array",items:{type:"string"},description:"Tags to add to the existing tags (optional)."}},required:["name"]},async execute(e){let t=e.name,o=e.title,n=e.description,s=e.triggers,i=e.instructions,a=e.addExamples,c=e.addTags,p=await Mb(r,t);if(!p)return JSON.stringify({error:"skill_not_found",message:`Skill "${t}" not found. Use skill.create to create it first.`},null,2);let m=(await H.readFile(p,"utf-8")).replace(/\r\n/g,`
470
- `),f=Gi(m),g=f.tags?Bi(f.tags):[],w=f.title||t,b=f.version||"1.0.0",T=o??w,v=c?[...new Set([...g,...c])]:g,C=new Date().toISOString();if(n!==void 0&&(m=m.replace(/## Description\n\n[\s\S]*?(?=\n## )/,`## Description
468
+ `)}function Bv(r){return{name:"skill.create",displayName:"Create Skill",description:"Create a new .skill.md file in the skill library.",category:"skills",parameters:{type:"object",properties:{name:{type:"string",description:'Skill name in kebab-case (e.g. "code-review"). Used as the filename.'},title:{type:"string",description:"Human-readable title for the skill (max 100 chars)."},description:{type:"string",description:"Short description for BM25 search indexing (max 300 chars)."},triggers:{type:"array",items:{type:"string"},description:"List of trigger phrases that activate this skill (min 1, max 10)."},instructions:{type:"string",description:"Behavioral instructions injected into context when the skill activates (max 2000 chars)."},examples:{type:"string",description:"Optional examples section (max 3000 chars, never auto-injected)."},tags:{type:"array",items:{type:"string"},description:"Optional tags for filtering and search (max 10)."},subfolder:{type:"string",description:'Optional subfolder within the skills directory (e.g. "coding").'}},required:["name","title","description","triggers","instructions"]},async execute(e){let t=e.name,o=e.title,n=e.description,s=e.triggers??[],i=e.instructions,a=e.examples,l=e.tags??[],p=e.subfolder;if(!/^[a-z][a-z0-9-]*$/.test(t))return JSON.stringify({error:"invalid_name",message:"Skill name must be kebab-case (lowercase letters, numbers, hyphens, starting with a letter)"},null,2);let m=p?oe.join(r,p):r;await V.mkdir(m,{recursive:!0});let f=oe.join(m,`${t}.skill.md`);try{return await V.access(f),JSON.stringify({error:"skill_exists",message:`Skill "${t}" already exists at ${f}. Use skill.update to modify it.`},null,2)}catch{}let g=Gv({name:t,title:o,description:n,triggers:s,instructions:i,examples:a,tags:l});return await V.writeFile(f,g,"utf-8"),JSON.stringify({success:!0,skill:t,path:f,message:`Skill "${o}" created successfully`},null,2)}}}function zv(r){return{name:"skill.read",displayName:"Read Skill",description:"Read a skill file by name. Optionally read only a specific section.",category:"skills",parameters:{type:"object",properties:{name:{type:"string",description:"Skill name (without the .skill.md extension)."},section:{type:"string",enum:["all","metadata","description","triggers","instructions","examples"],description:"Which section to return (default: all).",default:"all"}},required:["name"]},async execute(e){let t=e.name,o=e.section||"all",n=await Nb(r,t);if(!n)return JSON.stringify({error:"skill_not_found",message:`Skill "${t}" not found. Use skill.list to see available skills.`},null,2);let s=(await V.readFile(n,"utf-8")).replace(/\r\n/g,`
469
+ `),i=Bi(s),a={name:i.name||t,title:i.title||t,version:i.version,tags:i.tags?zi(i.tags):[],updated:i.updated,path:n};return JSON.stringify(o==="metadata"?{skill:t,metadata:a}:o==="description"?{skill:t,description:it(s,"Description")}:o==="triggers"?{skill:t,triggers:Gi(s)}:o==="instructions"?{skill:t,instructions:it(s,"Instructions")}:o==="examples"?{skill:t,examples:it(s,"Examples")}:{skill:t,path:n,metadata:a,description:it(s,"Description"),triggers:Gi(s),instructions:it(s,"Instructions"),examples:it(s,"Examples")||void 0},null,2)}}}function Hv(r){return{name:"skill.update",displayName:"Update Skill",description:"Update fields of an existing skill. Only provided fields are changed.",category:"skills",parameters:{type:"object",properties:{name:{type:"string",description:"Skill name to update."},title:{type:"string",description:"New title (optional)."},description:{type:"string",description:"New description replacing the existing one (optional)."},triggers:{type:"array",items:{type:"string"},description:"New triggers list replacing the existing one (optional)."},instructions:{type:"string",description:"New instructions replacing the existing ones (optional)."},addExamples:{type:"string",description:"Additional examples text to append to the Examples section (optional)."},addTags:{type:"array",items:{type:"string"},description:"Tags to add to the existing tags (optional)."}},required:["name"]},async execute(e){let t=e.name,o=e.title,n=e.description,s=e.triggers,i=e.instructions,a=e.addExamples,l=e.addTags,p=await Nb(r,t);if(!p)return JSON.stringify({error:"skill_not_found",message:`Skill "${t}" not found. Use skill.create to create it first.`},null,2);let m=(await V.readFile(p,"utf-8")).replace(/\r\n/g,`
470
+ `),f=Bi(m),g=f.tags?zi(f.tags):[],w=f.title||t,b=f.version||"1.0.0",T=o??w,x=l?[...new Set([...g,...l])]:g,C=new Date().toISOString();if(n!==void 0&&(m=m.replace(/## Description\n\n[\s\S]*?(?=\n## )/,`## Description
471
471
 
472
472
  ${n}
473
473
 
474
- `)),s!==void 0){let R=s.map(D=>`- "${D}"`).join(`
474
+ `)),s!==void 0){let $=s.map(P=>`- "${P}"`).join(`
475
475
  `);m=m.replace(/## Triggers\n\n[\s\S]*?(?=\n## )/,`## Triggers
476
476
 
477
- ${R}
477
+ ${$}
478
478
 
479
479
  `)}if(i!==void 0&&(m=m.replace(/## Instructions\n\n[\s\S]*?(?=\n## |$)/,`## Instructions
480
480
 
481
481
  ${i}
482
482
 
483
- `)),a){let R=m.match(/## Examples\n\n([\s\S]*?)(?=\n## |$)/);if(R){let D=R[1]??"",M=D.trim()?`
483
+ `)),a){let $=m.match(/## Examples\n\n([\s\S]*?)(?=\n## |$)/);if($){let P=$[1]??"",M=P.trim()?`
484
484
 
485
485
  `:"";m=m.replace(/## Examples\n\n[\s\S]*?(?=\n## |$)/,`## Examples
486
486
 
487
- ${D}${M}${a}
487
+ ${P}${M}${a}
488
488
 
489
489
  `)}else m=m.trimEnd()+`
490
490
 
491
491
  ## Examples
492
492
 
493
493
  ${a}
494
- `}m=m.replace(/^---\n[\s\S]*?\n---/,["---",`name: ${t}`,`title: ${T}`,`version: ${b}`,`updated: ${C}`,`tags: [${v.map(R=>`"${R}"`).join(", ")}]`,"---"].join(`
495
- `)),await H.writeFile(p,m,"utf-8");let x=[];return o&&x.push("title"),n!==void 0&&x.push("description"),s!==void 0&&x.push("triggers"),i!==void 0&&x.push("instructions"),a&&x.push("examples (appended)"),c&&x.push(`tags (+${c.length})`),JSON.stringify({success:!0,skill:t,path:p,updated:x,message:`Skill "${t}" updated successfully`},null,2)}}}function zv(r){return{name:"skill.list",displayName:"List Skills",description:"List all skills in the skill library, optionally filtered by tag.",category:"skills",parameters:{type:"object",properties:{tag:{type:"string",description:"Filter skills by tag (optional)."},verbose:{type:"boolean",description:"Include description and triggers in the output (default: false).",default:!1}},required:[]},async execute(e){let t=e.tag,o=e.verbose??!1;try{await H.access(r)}catch{return JSON.stringify({skills:[],count:0,message:"No skills directory found. Use skill.create to create your first skill."},null,2)}let n=await qv(r);if(n.length===0)return JSON.stringify({skills:[],count:0,message:"No skills found. Use skill.create to create your first skill."},null,2);let s=[];for(let i of n){let a=(await H.readFile(i,"utf-8")).replace(/\r\n/g,`
496
- `),c=Gi(a),p=c.name||ee.basename(i,".skill.md"),m=c.title||p,f=c.tags?Bi(c.tags):[];if(t&&!f.includes(t))continue;let g=ee.dirname(ee.relative(r,i)),w=g==="."?void 0:g.split(ee.sep)[0];o?s.push({name:p,title:m,tags:f,category:w,description:at(a,"Description")||void 0,triggers:Ui(a)}):s.push({name:p,title:m,tags:f,category:w})}return JSON.stringify({skills:s,count:s.length,filtered:t?`by tag: ${t}`:null},null,2)}}}function Hv(r){let e=ee.resolve(r?.dir??".toolpack/skills"),t=[Uv(e),Gv(e),Bv(e),zv(e)];return{manifest:{key:"skill",name:"skill-tools",displayName:"Skill Management",version:"1.0.0",description:"Tools for creating, reading, updating, and listing agent skill files.",tools:["skill.create","skill.read","skill.update","skill.list"],category:"skills"},tools:t}}l();l();l();l();var zi=`
494
+ `}m=m.replace(/^---\n[\s\S]*?\n---/,["---",`name: ${t}`,`title: ${T}`,`version: ${b}`,`updated: ${C}`,`tags: [${x.map($=>`"${$}"`).join(", ")}]`,"---"].join(`
495
+ `)),await V.writeFile(p,m,"utf-8");let v=[];return o&&v.push("title"),n!==void 0&&v.push("description"),s!==void 0&&v.push("triggers"),i!==void 0&&v.push("instructions"),a&&v.push("examples (appended)"),l&&v.push(`tags (+${l.length})`),JSON.stringify({success:!0,skill:t,path:p,updated:v,message:`Skill "${t}" updated successfully`},null,2)}}}function Kv(r){return{name:"skill.list",displayName:"List Skills",description:"List all skills in the skill library, optionally filtered by tag.",category:"skills",parameters:{type:"object",properties:{tag:{type:"string",description:"Filter skills by tag (optional)."},verbose:{type:"boolean",description:"Include description and triggers in the output (default: false).",default:!1}},required:[]},async execute(e){let t=e.tag,o=e.verbose??!1;try{await V.access(r)}catch{return JSON.stringify({skills:[],count:0,message:"No skills directory found. Use skill.create to create your first skill."},null,2)}let n=await Uv(r);if(n.length===0)return JSON.stringify({skills:[],count:0,message:"No skills found. Use skill.create to create your first skill."},null,2);let s=[];for(let i of n){let a=(await V.readFile(i,"utf-8")).replace(/\r\n/g,`
496
+ `),l=Bi(a),p=l.name||oe.basename(i,".skill.md"),m=l.title||p,f=l.tags?zi(l.tags):[];if(t&&!f.includes(t))continue;let g=oe.dirname(oe.relative(r,i)),w=g==="."?void 0:g.split(oe.sep)[0];o?s.push({name:p,title:m,tags:f,category:w,description:it(a,"Description")||void 0,triggers:Gi(a)}):s.push({name:p,title:m,tags:f,category:w})}return JSON.stringify({skills:s,count:s.length,filtered:t?`by tag: ${t}`:null},null,2)}}}function Jv(r){let e=oe.resolve(r?.dir??".toolpack/skills"),t=[Bv(e),zv(e),Hv(e),Kv(e)];return{manifest:{key:"skill",name:"skill-tools",displayName:"Skill Management",version:"1.0.0",description:"Tools for creating, reading, updating, and listing agent skill files.",tools:["skill.create","skill.read","skill.update","skill.list"],category:"skills"},tools:t}}c();c();c();c();var Hi=`
497
497
  You are a planning assistant. Given a user request, create a detailed step-by-step plan.
498
498
 
499
499
  Rules:
@@ -519,7 +519,7 @@ Rules:
519
519
  }
520
520
  ]
521
521
  }
522
- `,hU={name:"Direct",planning:{enabled:!1},progress:{enabled:!0}},Ob={name:"Agent",planning:{enabled:!0,planningPrompt:zi},progress:{enabled:!0},complexityRouting:{enabled:!0,strategy:"single-step",confidenceThreshold:.6}},Kv=`
522
+ `,v1={name:"Direct",planning:{enabled:!1},progress:{enabled:!0}},Ab={name:"Agent",planning:{enabled:!0,planningPrompt:Hi},progress:{enabled:!0},complexityRouting:{enabled:!0,strategy:"single-step",confidenceThreshold:.6}},Vv=`
523
523
  Create a step-by-step plan for this coding task.
524
524
 
525
525
  Rules:
@@ -542,16 +542,16 @@ JSON Schema:
542
542
  }
543
543
  ]
544
544
  }
545
- `,Nb={name:"Coding",planning:{enabled:!0,planningPrompt:Kv},progress:{enabled:!0},complexityRouting:{enabled:!0,strategy:"single-step",confidenceThreshold:.6}},Ab={name:"Chat",planning:{enabled:!1},progress:{enabled:!1}};var Ib={name:"agent",displayName:"Agent",description:"Full autonomous access \u2014 read, write, execute, browse",systemPrompt:["You are an autonomous AI agent with full access to all available tools.","You must use the tools provided to accomplish tasks end-to-end proactively.","If you require a capability that is not listed in your current tools, ALWAYS use `tool.search` to find it before improvising or giving up.","Before considering a tool to call, make sure that is the right tool for the job as per the users prompt.","Verify your actions and check for success or failure states.","Explain your actions briefly as you go."].join(" "),allowedToolCategories:[],blockedToolCategories:[],allowedTools:[],blockedTools:[],blockAllTools:!1,baseContext:{includeWorkingDirectory:!0,includeToolCategories:!0},workflow:Ob,toolSearch:{alwaysLoadedTools:["fs.read_file","fs.write_file","fs.list_dir","web.search","web.fetch","skill.search","skill.read"]}},Lb={name:"chat",displayName:"Chat",description:"Conversational assistant with web access",systemPrompt:["You are a conversational AI assistant with web access.","You can search the web, fetch online content, and make HTTP requests.","You do NOT have access to the local filesystem, command execution, or code modification.","Answer questions using your knowledge and web tools when helpful.","If the user asks for local file operations or code changes,","explain that you are in Chat mode and suggest they switch to Agent mode."].join(" "),allowedToolCategories:["network"],blockedToolCategories:["filesystem","execution","system","coding","git","database"],allowedTools:[],blockedTools:[],blockAllTools:!1,baseContext:{includeWorkingDirectory:!1,includeToolCategories:!0},workflow:Ab,toolSearch:{alwaysLoadedTools:["web.search","web.fetch","fs.read_file","fs.list_dir"]}},jb={name:"coding",displayName:"Coding",description:"Concise coding mode \u2014 minimal text, focused on file operations and code changes",systemPrompt:["Coding assistant. Use tools to modify code.","Be concise. No conversational filler.","Show code changes clearly."].join(" "),allowedToolCategories:[],blockedToolCategories:[],allowedTools:[],blockedTools:[],blockAllTools:!1,baseContext:{includeWorkingDirectory:!0,includeToolCategories:!0},workflow:Nb,toolSearch:{alwaysLoadedTools:["coding.read_code","coding.search_code","fs.read_file","fs.write_file","fs.list_dir","skill.search","skill.read","web.search","web.fetch"]}},Tr=[Ib,jb,Lb],St="chat";var gn=class{modes=new Map;orderedNames=[];constructor(){for(let e of Tr)this.register(e)}register(e){if(!e.name||typeof e.name!="string")throw new Error("ModeConfig.name is required and must be a non-empty string");if(!e.displayName||typeof e.displayName!="string")throw new Error("ModeConfig.displayName is required and must be a non-empty string");if(typeof e.systemPrompt!="string")throw new Error("ModeConfig.systemPrompt must be a string (can be empty for passthrough)");if(e.blockAllTools!==void 0&&typeof e.blockAllTools!="boolean")throw new Error("ModeConfig.blockAllTools must be a boolean");let t=["allowedToolCategories","blockedToolCategories","allowedTools","blockedTools"];for(let n of t)if(e[n]!==void 0&&!Array.isArray(e[n]))throw new Error(`ModeConfig.${n} must be an array`);let o=this.modes.has(e.name);this.modes.set(e.name,e),o||this.orderedNames.push(e.name)}get(e){return this.modes.get(e)}has(e){return this.modes.has(e)}getAll(){let e=[];for(let t of this.orderedNames){let o=this.modes.get(t);o&&e.push(o)}return e}getNames(){return[...this.orderedNames]}getDefault(){let e=this.modes.get(St);if(!e)throw new Error(`Default mode "${St}" not found in registry`);return e}getNext(e){let t=this.orderedNames.indexOf(e),o=t===-1?0:(t+1)%this.orderedNames.length,n=this.orderedNames[o],s=this.modes.get(n);if(!s)throw new Error(`Mode "${n}" not found in registry`);return s}get size(){return this.modes.size}remove(e){if(Tr.some(n=>n.name===e))return!1;let o=this.modes.delete(e);return o&&(this.orderedNames=this.orderedNames.filter(n=>n!==e)),o}};l();function Jv(r){return{name:r.name,displayName:r.displayName,description:r.description||r.displayName,systemPrompt:r.systemPrompt,allowedToolCategories:r.allowedToolCategories||[],blockedToolCategories:r.blockedToolCategories||[],allowedTools:r.allowedTools||[],blockedTools:r.blockedTools||[],blockAllTools:r.blockAllTools||!1,baseContext:r.baseContext,workflow:r.workflow}}l();var Hi={planning:{enabled:!1},progress:{enabled:!0}};l();k();var Vv=zi,hn=class{client;config;constructor(e,t){this.client=e,this.config=t}async createPlan(e,t){let o=this.config?.planningPrompt||Vv,n=e.messages.filter(p=>p.role==="user").map(p=>typeof p.content=="string"?p.content:"[obj]").join(" ").substring(0,100);y(`[Planner] createPlan() provider=${t??"default"} maxSteps=${this.config?.maxSteps??20} request="${n}..."`);let s=e.messages.filter(p=>p.role==="system"),i=e.messages.filter(p=>p.role!=="system"),a=[{role:"system",content:o},...s,...i],c={...e,tools:void 0,tool_choice:"none",response_format:"json_object",messages:a};try{let p=await this.client.generate(c,t),m=this.parsePlan(p.content||"",e,p);return P(`[Planner] createPlan() succeeded plan.id=${m.id} steps=${m.steps.length}`),m}catch(p){return I(`[Planner] createPlan() failed, using fallback: ${p.message}`),this.createFallbackPlan(e)}}parsePlan(e,t,o){try{let n=JSON.parse(e);if(!n.summary||!Array.isArray(n.steps))throw new Error("Invalid plan structure: missing summary or steps array");let s=this.config?.maxSteps??20,i=n.steps.slice(0,s);n.steps.length>s&&I(`[Planner] parsePlan() truncated ${n.steps.length} steps to maxSteps=${s}`),y(`[Planner] parsePlan() parsed ${i.length} steps successfully`);let a=i.map((p,m)=>({id:`step-${Date.now()}-${m}`,number:p.number||m+1,description:p.description||"Unknown step",expectedTools:p.expectedTools||[],dependsOn:p.dependsOn||[],status:"pending"})),c=t.messages.filter(p=>p.role==="user").map(p=>typeof p.content=="string"?p.content:"[Complex Object]").join("\\n");return{id:`plan-${Date.now()}`,request:c,summary:n.summary,steps:a,status:"draft",createdAt:new Date,planningResponse:o}}catch(n){return I(`[Planner] parsePlan() failed: ${n.message} \u2014 using fallback`),this.createFallbackPlan(t)}}createFallbackPlan(e){I("[Planner] createFallbackPlan() \u2014 creating single-step fallback due to plan generation failure");let t=e.messages.filter(o=>o.role==="user").map(o=>typeof o.content=="string"?o.content:"[Complex Object]").join("\\n");return{id:`plan-${Date.now()}-fallback`,request:t,summary:"Fallback single-step plan due to generation failure",steps:[{id:"step-1",number:1,description:"Execute the user request",status:"pending",expectedTools:[],dependsOn:[]}],status:"draft",createdAt:new Date}}};l();import{EventEmitter as Qv}from"events";k();var xr=class extends Qv{client;config;planner;queryClassifier;pendingApprovals=new Map;constructor(e,t,o){super(),this.client=e,this.config=t,this.queryClassifier=o||new ut,this.planner=new hn(e,t.planning)}getConfig(){return this.config}setConfig(e){this.config=e,this.planner=new hn(this.client,e.planning)}shouldRouteSimpleQuery(e){if(!this.config.complexityRouting?.enabled)return!1;let t=this.config.complexityRouting.strategy??"single-step";if(t==="disabled")return!1;let o=Xe(e.messages);if(!o)return!1;let n=this.queryClassifier.classify(o),s=this.config.complexityRouting.confidenceThreshold??.6,i=!1;switch(n.type){case"action":i=!1;break;case"conversational":i=!0;break;case"analytical":i=n.confidence>=s;break}return y(`[Workflow] shouldRouteSimpleQuery() type=${n.type} confidence=${n.confidence.toFixed(2)} threshold=${s} shouldRoute=${i} strategy=${t}`),i}async execute(e,t){if(this.shouldRouteSimpleQuery(e))return this.executeDirect(e,t);let o=this.config.planning?.enabled;if(y(`[Workflow] execute() planningEnabled=${o} provider=${t??"default"}`),!o)return y("[Workflow] execute() mode=direct"),this.executeDirect(e,t);y("[Workflow] execute() mode=plan-direct \u2014 creating plan");let n=await this.createPlan(e,t);if(this.emit("workflow:plan_created",n),this.config.planning?.requireApproval){P(`[Workflow] Plan "${n.id}" requires approval \u2014 waiting`),this.emitProgress(n,"awaiting_approval","Waiting for plan approval");let s=await this.waitForApproval(n.id);if(this.emit("workflow:plan_decision",n,s),!s)return P(`[Workflow] Plan "${n.id}" rejected by user`),n.status="cancelled",this.emitProgress(n,"failed","Plan rejected by user"),{success:!1,plan:n,error:"Plan rejected by user",metrics:{totalDuration:0,stepsCompleted:0,stepsFailed:0,retriesUsed:0}};P(`[Workflow] Plan "${n.id}" approved`)}return n.status="approved",this.executePlanDirect(n,e,t)}async executeDirect(e,t){let o=Date.now(),n=this.createDummyPlan(e);y(`[Workflow] executeDirect() provider=${t??"default"}`);try{this.emitProgress(n,"executing","Direct execution");let s=await this.client.generate(e,t);n.status="completed",n.completedAt=new Date,n.steps[0].status="completed";let i=Date.now()-o;y(`[Workflow] executeDirect() completed in ${i}ms content_len=${s.content?.length??0}`);let a={success:!0,plan:n,output:s.content||void 0,response:s,metrics:{totalDuration:Date.now()-o,stepsCompleted:1,stepsFailed:0,retriesUsed:0}};return this.emit("workflow:completed",n,a),this.emitProgress(n,"completed","Done"),a}catch(s){n.status="failed",n.completedAt=new Date,n.steps[0].status="failed",I(`[Workflow] executeDirect() failed: ${s.message}`);let i={success:!1,plan:n,error:s.message,metrics:{totalDuration:Date.now()-o,stepsCompleted:0,stepsFailed:1,retriesUsed:0}};return this.emit("workflow:failed",n,s),this.emitProgress(n,"failed","Execution failed"),i}}async createPlan(e,t){y(`[Workflow] createPlan() provider=${t??"default"}`);let o=this.createDummyPlan(e);o.status="draft",this.emitProgress(o,"planning","Creating plan...");let n=await this.planner.createPlan(e,t);return P(`[Workflow] createPlan() completed plan.id=${n.id} steps=${n.steps.length}`),n}async executePlanDirect(e,t,o){let n=Date.now();e.status="in_progress",e.startedAt=new Date,this.emit("workflow:started",e),this.emitProgress(e,"executing","Executing plan",10),y(`[Workflow] executePlanDirect() plan.id=${e.id} steps=${e.steps.length} provider=${o??"default"}`);let s=`
545
+ `,Ib={name:"Coding",planning:{enabled:!0,planningPrompt:Vv},progress:{enabled:!0},complexityRouting:{enabled:!0,strategy:"single-step",confidenceThreshold:.6}},Lb={name:"Chat",planning:{enabled:!1},progress:{enabled:!1}};var jb={name:"agent",displayName:"Agent",description:"Full autonomous access \u2014 read, write, execute, browse",systemPrompt:["You are an autonomous AI agent with full access to all available tools.","You must use the tools provided to accomplish tasks end-to-end proactively.","If you require a capability that is not listed in your current tools, ALWAYS use `tool.search` to find it before improvising or giving up.","Before considering a tool to call, make sure that is the right tool for the job as per the users prompt.","Verify your actions and check for success or failure states.","Explain your actions briefly as you go."].join(" "),allowedToolCategories:[],blockedToolCategories:[],allowedTools:[],blockedTools:[],blockAllTools:!1,baseContext:{includeWorkingDirectory:!0,includeToolCategories:!0},workflow:Ab,toolSearch:{alwaysLoadedTools:["fs.read_file","fs.write_file","fs.list_dir","web.search","web.fetch","skill.search","skill.read"]}},Fb={name:"chat",displayName:"Chat",description:"Conversational assistant with web access",systemPrompt:["You are a conversational AI assistant with web access.","You can search the web, fetch online content, and make HTTP requests.","You do NOT have access to the local filesystem, command execution, or code modification.","Answer questions using your knowledge and web tools when helpful.","If the user asks for local file operations or code changes,","explain that you are in Chat mode and suggest they switch to Agent mode."].join(" "),allowedToolCategories:["network"],blockedToolCategories:["filesystem","execution","system","coding","git","database"],allowedTools:[],blockedTools:[],blockAllTools:!1,baseContext:{includeWorkingDirectory:!1,includeToolCategories:!0},workflow:Lb,toolSearch:{alwaysLoadedTools:["web.search","web.fetch","fs.read_file","fs.list_dir"]}},qb={name:"coding",displayName:"Coding",description:"Concise coding mode \u2014 minimal text, focused on file operations and code changes",systemPrompt:["Coding assistant. Use tools to modify code.","Be concise. No conversational filler.","Show code changes clearly."].join(" "),allowedToolCategories:[],blockedToolCategories:[],allowedTools:[],blockedTools:[],blockAllTools:!1,baseContext:{includeWorkingDirectory:!0,includeToolCategories:!0},workflow:Ib,toolSearch:{alwaysLoadedTools:["coding.read_code","coding.search_code","fs.read_file","fs.write_file","fs.list_dir","skill.search","skill.read","web.search","web.fetch"]}},xr=[jb,qb,Fb],Rt="chat";var hn=class{modes=new Map;orderedNames=[];constructor(){for(let e of xr)this.register(e)}register(e){if(!e.name||typeof e.name!="string")throw new Error("ModeConfig.name is required and must be a non-empty string");if(!e.displayName||typeof e.displayName!="string")throw new Error("ModeConfig.displayName is required and must be a non-empty string");if(typeof e.systemPrompt!="string")throw new Error("ModeConfig.systemPrompt must be a string (can be empty for passthrough)");if(e.blockAllTools!==void 0&&typeof e.blockAllTools!="boolean")throw new Error("ModeConfig.blockAllTools must be a boolean");let t=["allowedToolCategories","blockedToolCategories","allowedTools","blockedTools"];for(let n of t)if(e[n]!==void 0&&!Array.isArray(e[n]))throw new Error(`ModeConfig.${n} must be an array`);let o=this.modes.has(e.name);this.modes.set(e.name,e),o||this.orderedNames.push(e.name)}get(e){return this.modes.get(e)}has(e){return this.modes.has(e)}getAll(){let e=[];for(let t of this.orderedNames){let o=this.modes.get(t);o&&e.push(o)}return e}getNames(){return[...this.orderedNames]}getDefault(){let e=this.modes.get(Rt);if(!e)throw new Error(`Default mode "${Rt}" not found in registry`);return e}getNext(e){let t=this.orderedNames.indexOf(e),o=t===-1?0:(t+1)%this.orderedNames.length,n=this.orderedNames[o],s=this.modes.get(n);if(!s)throw new Error(`Mode "${n}" not found in registry`);return s}get size(){return this.modes.size}remove(e){if(xr.some(n=>n.name===e))return!1;let o=this.modes.delete(e);return o&&(this.orderedNames=this.orderedNames.filter(n=>n!==e)),o}};c();function Qv(r){return{name:r.name,displayName:r.displayName,description:r.description||r.displayName,systemPrompt:r.systemPrompt,allowedToolCategories:r.allowedToolCategories||[],blockedToolCategories:r.blockedToolCategories||[],allowedTools:r.allowedTools||[],blockedTools:r.blockedTools||[],blockAllTools:r.blockAllTools||!1,response_format:r.response_format,baseContext:r.baseContext,workflow:r.workflow}}c();var Ki={planning:{enabled:!1},progress:{enabled:!0}};c();k();var Xv=Hi,yn=class{client;config;constructor(e,t){this.client=e,this.config=t}async createPlan(e,t){let o=this.config?.planningPrompt||Xv,n=e.messages.filter(p=>p.role==="user").map(p=>typeof p.content=="string"?p.content:"[obj]").join(" ").substring(0,100);y(`[Planner] createPlan() provider=${t??"default"} maxSteps=${this.config?.maxSteps??20} request="${n}..."`);let s=e.messages.filter(p=>p.role==="system"),i=e.messages.filter(p=>p.role!=="system"),a=[{role:"system",content:o},...s,...i],l={...e,tools:void 0,tool_choice:"none",response_format:"json_object",messages:a};try{let p=await this.client.generate(l,t),m=this.parsePlan(p.content||"",e,p);return S(`[Planner] createPlan() succeeded plan.id=${m.id} steps=${m.steps.length}`),m}catch(p){return I(`[Planner] createPlan() failed, using fallback: ${p.message}`),this.createFallbackPlan(e)}}parsePlan(e,t,o){try{let n=JSON.parse(e);if(!n.summary||!Array.isArray(n.steps))throw new Error("Invalid plan structure: missing summary or steps array");let s=this.config?.maxSteps??20,i=n.steps.slice(0,s);n.steps.length>s&&I(`[Planner] parsePlan() truncated ${n.steps.length} steps to maxSteps=${s}`),y(`[Planner] parsePlan() parsed ${i.length} steps successfully`);let a=i.map((p,m)=>({id:`step-${Date.now()}-${m}`,number:p.number||m+1,description:p.description||"Unknown step",expectedTools:p.expectedTools||[],dependsOn:p.dependsOn||[],status:"pending"})),l=t.messages.filter(p=>p.role==="user").map(p=>typeof p.content=="string"?p.content:"[Complex Object]").join("\\n");return{id:`plan-${Date.now()}`,request:l,summary:n.summary,steps:a,status:"draft",createdAt:new Date,planningResponse:o}}catch(n){return I(`[Planner] parsePlan() failed: ${n.message} \u2014 using fallback`),this.createFallbackPlan(t)}}createFallbackPlan(e){I("[Planner] createFallbackPlan() \u2014 creating single-step fallback due to plan generation failure");let t=e.messages.filter(o=>o.role==="user").map(o=>typeof o.content=="string"?o.content:"[Complex Object]").join("\\n");return{id:`plan-${Date.now()}-fallback`,request:t,summary:"Fallback single-step plan due to generation failure",steps:[{id:"step-1",number:1,description:"Execute the user request",status:"pending",expectedTools:[],dependsOn:[]}],status:"draft",createdAt:new Date}}};c();import{EventEmitter as Yv}from"events";k();var vr=class extends Yv{client;config;planner;queryClassifier;pendingApprovals=new Map;constructor(e,t,o){super(),this.client=e,this.config=t,this.queryClassifier=o||new ft,this.planner=new yn(e,t.planning)}getConfig(){return this.config}setConfig(e){this.config=e,this.planner=new yn(this.client,e.planning)}shouldRouteSimpleQuery(e){if(!this.config.complexityRouting?.enabled)return!1;let t=this.config.complexityRouting.strategy??"single-step";if(t==="disabled")return!1;let o=Qe(e.messages);if(!o)return!1;let n=this.queryClassifier.classify(o),s=this.config.complexityRouting.confidenceThreshold??.6,i=!1;switch(n.type){case"action":i=!1;break;case"conversational":i=!0;break;case"analytical":i=n.confidence>=s;break}return y(`[Workflow] shouldRouteSimpleQuery() type=${n.type} confidence=${n.confidence.toFixed(2)} threshold=${s} shouldRoute=${i} strategy=${t}`),i}async execute(e,t){if(this.shouldRouteSimpleQuery(e))return this.executeDirect(e,t);let o=this.config.planning?.enabled;if(y(`[Workflow] execute() planningEnabled=${o} provider=${t??"default"}`),!o)return y("[Workflow] execute() mode=direct"),this.executeDirect(e,t);y("[Workflow] execute() mode=plan-direct \u2014 creating plan");let n=await this.createPlan(e,t);if(this.emit("workflow:plan_created",n),this.config.planning?.requireApproval){S(`[Workflow] Plan "${n.id}" requires approval \u2014 waiting`),this.emitProgress(n,"awaiting_approval","Waiting for plan approval");let s=await this.waitForApproval(n.id);if(this.emit("workflow:plan_decision",n,s),!s)return S(`[Workflow] Plan "${n.id}" rejected by user`),n.status="cancelled",this.emitProgress(n,"failed","Plan rejected by user"),{success:!1,plan:n,error:"Plan rejected by user",metrics:{totalDuration:0,stepsCompleted:0,stepsFailed:0,retriesUsed:0}};S(`[Workflow] Plan "${n.id}" approved`)}return n.status="approved",this.executePlanDirect(n,e,t)}async executeDirect(e,t){let o=Date.now(),n=this.createDummyPlan(e);y(`[Workflow] executeDirect() provider=${t??"default"}`);try{this.emitProgress(n,"executing","Direct execution");let s=await this.client.generate(e,t);n.status="completed",n.completedAt=new Date,n.steps[0].status="completed";let i=Date.now()-o;y(`[Workflow] executeDirect() completed in ${i}ms content_len=${s.content?.length??0}`);let a={success:!0,plan:n,output:s.content||void 0,response:s,metrics:{totalDuration:Date.now()-o,stepsCompleted:1,stepsFailed:0,retriesUsed:0}};return this.emit("workflow:completed",n,a),this.emitProgress(n,"completed","Done"),a}catch(s){n.status="failed",n.completedAt=new Date,n.steps[0].status="failed",I(`[Workflow] executeDirect() failed: ${s.message}`);let i={success:!1,plan:n,error:s.message,metrics:{totalDuration:Date.now()-o,stepsCompleted:0,stepsFailed:1,retriesUsed:0}};return this.emit("workflow:failed",n,s),this.emitProgress(n,"failed","Execution failed"),i}}async createPlan(e,t){y(`[Workflow] createPlan() provider=${t??"default"}`);let o=this.createDummyPlan(e);o.status="draft",this.emitProgress(o,"planning","Creating plan...");let n=await this.planner.createPlan(e,t);return S(`[Workflow] createPlan() completed plan.id=${n.id} steps=${n.steps.length}`),n}async executePlanDirect(e,t,o){let n=Date.now();e.status="in_progress",e.startedAt=new Date,this.emit("workflow:started",e),this.emitProgress(e,"executing","Executing plan",10),y(`[Workflow] executePlanDirect() plan.id=${e.id} steps=${e.steps.length} provider=${o??"default"}`);let s=`
546
546
  You have created the following plan to fulfill the request:
547
547
  Summary: ${e.summary}
548
548
 
549
549
  Steps:
550
- ${e.steps.map(c=>`${c.number}. ${c.description}`).join(`
550
+ ${e.steps.map(l=>`${l.number}. ${l.description}`).join(`
551
551
  `)}
552
552
 
553
553
  Execute this plan now.
554
- `.trim(),i=this.injectPlanContext(t.messages,s),a={...t,messages:i};try{let c=await this.client.generate(a,o);e.steps.forEach(m=>{m.status="completed",m.result={success:!0,output:c.content||"",response:c}}),e.status="completed",e.completedAt=new Date,e.metrics=this.computeMetrics(e,n,0),y(`[Workflow] executePlanDirect() completed plan.id=${e.id} duration=${Date.now()-n}ms`);let p={success:!0,plan:e,output:c.content||void 0,response:c,metrics:e.metrics};return this.emit("workflow:completed",e,p),this.emitProgress(e,"completed","Done"),p}catch(c){e.status="failed",e.completedAt=new Date,I(`[Workflow] executePlanDirect() failed plan.id=${e.id}: ${c.message}`);let p={success:!1,plan:e,error:c.message,metrics:this.computeMetrics(e,n,0)};return this.emit("workflow:failed",e,c),this.emitProgress(e,"failed","Execution failed"),p}}emitProgress(e,t,o,n){if(!this.config.progress?.enabled)return;let s=e.steps.length,i=e.steps.filter(p=>p.status==="completed"||p.status==="skipped").length,a=n??(s>0?Math.round(i/s*100):0),c={planId:e.id,currentStep:Math.min(i+1,s),totalSteps:s,percentage:a,currentStepDescription:o??e.steps[i]?.description??"Done",status:t??"executing"};this.emit("workflow:progress",c)}computeMetrics(e,t,o){return{totalDuration:Date.now()-t,stepsCompleted:e.steps.filter(n=>n.status==="completed").length,stepsFailed:e.steps.filter(n=>n.status==="failed").length,retriesUsed:o}}createDummyPlan(e){let t=e.messages.filter(o=>o.role==="user").map(o=>typeof o.content=="string"?o.content:"[Object]").join(`
554
+ `.trim(),i=this.injectPlanContext(t.messages,s),a={...t,messages:i};try{let l=await this.client.generate(a,o);e.steps.forEach(m=>{m.status="completed",m.result={success:!0,output:l.content||"",response:l}}),e.status="completed",e.completedAt=new Date,e.metrics=this.computeMetrics(e,n,0),y(`[Workflow] executePlanDirect() completed plan.id=${e.id} duration=${Date.now()-n}ms`);let p={success:!0,plan:e,output:l.content||void 0,response:l,metrics:e.metrics};return this.emit("workflow:completed",e,p),this.emitProgress(e,"completed","Done"),p}catch(l){e.status="failed",e.completedAt=new Date,I(`[Workflow] executePlanDirect() failed plan.id=${e.id}: ${l.message}`);let p={success:!1,plan:e,error:l.message,metrics:this.computeMetrics(e,n,0)};return this.emit("workflow:failed",e,l),this.emitProgress(e,"failed","Execution failed"),p}}emitProgress(e,t,o,n){if(!this.config.progress?.enabled)return;let s=e.steps.length,i=e.steps.filter(p=>p.status==="completed"||p.status==="skipped").length,a=n??(s>0?Math.round(i/s*100):0),l={planId:e.id,currentStep:Math.min(i+1,s),totalSteps:s,percentage:a,currentStepDescription:o??e.steps[i]?.description??"Done",status:t??"executing"};this.emit("workflow:progress",l)}computeMetrics(e,t,o){return{totalDuration:Date.now()-t,stepsCompleted:e.steps.filter(n=>n.status==="completed").length,stepsFailed:e.steps.filter(n=>n.status==="failed").length,retriesUsed:o}}createDummyPlan(e){let t=e.messages.filter(o=>o.role==="user").map(o=>typeof o.content=="string"?o.content:"[Object]").join(`
555
555
  `);return{id:`plan-direct-${Date.now()}`,request:t,summary:"Direct execution",steps:[{id:"step-1",number:1,description:"Execute request",status:"pending",dependsOn:[],expectedTools:[]}],status:"in_progress",createdAt:new Date}}injectPlanContext(e,t){if(e[0]?.role==="system"){let n=e[0],s=typeof n.content=="string"?n.content:n.content.map(i=>i.text??"").join("");return[{...n,content:`${t}
556
556
 
557
557
  ---
@@ -576,7 +576,7 @@ ${e.steps.map(a=>`${a.number}. ${a.description}`).join(`
576
576
  `)}
577
577
 
578
578
  Execute this plan now.
579
- `.trim(),s={...t,messages:this.injectPlanContext(t.messages,n)},i="";for await(let a of this.client.stream(s,o))a.delta&&(i+=a.delta),yield a;e.steps.forEach(a=>{a.status="completed",a.result={success:!0,output:i}}),e.status="completed",e.completedAt=new Date,this.emit("workflow:completed",e,{success:!0,plan:e,output:i,metrics:this.computeMetrics(e,e.startedAt.getTime(),0)}),this.emitProgress(e,"completed","Done")}waitForApproval(e){return new Promise(t=>{this.pendingApprovals.set(e,t)})}approvePlan(e){let t=this.pendingApprovals.get(e);t&&(t(!0),this.pendingApprovals.delete(e))}rejectPlan(e){let t=this.pendingApprovals.get(e);t&&(t(!1),this.pendingApprovals.delete(e))}};l();import{EventEmitter as Fb}from"events";k();var qb=class r extends Fb{client;activeProviderName;modeRegistry;workflowExecutor;knowledgeLayers=[];customProviderNames=new Set;mcpToolProject=null;_interceptors=[];constructor(e,t,o){super(),this.client=e,this.activeProviderName=t,this.modeRegistry=o;let n=this.client.getProvider(t);n&&this.forwardEvents(n),this.workflowExecutor=new xr(this.client,Hi,this.client.getQueryClassifier()),this.forwardWorkflowEvents()}buildKnowledgeRequestTools(){return this.knowledgeLayers.length===0?[]:this.knowledgeLayers.length===1?[this.knowledgeLayers[0].toTool(),{name:"knowledge_add",displayName:"Add to Knowledge",description:"Add important new information to the knowledge base for future reference.",category:"knowledge",parameters:{type:"object",properties:{content:{type:"string",description:"The content to add to the knowledge base."},metadata:{type:"object",description:"Optional metadata such as source, category, or tags."}},required:["content"]},execute:async s=>({success:!0,id:await this.knowledgeLayers[0].add(s.content,s.metadata),message:"Content added to knowledge base successfully."})}]:[{name:"knowledge_search",displayName:"Knowledge Search",description:`Search across ${this.knowledgeLayers.length} knowledge layers for relevant information.`,category:"search",cacheable:!1,parameters:{type:"object",properties:{query:{type:"string",description:"Search query to find relevant information"},limit:{type:"number",description:"Maximum number of results to return (default: 10)"},threshold:{type:"number",description:"Minimum similarity threshold 0-1 (default: 0.7)"},filter:{type:"object",description:"Optional metadata filters"}},required:["query"]},execute:async o=>{let s=(await Promise.all(this.knowledgeLayers.map(async(a,c)=>(await a.toTool().execute({query:o.query,limit:o.limit,threshold:o.threshold,filter:o.filter})).map(f=>({...f,_layer:c}))))).flat();s.sort((a,c)=>(c.score??0)-(a.score??0));let i=o.limit??10;return s.slice(0,i)}},{name:"knowledge_add",displayName:"Add to Knowledge",description:"Add important new information to the primary knowledge base for future reference.",category:"knowledge",parameters:{type:"object",properties:{content:{type:"string",description:"The content to add to the knowledge base."},metadata:{type:"object",description:"Optional metadata such as source, category, or tags."}},required:["content"]},execute:async o=>({success:!0,id:await this.knowledgeLayers[0].add(o.content,o.metadata),message:"Content added to knowledge base successfully."})}]}prepareRequest(e){let t=[...this.buildKnowledgeRequestTools(),...e.requestTools||[]];if(t.length===0)return e;let o=new Map;for(let n of t)o.set(n.name,n);return{...e,requestTools:Array.from(o.values())}}static async init(e){let t=An(e.configPath);ua(t.logging);let o=new un,n=Lo(e.configPath);o.setConfig(n),e.tools&&await o.loadBuiltIn(),e.customTools&&await o.loadProjects(e.customTools);let s=null,i=e.mcp||t.mcp;if(i)try{P("[MCP] Initializing MCP tool integration");let S=await qi(i);s=S,await o.loadProjects([S]),P(`[MCP] Loaded ${S.tools.length} tools from MCP servers`)}catch(S){pe(`[MCP] Failed to initialize MCP tools: ${S}`)}let a=t.systemPrompt,c=e.disableBaseContext||t.disableBaseContext||t.baseContext===!1||!1,p=t.modeOverrides||{},m={},f=new Set,g=e.defaultProvider||e.provider;if(e.providers)for(let[S,$]of Object.entries(e.providers)){let _=S===g,L=await r.createProvider(S,$,e.configPath,!_);L&&(m[S]=L)}else if(e.provider){let S={apiKey:e.apiKey,model:e.model,projectId:e.projectId,location:e.location,googleAuthOptions:e.googleAuthOptions},$=await r.createProvider(e.provider,S,e.configPath,!1);$&&(m[e.provider]=$)}else if(!e.customProviders)throw new Error('No provider specified. Pass { provider: "name" }, { providers: { ... } }, or { customProviders: { ... } } to init().');if(e.customProviders){let S=Array.isArray(e.customProviders)?e.customProviders:Object.entries(e.customProviders).map(([$,_])=>(_.name=_.name||$,_));for(let $ of S){if(typeof $.generate!="function"||typeof $.stream!="function"||typeof $.embed!="function")throw new Error("Custom provider must implement the ProviderAdapter interface (generate, stream, embed methods). Import { ProviderAdapter } from 'toolpack' and implement or extend it.");let _=$.name;if(!_)throw new Error("Custom provider must have a 'name' property set. Set adapter.name in the constructor or use the record syntax: { 'provider-name': adapter }");if(m[_])throw new Error(`Custom provider name "${_}" conflicts with a built-in provider designation. Choose a different name.`);f.add(_),m[_]=$}}if(!g&&e.customProviders&&(g=(Array.isArray(e.customProviders)?e.customProviders[0]:Object.values(e.customProviders)[0])?.name),!g)throw new Error("No default provider specified.");let w=new gn;if(e.customModes)for(let S of e.customModes)w.register(S);let b={...p,...e.modeOverrides||{}};for(let[S,$]of Object.entries(b)){let _=w.get(S);if(_){$.systemPrompt!==void 0&&(_.systemPrompt=$.systemPrompt),$.toolSearch&&(_.toolSearch={..._.toolSearch||{},...$.toolSearch});for(let[L,$e]of Object.entries($))L!=="systemPrompt"&&L!=="toolSearch"&&(_[L]=$e)}}let T=t.hitl||{};e.confirmationMode!==void 0&&(T.confirmationMode=e.confirmationMode),T.enabled===void 0&&e.onToolConfirm&&(T.enabled=!0),T.confirmationMode===void 0&&e.onToolConfirm&&(T.confirmationMode="all");let v=new xn({providers:m,defaultProvider:g,toolRegistry:o,toolsConfig:o.getConfig(),systemPrompt:a,disableBaseContext:c,hitlConfig:Object.keys(T).length>0?T:void 0,onToolConfirm:e.onToolConfirm,conversationId:e.conversationId,contextWindowConfig:e.contextWindow}),C=new r(v,g,w),x=e.knowledge,R=x==null?[]:Array.isArray(x)?x:[x];C.knowledgeLayers=R.filter(S=>!!S&&typeof S.toTool=="function"),C.customProviderNames=f,C.mcpToolProject=s,C._interceptors=e.interceptors??[];for(let S of C._interceptors)S.init&&await S.init();let D=e.defaultMode||St,M=w.get(D);return M&&(v.setMode(M),M.workflow&&C.workflowExecutor.setConfig(M.workflow)),C}static async createProvider(e,t,o,n=!1){if(e==="vertexai")return new Cn({projectId:t.projectId,location:t.location,googleAuthOptions:t.googleAuthOptions});if(["openai","anthropic","gemini","openrouter"].includes(e)){let s=`TOOLPACK_${e.toUpperCase()}_KEY`,i=t.apiKey||process.env[s]||process.env[`${e.toUpperCase()}_API_KEY`];if(!i){if(n)return null;throw new Error(`No API key found for '${e}'. Set ${s} or pass apiKey in config.`)}switch(e){case"openai":return new ht(i,t.baseUrl);case"anthropic":return new vn(i,t.baseUrl);case"gemini":return new kn(i);case"openrouter":return new Rn(i,{siteUrl:t.siteUrl,siteName:t.siteName})}}if(e==="ollama")return new Gt({baseUrl:t.baseUrl||Sn(o)});if(e.startsWith("ollama-")){let s=t.model||e.replace(/^ollama-/,""),i=t.baseUrl||Sn(o);return new et({model:s,baseUrl:i})}throw new Error(`Unknown provider type: ${e}`)}async generate(e,t){let o;if(typeof e=="string"?o={messages:[{role:"user",content:e}],model:""}:o=e,o=this.prepareRequest(o),this.getMode()?.workflow?.planning?.enabled){let s=await this.workflowExecutor.execute(o,t||this.activeProviderName),i=0,a=0,c=0,p={steps:[]};s.plan.planningResponse?.usage&&(i+=s.plan.planningResponse.usage.prompt_tokens,a+=s.plan.planningResponse.usage.completion_tokens||0,c+=s.plan.planningResponse.usage.total_tokens,p.planning=s.plan.planningResponse.usage);for(let f of s.plan.steps)if(f.status==="completed"&&f.result?.response?.usage){let g=f.result.response.usage;i+=g.prompt_tokens,a+=g.completion_tokens||0,c+=g.total_tokens,p.steps.push({stepNumber:f.number,description:f.description,usage:g})}let m={prompt_tokens:i,completion_tokens:a,total_tokens:c};return s.response?{...s.response,content:s.output||s.response.content||null,usage:m,usage_details:p}:{content:s.output||null,usage:m,usage_details:p}}return this._interceptors.length>0?this._buildInterceptorChain(this._interceptors,i=>this.client.generate(i??o,t))(o):this.client.generate(o,t)}_buildInterceptorChain(e,t){return e.reduceRight((o,n)=>s=>n(s,i=>o(i??s)),t)}async*stream(e,t){let o=this.prepareRequest(e),n=this.getMode(),s=t||this.activeProviderName;if(n?.workflow?.planning?.enabled){yield*this.workflowExecutor.stream(o,s);return}yield*this.client.stream(o,t)}async embed(e,t){return this.client.embed(e,t)}setProvider(e){let t=this.client.getProvider(e);this.activeProviderName=e,this.client.setDefaultProvider(e),this.forwardEvents(t)}getProvider(){return this.client.getProvider(this.activeProviderName)}getClient(){return this.client}reloadConfig(e){let t=e||Ze();if(t)try{let o=Ut(t);o?.hitl&&this.client.updateHitlConfig(o.hitl)}catch(o){I(`[Toolpack] Failed to reload config from ${t}: ${o instanceof Error?o.message:String(o)}`)}}getWorkflowExecutor(){return this.workflowExecutor}async disconnect(){let e=this.getProvider();e&&"disconnect"in e&&await e.disconnect(),this.mcpToolProject&&await Wi(this.mcpToolProject)}async listProviders(){let e=this.client.getProviders(),t=[];for(let[o,n]of e.entries()){let s=this.customProviderNames.has(o),i=[];try{i=await n.getModels()}catch(a){I(`[Toolpack] Failed to fetch models for provider '${o}': ${a}`)}t.push({name:o,displayName:n.getDisplayName(),type:s?"custom":"built-in",models:i})}return t}async loadToolProject(e){let t=this.client.getToolRegistry();if(t)await t.loadProject(e);else throw new Error("No tool registry configured. Initialize Toolpack with tools enabled.")}async listModels(){let e=await this.listProviders(),t=[];for(let o of e)for(let n of o.models)t.push({...n,provider:o.name});return t}setMode(e){let t=this.modeRegistry.get(e);if(!t)throw new Error(`Mode "${e}" not found. Available modes: ${this.modeRegistry.getNames().join(", ")}`);return this.client.setMode(t),t.workflow?this.workflowExecutor.setConfig(t.workflow):this.workflowExecutor.setConfig(Hi),t}getMode(){return this.client.getMode()}getActiveModeName(){let e=this.client.getMode();return e?e.displayName:"Default"}getModes(){return this.modeRegistry.getAll()}cycleMode(){let e=this.client.getMode(),t=e?e.name:"default",o=this.modeRegistry.getNext(t);return this.client.setMode(o),o}registerMode(e){this.modeRegistry.register(e)}forwardEvents(e){e instanceof Fb&&e.on("status",t=>this.emit("status",t))}forwardWorkflowEvents(){let e=this.workflowExecutor;e.on("workflow:plan_created",t=>this.emit("workflow:plan_created",t)),e.on("workflow:plan_decision",(t,o)=>this.emit("workflow:plan_decision",t,o)),e.on("workflow:started",t=>this.emit("workflow:started",t)),e.on("workflow:progress",t=>this.emit("workflow:progress",t)),e.on("workflow:completed",(t,o)=>this.emit("workflow:completed",t,o)),e.on("workflow:failed",(t,o)=>this.emit("workflow:failed",t,o))}};l();l();l();var vr=class{capacity;map;constructor(e){this.capacity=e,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}set(e,t){if(this.map.has(e))this.map.delete(e);else if(this.map.size>=this.capacity){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}this.map.set(e,t)}has(e){return this.map.has(e)}get size(){return this.map.size}};var Ki=class{lru;maxMessagesPerConversation;constructor(e={}){this.lru=new vr(e.maxConversations??500),this.maxMessagesPerConversation=e.maxMessagesPerConversation??500}async append(e){let t=this.lru.get(e.conversationId);t||(t=[],this.lru.set(e.conversationId,t)),!t.some(o=>o.id===e.id)&&(t.push(e),t.sort((o,n)=>o.timestamp.localeCompare(n.timestamp)),t.length>this.maxMessagesPerConversation&&t.splice(0,t.length-this.maxMessagesPerConversation))}async get(e,t={}){let n=(this.lru.get(e)??[]).slice();if(t.scope!==void 0&&(n=n.filter(s=>s.scope===t.scope)),t.sinceTimestamp!==void 0&&(n=n.filter(s=>s.timestamp>=t.sinceTimestamp)),t.participantIds!==void 0&&t.participantIds.length>0){let s=new Set(t.participantIds);n=n.filter(i=>s.has(i.participant.id))}return t.limit!==void 0&&n.length>t.limit&&(n=n.slice(n.length-t.limit)),n}async search(e,t,o={}){let n=this.lru.get(e)??[],s=t.toLowerCase(),i=o.limit??10,a=o.tokenCap??2e3,c=n.filter(f=>f.content.toLowerCase().includes(s)).slice().reverse(),p=[],m=0;for(let f of c){if(p.length>=i)break;let g=Math.ceil(f.content.length/4);if(p.length>0&&m+g>a)break;p.push(f),m+=g}return p}async deleteMessages(e,t){let o=this.lru.get(e);if(!o||t.length===0)return;let n=new Set(t),s=o.filter(i=>!n.has(i.id));this.lru.set(e,s)}clearConversation(e){this.lru.set(e,[])}get conversationCount(){return this.lru.size}};l();import Xv from"better-sqlite3";import*as Rt from"fs";import*as yn from"path";function Yv(){let r=yn.join(process.cwd(),".toolpack","db","conversation");return Rt.existsSync(r)||Rt.mkdirSync(r,{recursive:!0}),yn.join(r,"conversation.sqlite")}var Ji=class{db;maxMessagesPerConversation;useFTS;constructor(e={}){let t=e.dbPath??Yv(),o=yn.dirname(t);if(Rt.existsSync(o)||Rt.mkdirSync(o,{recursive:!0}),this.db=new Xv(t),e.enableWAL!==!1){try{this.db.pragma("journal_mode = WAL")}catch{}try{this.db.pragma("synchronous = NORMAL")}catch{}}this.useFTS=e.useFTS===!0,this.maxMessagesPerConversation=e.maxMessagesPerConversation??500,this.initSchema()}initSchema(){this.db.exec(`
579
+ `.trim(),s={...t,messages:this.injectPlanContext(t.messages,n)},i="";for await(let a of this.client.stream(s,o))a.delta&&(i+=a.delta),yield a;e.steps.forEach(a=>{a.status="completed",a.result={success:!0,output:i}}),e.status="completed",e.completedAt=new Date,this.emit("workflow:completed",e,{success:!0,plan:e,output:i,metrics:this.computeMetrics(e,e.startedAt.getTime(),0)}),this.emitProgress(e,"completed","Done")}waitForApproval(e){return new Promise(t=>{this.pendingApprovals.set(e,t)})}approvePlan(e){let t=this.pendingApprovals.get(e);t&&(t(!0),this.pendingApprovals.delete(e))}rejectPlan(e){let t=this.pendingApprovals.get(e);t&&(t(!1),this.pendingApprovals.delete(e))}};c();import{EventEmitter as Wb}from"events";k();var Ub=class r extends Wb{client;activeProviderName;modeRegistry;workflowExecutor;knowledgeLayers=[];customProviderNames=new Set;mcpToolProject=null;_interceptors=[];constructor(e,t,o){super(),this.client=e,this.activeProviderName=t,this.modeRegistry=o;let n=this.client.getProvider(t);n&&this.forwardEvents(n),this.workflowExecutor=new vr(this.client,Ki,this.client.getQueryClassifier()),this.forwardWorkflowEvents()}buildKnowledgeRequestTools(){return this.knowledgeLayers.length===0?[]:this.knowledgeLayers.length===1?[this.knowledgeLayers[0].toTool(),{name:"knowledge_add",displayName:"Add to Knowledge",description:"Add important new information to the knowledge base for future reference.",category:"knowledge",parameters:{type:"object",properties:{content:{type:"string",description:"The content to add to the knowledge base."},metadata:{type:"object",description:"Optional metadata such as source, category, or tags."}},required:["content"]},execute:async s=>({success:!0,id:await this.knowledgeLayers[0].add(s.content,s.metadata),message:"Content added to knowledge base successfully."})}]:[{name:"knowledge_search",displayName:"Knowledge Search",description:`Search across ${this.knowledgeLayers.length} knowledge layers for relevant information.`,category:"search",cacheable:!1,parameters:{type:"object",properties:{query:{type:"string",description:"Search query to find relevant information"},limit:{type:"number",description:"Maximum number of results to return (default: 10)"},threshold:{type:"number",description:"Minimum similarity threshold 0-1 (default: 0.7)"},filter:{type:"object",description:"Optional metadata filters"}},required:["query"]},execute:async o=>{let s=(await Promise.all(this.knowledgeLayers.map(async(a,l)=>(await a.toTool().execute({query:o.query,limit:o.limit,threshold:o.threshold,filter:o.filter})).map(f=>({...f,_layer:l}))))).flat();s.sort((a,l)=>(l.score??0)-(a.score??0));let i=o.limit??10;return s.slice(0,i)}},{name:"knowledge_add",displayName:"Add to Knowledge",description:"Add important new information to the primary knowledge base for future reference.",category:"knowledge",parameters:{type:"object",properties:{content:{type:"string",description:"The content to add to the knowledge base."},metadata:{type:"object",description:"Optional metadata such as source, category, or tags."}},required:["content"]},execute:async o=>({success:!0,id:await this.knowledgeLayers[0].add(o.content,o.metadata),message:"Content added to knowledge base successfully."})}]}prepareRequest(e){let t=[...this.buildKnowledgeRequestTools(),...e.requestTools||[]];if(t.length===0)return e;let o=new Map;for(let n of t)o.set(n.name,n);return{...e,requestTools:Array.from(o.values())}}static async init(e){let t=In(e.configPath);ga(t.logging);let o=new fn,n=jo(e.configPath);o.setConfig(n),e.tools&&await o.loadBuiltIn(),e.customTools&&await o.loadProjects(e.customTools);let s=null,i=e.mcp||t.mcp;if(i)try{S("[MCP] Initializing MCP tool integration");let R=await Wi(i);s=R,await o.loadProjects([R]),S(`[MCP] Loaded ${R.tools.length} tools from MCP servers`)}catch(R){ce(`[MCP] Failed to initialize MCP tools: ${R}`)}let a=t.systemPrompt,l=e.disableBaseContext||t.disableBaseContext||t.baseContext===!1||!1,p=t.modeOverrides||{},m={},f=new Set,g=e.defaultProvider||e.provider;if(e.providers)for(let[R,D]of Object.entries(e.providers)){let _=R===g,W=await r.createProvider(R,D,e.configPath,!_);W&&(m[R]=W)}else if(e.provider){let R={apiKey:e.apiKey,model:e.model,projectId:e.projectId,location:e.location,googleAuthOptions:e.googleAuthOptions},D=await r.createProvider(e.provider,R,e.configPath,!1);D&&(m[e.provider]=D)}else if(!e.customProviders)throw new Error('No provider specified. Pass { provider: "name" }, { providers: { ... } }, or { customProviders: { ... } } to init().');if(e.customProviders){let R=Array.isArray(e.customProviders)?e.customProviders:Object.entries(e.customProviders).map(([D,_])=>(_.name=_.name||D,_));for(let D of R){if(typeof D.generate!="function"||typeof D.stream!="function"||typeof D.embed!="function")throw new Error("Custom provider must implement the ProviderAdapter interface (generate, stream, embed methods). Import { ProviderAdapter } from 'toolpack' and implement or extend it.");let _=D.name;if(!_)throw new Error("Custom provider must have a 'name' property set. Set adapter.name in the constructor or use the record syntax: { 'provider-name': adapter }");if(m[_])throw new Error(`Custom provider name "${_}" conflicts with a built-in provider designation. Choose a different name.`);f.add(_),m[_]=D}}if(!g&&e.customProviders&&(g=(Array.isArray(e.customProviders)?e.customProviders[0]:Object.values(e.customProviders)[0])?.name),!g)throw new Error("No default provider specified.");let w=new hn;if(e.customModes)for(let R of e.customModes)w.register(R);let b={...p,...e.modeOverrides||{}};for(let[R,D]of Object.entries(b)){let _=w.get(R);if(_){D.systemPrompt!==void 0&&(_.systemPrompt=D.systemPrompt),D.toolSearch&&(_.toolSearch={..._.toolSearch||{},...D.toolSearch});for(let[W,z]of Object.entries(D))W!=="systemPrompt"&&W!=="toolSearch"&&(_[W]=z)}}let T=t.hitl||{};e.confirmationMode!==void 0&&(T.confirmationMode=e.confirmationMode),T.enabled===void 0&&e.onToolConfirm&&(T.enabled=!0),T.confirmationMode===void 0&&e.onToolConfirm&&(T.confirmationMode="all");let x=new vn({providers:m,defaultProvider:g,toolRegistry:o,toolsConfig:o.getConfig(),systemPrompt:a,disableBaseContext:l,hitlConfig:Object.keys(T).length>0?T:void 0,onToolConfirm:e.onToolConfirm,conversationId:e.conversationId,contextWindowConfig:e.contextWindow}),C=new r(x,g,w),v=e.knowledge,$=v==null?[]:Array.isArray(v)?v:[v];C.knowledgeLayers=$.filter(R=>!!R&&typeof R.toTool=="function"),C.customProviderNames=f,C.mcpToolProject=s,C._interceptors=e.interceptors??[];for(let R of C._interceptors)R.init&&await R.init();let P=e.defaultMode||Rt,M=w.get(P);return M&&(x.setMode(M),M.workflow&&C.workflowExecutor.setConfig(M.workflow)),C}static async createProvider(e,t,o,n=!1){if(e==="vertexai")return new Pn({projectId:t.projectId,location:t.location,googleAuthOptions:t.googleAuthOptions});if(["openai","anthropic","gemini","openrouter"].includes(e)){let s=`TOOLPACK_${e.toUpperCase()}_KEY`,i=t.apiKey||process.env[s]||process.env[`${e.toUpperCase()}_API_KEY`];if(!i){if(n)return null;throw new Error(`No API key found for '${e}'. Set ${s} or pass apiKey in config.`)}switch(e){case"openai":return new yt(i,t.baseUrl);case"anthropic":return new Cn(i,t.baseUrl);case"gemini":return new kn(i);case"openrouter":return new _n(i,{siteUrl:t.siteUrl,siteName:t.siteName})}}if(e==="ollama")return new Bt({baseUrl:t.baseUrl||Rn(o)});if(e.startsWith("ollama-")){let s=t.model||e.replace(/^ollama-/,""),i=t.baseUrl||Rn(o);return new Ze({model:s,baseUrl:i})}throw new Error(`Unknown provider type: ${e}`)}async generate(e,t){let o;if(typeof e=="string"?o={messages:[{role:"user",content:e}],model:""}:o=e,o=this.prepareRequest(o),this.getMode()?.workflow?.planning?.enabled){let s=await this.workflowExecutor.execute(o,t||this.activeProviderName),i=0,a=0,l=0,p={steps:[]};s.plan.planningResponse?.usage&&(i+=s.plan.planningResponse.usage.prompt_tokens,a+=s.plan.planningResponse.usage.completion_tokens||0,l+=s.plan.planningResponse.usage.total_tokens,p.planning=s.plan.planningResponse.usage);for(let f of s.plan.steps)if(f.status==="completed"&&f.result?.response?.usage){let g=f.result.response.usage;i+=g.prompt_tokens,a+=g.completion_tokens||0,l+=g.total_tokens,p.steps.push({stepNumber:f.number,description:f.description,usage:g})}let m={prompt_tokens:i,completion_tokens:a,total_tokens:l};return s.response?{...s.response,content:s.output||s.response.content||null,usage:m,usage_details:p}:{content:s.output||null,usage:m,usage_details:p}}return this._interceptors.length>0?this._buildInterceptorChain(this._interceptors,i=>this.client.generate(i??o,t))(o):this.client.generate(o,t)}_buildInterceptorChain(e,t){return e.reduceRight((o,n)=>s=>n(s,i=>o(i??s)),t)}async*stream(e,t){let o=this.prepareRequest(e),n=this.getMode(),s=t||this.activeProviderName;if(n?.workflow?.planning?.enabled){yield*this.workflowExecutor.stream(o,s);return}yield*this.client.stream(o,t)}async embed(e,t){return this.client.embed(e,t)}setProvider(e){let t=this.client.getProvider(e);this.activeProviderName=e,this.client.setDefaultProvider(e),this.forwardEvents(t)}getProvider(){return this.client.getProvider(this.activeProviderName)}getClient(){return this.client}reloadConfig(e){let t=e||Ye();if(t)try{let o=Gt(t);o?.hitl&&this.client.updateHitlConfig(o.hitl)}catch(o){I(`[Toolpack] Failed to reload config from ${t}: ${o instanceof Error?o.message:String(o)}`)}}getWorkflowExecutor(){return this.workflowExecutor}async disconnect(){let e=this.getProvider();e&&"disconnect"in e&&await e.disconnect(),this.mcpToolProject&&await Ui(this.mcpToolProject)}async listProviders(){let e=this.client.getProviders(),t=[];for(let[o,n]of e.entries()){let s=this.customProviderNames.has(o),i=[];try{i=await n.getModels()}catch(a){I(`[Toolpack] Failed to fetch models for provider '${o}': ${a}`)}t.push({name:o,displayName:n.getDisplayName(),type:s?"custom":"built-in",models:i})}return t}async loadToolProject(e){let t=this.client.getToolRegistry();if(t)await t.loadProject(e);else throw new Error("No tool registry configured. Initialize Toolpack with tools enabled.")}async listModels(){let e=await this.listProviders(),t=[];for(let o of e)for(let n of o.models)t.push({...n,provider:o.name});return t}setMode(e){let t=this.modeRegistry.get(e);if(!t)throw new Error(`Mode "${e}" not found. Available modes: ${this.modeRegistry.getNames().join(", ")}`);return this.client.setMode(t),t.workflow?this.workflowExecutor.setConfig(t.workflow):this.workflowExecutor.setConfig(Ki),t}getMode(){return this.client.getMode()}getActiveModeName(){let e=this.client.getMode();return e?e.displayName:"Default"}getModes(){return this.modeRegistry.getAll()}cycleMode(){let e=this.client.getMode(),t=e?e.name:"default",o=this.modeRegistry.getNext(t);return this.client.setMode(o),o}registerMode(e){this.modeRegistry.register(e)}forwardEvents(e){e instanceof Wb&&e.on("status",t=>this.emit("status",t))}forwardWorkflowEvents(){let e=this.workflowExecutor;e.on("workflow:plan_created",t=>this.emit("workflow:plan_created",t)),e.on("workflow:plan_decision",(t,o)=>this.emit("workflow:plan_decision",t,o)),e.on("workflow:started",t=>this.emit("workflow:started",t)),e.on("workflow:progress",t=>this.emit("workflow:progress",t)),e.on("workflow:completed",(t,o)=>this.emit("workflow:completed",t,o)),e.on("workflow:failed",(t,o)=>this.emit("workflow:failed",t,o))}};c();c();c();var Cr=class{capacity;map;constructor(e){this.capacity=e,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}set(e,t){if(this.map.has(e))this.map.delete(e);else if(this.map.size>=this.capacity){let o=this.map.keys().next().value;o!==void 0&&this.map.delete(o)}this.map.set(e,t)}has(e){return this.map.has(e)}get size(){return this.map.size}};var Ji=class{lru;maxMessagesPerConversation;constructor(e={}){this.lru=new Cr(e.maxConversations??500),this.maxMessagesPerConversation=e.maxMessagesPerConversation??500}async append(e){let t=this.lru.get(e.conversationId);t||(t=[],this.lru.set(e.conversationId,t)),!t.some(o=>o.id===e.id)&&(t.push(e),t.sort((o,n)=>o.timestamp.localeCompare(n.timestamp)),t.length>this.maxMessagesPerConversation&&t.splice(0,t.length-this.maxMessagesPerConversation))}async get(e,t={}){let n=(this.lru.get(e)??[]).slice();if(t.scope!==void 0&&(n=n.filter(s=>s.scope===t.scope)),t.sinceTimestamp!==void 0&&(n=n.filter(s=>s.timestamp>=t.sinceTimestamp)),t.participantIds!==void 0&&t.participantIds.length>0){let s=new Set(t.participantIds);n=n.filter(i=>s.has(i.participant.id))}return t.limit!==void 0&&n.length>t.limit&&(n=n.slice(n.length-t.limit)),n}async search(e,t,o={}){let n=this.lru.get(e)??[],s=t.toLowerCase(),i=o.limit??10,a=o.tokenCap??2e3,l=n.filter(f=>f.content.toLowerCase().includes(s)).slice().reverse(),p=[],m=0;for(let f of l){if(p.length>=i)break;let g=Math.ceil(f.content.length/4);if(p.length>0&&m+g>a)break;p.push(f),m+=g}return p}async deleteMessages(e,t){let o=this.lru.get(e);if(!o||t.length===0)return;let n=new Set(t),s=o.filter(i=>!n.has(i.id));this.lru.set(e,s)}clearConversation(e){this.lru.set(e,[])}get conversationCount(){return this.lru.size}};c();import Zv from"better-sqlite3";import*as _t from"fs";import*as bn from"path";function eC(){let r=bn.join(process.cwd(),".toolpack","db","conversation");return _t.existsSync(r)||_t.mkdirSync(r,{recursive:!0}),bn.join(r,"conversation.sqlite")}var Vi=class{db;maxMessagesPerConversation;useFTS;constructor(e={}){let t=e.dbPath??eC(),o=bn.dirname(t);if(_t.existsSync(o)||_t.mkdirSync(o,{recursive:!0}),this.db=new Zv(t),e.enableWAL!==!1){try{this.db.pragma("journal_mode = WAL")}catch{}try{this.db.pragma("synchronous = NORMAL")}catch{}}this.useFTS=e.useFTS===!0,this.maxMessagesPerConversation=e.maxMessagesPerConversation??500,this.initSchema()}initSchema(){this.db.exec(`
580
580
  CREATE TABLE IF NOT EXISTS messages (
581
581
  id TEXT NOT NULL,
582
582
  conversation_id TEXT NOT NULL,
@@ -591,7 +591,7 @@ Execute this plan now.
591
591
  )`),this.db.exec("CREATE INDEX IF NOT EXISTS idx_messages_conv_ts ON messages (conversation_id, timestamp)"),this.db.exec("CREATE INDEX IF NOT EXISTS idx_messages_conv_scope_ts ON messages (conversation_id, scope, timestamp)"),this.db.exec("CREATE INDEX IF NOT EXISTS idx_messages_conv_participant_ts ON messages (conversation_id, participant_id, timestamp)"),this.useFTS&&(this.db.exec("CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(doc_key UNINDEXED, content, tokenize = 'unicode61')"),this.db.exec("CREATE INDEX IF NOT EXISTS idx_messages_fts_key ON messages_fts (doc_key)"))}async append(e){let t=this.db.prepare(`INSERT OR IGNORE INTO messages (
592
592
  id, conversation_id, participant_kind, participant_id, participant_display_name,
593
593
  content, timestamp, scope, metadata
594
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`),o=e.metadata?JSON.stringify(e.metadata):null,n=t.run(e.id,e.conversationId,e.participant.kind,e.participant.id,e.participant.displayName??null,e.content,e.timestamp,e.scope,o);if(this.useFTS&&n.changes>0){let s=`${e.conversationId}:${e.id}`;this.db.prepare("INSERT INTO messages_fts (doc_key, content) VALUES (?, ?)").run(s,e.content)}if(this.maxMessagesPerConversation>0){let a=this.db.prepare("SELECT COUNT(1) as c FROM messages WHERE conversation_id = ?").get(e.conversationId)?.c??0;if(a>this.maxMessagesPerConversation){let c=a-this.maxMessagesPerConversation,m=this.db.prepare("SELECT id FROM messages WHERE conversation_id = ? ORDER BY timestamp ASC LIMIT ?").all(e.conversationId,c).map(f=>f.id);if(m.length>0){let f=m.map(()=>"?").join(",");if(this.db.prepare(`DELETE FROM messages WHERE conversation_id = ? AND id IN (${f})`).run(e.conversationId,...m),this.useFTS){let w=m.map(v=>`${e.conversationId}:${v}`),b=w.map(()=>"?").join(",");this.db.prepare(`DELETE FROM messages_fts WHERE doc_key IN (${b})`).run(...w)}}}}}async get(e,t={}){let o=["conversation_id = ?"],n=[e];if(t.scope!==void 0&&(o.push("scope = ?"),n.push(t.scope)),t.sinceTimestamp!==void 0&&(o.push("timestamp >= ?"),n.push(t.sinceTimestamp)),t.participantIds&&t.participantIds.length>0){let p=t.participantIds.map(()=>"?").join(",");o.push(`participant_id IN (${p})`),n.push(...t.participantIds)}let i=`SELECT id, conversation_id, participant_kind, participant_id, participant_display_name, content, timestamp, scope, metadata FROM messages ${o.length?`WHERE ${o.join(" AND ")}`:""} ORDER BY timestamp ASC`,c=this.db.prepare(i).all(n).map(p=>this.rowToMessage(p));return t.limit!==void 0&&c.length>t.limit&&(c=c.slice(c.length-t.limit)),c}async search(e,t,o={}){let n=o.limit??10,s=o.tokenCap??2e3,i=[];this.useFTS?i=this.db.prepare(`
594
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`),o=e.metadata?JSON.stringify(e.metadata):null,n=t.run(e.id,e.conversationId,e.participant.kind,e.participant.id,e.participant.displayName??null,e.content,e.timestamp,e.scope,o);if(this.useFTS&&n.changes>0){let s=`${e.conversationId}:${e.id}`;this.db.prepare("INSERT INTO messages_fts (doc_key, content) VALUES (?, ?)").run(s,e.content)}if(this.maxMessagesPerConversation>0){let a=this.db.prepare("SELECT COUNT(1) as c FROM messages WHERE conversation_id = ?").get(e.conversationId)?.c??0;if(a>this.maxMessagesPerConversation){let l=a-this.maxMessagesPerConversation,m=this.db.prepare("SELECT id FROM messages WHERE conversation_id = ? ORDER BY timestamp ASC LIMIT ?").all(e.conversationId,l).map(f=>f.id);if(m.length>0){let f=m.map(()=>"?").join(",");if(this.db.prepare(`DELETE FROM messages WHERE conversation_id = ? AND id IN (${f})`).run(e.conversationId,...m),this.useFTS){let w=m.map(x=>`${e.conversationId}:${x}`),b=w.map(()=>"?").join(",");this.db.prepare(`DELETE FROM messages_fts WHERE doc_key IN (${b})`).run(...w)}}}}}async get(e,t={}){let o=["conversation_id = ?"],n=[e];if(t.scope!==void 0&&(o.push("scope = ?"),n.push(t.scope)),t.sinceTimestamp!==void 0&&(o.push("timestamp >= ?"),n.push(t.sinceTimestamp)),t.participantIds&&t.participantIds.length>0){let p=t.participantIds.map(()=>"?").join(",");o.push(`participant_id IN (${p})`),n.push(...t.participantIds)}let i=`SELECT id, conversation_id, participant_kind, participant_id, participant_display_name, content, timestamp, scope, metadata FROM messages ${o.length?`WHERE ${o.join(" AND ")}`:""} ORDER BY timestamp ASC`,l=this.db.prepare(i).all(n).map(p=>this.rowToMessage(p));return t.limit!==void 0&&l.length>t.limit&&(l=l.slice(l.length-t.limit)),l}async search(e,t,o={}){let n=o.limit??10,s=o.tokenCap??2e3,i=[];this.useFTS?i=this.db.prepare(`
595
595
  SELECT m.id, m.conversation_id, m.participant_kind, m.participant_id, m.participant_display_name,
596
596
  m.content, m.timestamp, m.scope, m.metadata
597
597
  FROM messages m
@@ -602,19 +602,19 @@ Execute this plan now.
602
602
  content, timestamp, scope, metadata
603
603
  FROM messages
604
604
  WHERE conversation_id = ? AND content LIKE ? COLLATE NOCASE
605
- ORDER BY timestamp DESC`).all(e,`%${t}%`);let a=i.map(m=>this.rowToMessage(m)),c=[],p=0;for(let m of a){if(c.length>=n)break;let f=Math.ceil(m.content.length/4);if(c.length>0&&p+f>s)break;c.push(m),p+=f}return c}async deleteMessages(e,t){if(!t||t.length===0)return;let o=t.map(()=>"?").join(",");if(this.db.prepare(`DELETE FROM messages WHERE conversation_id = ? AND id IN (${o})`).run(e,...t),this.useFTS){let s=t.map(c=>`${e}:${c}`),i=s.map(()=>"?").join(",");this.db.prepare(`DELETE FROM messages_fts WHERE doc_key IN (${i})`).run(...s)}}clearConversation(e){this.useFTS&&this.db.prepare("DELETE FROM messages_fts WHERE doc_key LIKE ?").run(`${e}:%`),this.db.prepare("DELETE FROM messages WHERE conversation_id = ?").run(e)}rowToMessage(e){return{id:e.id,conversationId:e.conversation_id,participant:{kind:e.participant_kind,id:e.participant_id,displayName:e.participant_display_name??void 0},content:e.content,timestamp:e.timestamp,scope:e.scope,metadata:e.metadata?JSON.parse(e.metadata):void 0}}close(){try{this.db.close()}catch{}}};l();import*as Wb from"os";import*as lt from"path";import*as _t from"fs";var Ub=".toolpack",Gb="config",Bb="toolpack.config.json";function Zv(){return Wb.homedir()}function eC(){return lt.join(Zv(),Ub)}function zb(){return lt.join(eC(),Gb)}function Cr(){return lt.join(zb(),Bb)}function tC(r=process.cwd()){return lt.join(r,Ub)}function Hb(r=process.cwd()){return lt.join(tC(r),Gb)}function kr(r=process.cwd()){return lt.join(Hb(r),Bb)}function Kb(){let r=zb();_t.existsSync(r)||_t.mkdirSync(r,{recursive:!0})}function k1(r=process.cwd()){let e=Hb(r);_t.existsSync(e)||_t.mkdirSync(e,{recursive:!0})}l();import*as te from"fs";import*as Pr from"path";function Qi(r,e){if(!e)return r;if(!r)return e;let t={...r};for(let o of Object.keys(e))e[o]instanceof Array?t[o]=e[o]:e[o]instanceof Object&&o in r?t[o]=Qi(r[o],e[o]):t[o]=e[o];return t}function Vi(r){if(!te.existsSync(r))return null;try{let e=te.readFileSync(r,"utf-8");return JSON.parse(e)}catch{return null}}function $1(r=process.cwd()){let e=Pr.join(r,"toolpack.config.json"),t=Cr(),o=kr(r),n=Vi(e)||{},s=Vi(t)||{},i=Vi(o)||{},a=Qi(n,s);return a=Qi(a,i),a}function E1(r=process.cwd()){let e=Pr.join(r,"toolpack.config.json"),t=Cr(),o=kr(r),n=!te.existsSync(t),s=null,i="default";return te.existsSync(o)?(s=o,i="local"):te.existsSync(t)?(s=t,i="global"):te.existsSync(e)&&(s=e,i="base"),{isFirstRun:n,activeConfigPath:s,configSource:i}}function D1(r=process.cwd()){let e=Cr();if(!te.existsSync(e)){Kb();let t=null,o=kr(r);if(te.existsSync(o))t=o;else{let s=Pr.join(r,"toolpack.config.json");if(te.existsSync(s))t=s;else{let i=Ze();i&&te.existsSync(i)&&(t=i)}}let n={};if(t)try{let s=te.readFileSync(t,"utf-8");n=JSON.parse(s)}catch{}te.writeFileSync(e,JSON.stringify(n,null,4),"utf-8")}}l();l();l();import*as Ke from"fs/promises";import*as $t from"path";l();var oC=new Set(["a","an","the","and","or","but","in","on","at","to","for","of","with","by","from","as","is","was","are","were","been","be","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","it","its","this","that","these","those","i","you","he","she","we","they","what","which","who","when","where","why","how","all","each","every","both","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","also","now","here","there","then"]),Sr=class{documents=new Map;termFrequencies=new Map;documentLengths=new Map;avgDocLength=0;k1;b;constructor(e=1.5,t=.75){this.k1=e,this.b=t}tokenize(e){if(!e)return[];let t=e.toLowerCase();return t=t.replace(/([a-z])([A-Z])/g,"$1 $2"),t=t.replace(/[^a-z0-9]/g," "),t.split(/\s+/).filter(o=>o.length>1).filter(o=>!oC.has(o))}addDocument(e,t){this.documents.set(e,t);let o=this.tokenize(t);this.documentLengths.set(e,o.length);let n={};for(let s of o)n[s]=(n[s]??0)+1;for(let[s,i]of Object.entries(n))this.termFrequencies.has(s)||this.termFrequencies.set(s,new Map),this.termFrequencies.get(s).set(e,i);this.updateAvgDocLength()}clear(){this.documents.clear(),this.termFrequencies.clear(),this.documentLengths.clear(),this.avgDocLength=0}get size(){return this.documents.size}updateAvgDocLength(){if(this.documentLengths.size===0){this.avgDocLength=0;return}let e=0;this.documentLengths.forEach(t=>{e+=t}),this.avgDocLength=e/this.documentLengths.size}idf(e){let t=this.documents.size,o=this.termFrequencies.get(e)?.size??0;return o===0?0:Math.log((t-o+.5)/(o+.5)+1)}search(e,t=10){let o=this.tokenize(e);if(o.length===0)return[];let n={};this.documents.forEach((i,a)=>{let c=0,p=this.documentLengths.get(a)??0;for(let m of o){let f=this.termFrequencies.get(m);if(!f)continue;let g=f.get(a)??0;if(g===0)continue;let w=this.idf(m),b=g*(this.k1+1),T=g+this.k1*(1-this.b+this.b*(p/this.avgDocLength));c+=w*(b/T)}c>0&&(n[a]=c)});let s=Object.entries(n).map(([i,a])=>({id:i,score:a}));return s.sort((i,a)=>a.score-i.score),s.slice(0,t)}};l();import*as He from"path";function Jb(r,e,t){let o=r.match(/^---\n([\s\S]*?)\n---/),n="",s="",i,a=[];if(o&&o[1]){let R=o[1].split(`
606
- `);for(let D of R){let M=D.indexOf(":");if(M===-1)continue;let S=D.substring(0,M).trim(),$=D.substring(M+1).trim();if(S==="name"&&(n=$),S==="title"&&(s=$),S==="version"&&(i=$),S==="tags"){let _=$.match(/\[(.*)\]/);_&&_[1]&&(a=_[1].split(",").map(L=>L.trim().replace(/"/g,"")).filter(Boolean))}}}n||(n=He.basename(e,".skill.md"));let c=r.match(/## Description\n\n([\s\S]*?)(?=\n## |$)/),p=c&&c[1]?c[1].trim():"",m=r.match(/## Triggers\n\n([\s\S]*?)(?=\n## |$)/),f=[];if(m&&m[1]){let R=m[1].split(`
607
- `).filter(D=>D.startsWith("- "));for(let D of R){let M=D.match(/^- "(.*)"/);M&&M[1]&&f.push(M[1])}}let g=r.match(/## Instructions\n\n([\s\S]*?)(?=\n## |$)/),w=g&&g[1]?g[1].trim():"",b=r.match(/## Examples\n\n([\s\S]*?)(?=\n## |$)/),T=b&&b[1]?b[1].trim():void 0,v=He.relative(t,e),C=He.dirname(v),x=C==="."?void 0:C.split(He.sep)[0];return{name:n,title:s,version:i,tags:a,category:x,filePath:e,description:p,triggers:f,instructions:w,examples:T||void 0,lastModified:0}}l();l();var B={name:50,title:100,tags:{count:10,each:30},description:300,triggers:{count:10,min:1,each:100},instructions:2e3,examples:3e3};var nC=/^[a-z][a-z0-9-]*$/;function Vb(r,e){let t=[],o=[];r.name?(nC.test(r.name)||t.push(`name "${r.name}" must match kebab-case pattern /^[a-z][a-z0-9-]*$/`),r.name.length>B.name&&o.push(`name exceeds ${B.name} character limit (${r.name.length} chars)`)):t.push("name is required in frontmatter"),r.title?r.title.length>B.title&&o.push(`title exceeds ${B.title} character limit (${r.title.length} chars)`):t.push("title is required in frontmatter"),r.tags.length>B.tags.count&&o.push(`too many tags (${r.tags.length}); maximum is ${B.tags.count}`);for(let n of r.tags)n.length>B.tags.each&&o.push(`tag "${n}" exceeds ${B.tags.each} character limit`);if(r.description?r.description.length>B.description&&o.push(`description exceeds ${B.description} character limit (${r.description.length} chars)`):t.push("## Description section is required and must not be empty"),!r.triggers||r.triggers.length===0)t.push("## Triggers section must contain at least one trigger");else{r.triggers.length>B.triggers.count&&o.push(`too many triggers (${r.triggers.length}); maximum is ${B.triggers.count}`);for(let n of r.triggers)n.length>B.triggers.each&&o.push(`trigger "${n.substring(0,50)}..." exceeds ${B.triggers.each} character limit`)}return r.instructions?r.instructions.length>B.instructions&&o.push(`instructions exceed ${B.instructions} character limit (${r.instructions.length} chars)`):t.push("## Instructions section is required and must not be empty"),r.examples&&r.examples.length>B.examples&&o.push(`examples exceed ${B.examples} character limit (${r.examples.length} chars)`),{file:e,errors:t,warnings:o}}var Rr=class{dir;onValidationError;loaded=!1;skills=new Map;fileMtimes=new Map;index=new Sr;_buildPromise=null;constructor(e){this.dir=$t.resolve(e.dir),this.onValidationError=e.onValidationError}async findSkillFiles(e){let t=[],o;try{o=await Ke.readdir(e)}catch{return t}for(let n of o){let s=$t.join(e,n),i;try{i=await Ke.stat(s)}catch{continue}if(i.isDirectory()){let a=await this.findSkillFiles(s);t.push(...a)}else i.isFile()&&n.endsWith(".skill.md")&&t.push(s)}return t}buildIndexContent(e){let t=[];t.push(e.name,e.name,e.name),t.push(e.title,e.title,e.title);for(let o of e.tags)t.push(o,o);for(let o of e.triggers)t.push(o,o);return t.push(e.description),t.join(" ")}async needsRebuild(e){if(!this.loaded||e.length!==this.fileMtimes.size)return!0;for(let t of e)try{let o=await Ke.stat(t),n=this.fileMtimes.get(t);if(n===void 0||o.mtimeMs!==n)return!0}catch{return!0}return!1}async buildIndex(e){this.loaded=!1,this.skills.clear(),this.fileMtimes.clear(),this.index.clear();let t=[],o=[],n=new Map;for(let s of e){let i,a;try{let[g,w]=await Promise.all([Ke.readFile(s,"utf-8"),Ke.stat(s)]);i=g.replace(/\r\n/g,`
608
- `),a=w.mtimeMs}catch{continue}this.fileMtimes.set(s,a);let c=Jb(i,s,this.dir);c.lastModified=a;let p=$t.relative(this.dir,s),m=Vb(c,p);if(m.warnings.length>0)for(let g of m.warnings)console.warn(`[skills] ${p}: ${g}`);if(m.errors.length>0){t.push({file:p,errors:m.errors}),this.onValidationError==="warn"&&console.warn(`[skills] Skipping invalid skill "${p}": ${m.errors.join("; ")}`);continue}let f=n.get(c.name);if(f){let g=`duplicate skill name "${c.name}" \u2014 already defined in "${f}"`;t.push({file:p,errors:[g]}),this.onValidationError==="warn"&&console.warn(`[skills] Skipping "${p}": ${g}`);continue}n.set(c.name,p),o.push(c)}if(t.length>0&&this.onValidationError==="fail"){let s=t.map(i=>` ${i.file}:
605
+ ORDER BY timestamp DESC`).all(e,`%${t}%`);let a=i.map(m=>this.rowToMessage(m)),l=[],p=0;for(let m of a){if(l.length>=n)break;let f=Math.ceil(m.content.length/4);if(l.length>0&&p+f>s)break;l.push(m),p+=f}return l}async deleteMessages(e,t){if(!t||t.length===0)return;let o=t.map(()=>"?").join(",");if(this.db.prepare(`DELETE FROM messages WHERE conversation_id = ? AND id IN (${o})`).run(e,...t),this.useFTS){let s=t.map(l=>`${e}:${l}`),i=s.map(()=>"?").join(",");this.db.prepare(`DELETE FROM messages_fts WHERE doc_key IN (${i})`).run(...s)}}clearConversation(e){this.useFTS&&this.db.prepare("DELETE FROM messages_fts WHERE doc_key LIKE ?").run(`${e}:%`),this.db.prepare("DELETE FROM messages WHERE conversation_id = ?").run(e)}rowToMessage(e){return{id:e.id,conversationId:e.conversation_id,participant:{kind:e.participant_kind,id:e.participant_id,displayName:e.participant_display_name??void 0},content:e.content,timestamp:e.timestamp,scope:e.scope,metadata:e.metadata?JSON.parse(e.metadata):void 0}}close(){try{this.db.close()}catch{}}};c();import*as Gb from"os";import*as at from"path";import*as $t from"fs";var Bb=".toolpack",zb="config",Hb="toolpack.config.json";function tC(){return Gb.homedir()}function oC(){return at.join(tC(),Bb)}function Kb(){return at.join(oC(),zb)}function Pr(){return at.join(Kb(),Hb)}function nC(r=process.cwd()){return at.join(r,Bb)}function Jb(r=process.cwd()){return at.join(nC(r),zb)}function kr(r=process.cwd()){return at.join(Jb(r),Hb)}function Vb(){let r=Kb();$t.existsSync(r)||$t.mkdirSync(r,{recursive:!0})}function EU(r=process.cwd()){let e=Jb(r);$t.existsSync(e)||$t.mkdirSync(e,{recursive:!0})}c();import*as ne from"fs";import*as Sr from"path";function Xi(r,e){if(!e)return r;if(!r)return e;let t={...r};for(let o of Object.keys(e))e[o]instanceof Array?t[o]=e[o]:e[o]instanceof Object&&o in r?t[o]=Xi(r[o],e[o]):t[o]=e[o];return t}function Qi(r){if(!ne.existsSync(r))return null;try{let e=ne.readFileSync(r,"utf-8");return JSON.parse(e)}catch{return null}}function AU(r=process.cwd()){let e=Sr.join(r,"toolpack.config.json"),t=Pr(),o=kr(r),n=Qi(e)||{},s=Qi(t)||{},i=Qi(o)||{},a=Xi(n,s);return a=Xi(a,i),a}function IU(r=process.cwd()){let e=Sr.join(r,"toolpack.config.json"),t=Pr(),o=kr(r),n=!ne.existsSync(t),s=null,i="default";return ne.existsSync(o)?(s=o,i="local"):ne.existsSync(t)?(s=t,i="global"):ne.existsSync(e)&&(s=e,i="base"),{isFirstRun:n,activeConfigPath:s,configSource:i}}function LU(r=process.cwd()){let e=Pr();if(!ne.existsSync(e)){Vb();let t=null,o=kr(r);if(ne.existsSync(o))t=o;else{let s=Sr.join(r,"toolpack.config.json");if(ne.existsSync(s))t=s;else{let i=Ye();i&&ne.existsSync(i)&&(t=i)}}let n={};if(t)try{let s=ne.readFileSync(t,"utf-8");n=JSON.parse(s)}catch{}ne.writeFileSync(e,JSON.stringify(n,null,4),"utf-8")}}c();c();c();import*as Ke from"fs/promises";import*as Et from"path";c();var rC=new Set(["a","an","the","and","or","but","in","on","at","to","for","of","with","by","from","as","is","was","are","were","been","be","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","it","its","this","that","these","those","i","you","he","she","we","they","what","which","who","when","where","why","how","all","each","every","both","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","also","now","here","there","then"]),Rr=class{documents=new Map;termFrequencies=new Map;documentLengths=new Map;avgDocLength=0;k1;b;constructor(e=1.5,t=.75){this.k1=e,this.b=t}tokenize(e){if(!e)return[];let t=e.toLowerCase();return t=t.replace(/([a-z])([A-Z])/g,"$1 $2"),t=t.replace(/[^a-z0-9]/g," "),t.split(/\s+/).filter(o=>o.length>1).filter(o=>!rC.has(o))}addDocument(e,t){this.documents.set(e,t);let o=this.tokenize(t);this.documentLengths.set(e,o.length);let n={};for(let s of o)n[s]=(n[s]??0)+1;for(let[s,i]of Object.entries(n))this.termFrequencies.has(s)||this.termFrequencies.set(s,new Map),this.termFrequencies.get(s).set(e,i);this.updateAvgDocLength()}clear(){this.documents.clear(),this.termFrequencies.clear(),this.documentLengths.clear(),this.avgDocLength=0}get size(){return this.documents.size}updateAvgDocLength(){if(this.documentLengths.size===0){this.avgDocLength=0;return}let e=0;this.documentLengths.forEach(t=>{e+=t}),this.avgDocLength=e/this.documentLengths.size}idf(e){let t=this.documents.size,o=this.termFrequencies.get(e)?.size??0;return o===0?0:Math.log((t-o+.5)/(o+.5)+1)}search(e,t=10){let o=this.tokenize(e);if(o.length===0)return[];let n={};this.documents.forEach((i,a)=>{let l=0,p=this.documentLengths.get(a)??0;for(let m of o){let f=this.termFrequencies.get(m);if(!f)continue;let g=f.get(a)??0;if(g===0)continue;let w=this.idf(m),b=g*(this.k1+1),T=g+this.k1*(1-this.b+this.b*(p/this.avgDocLength));l+=w*(b/T)}l>0&&(n[a]=l)});let s=Object.entries(n).map(([i,a])=>({id:i,score:a}));return s.sort((i,a)=>a.score-i.score),s.slice(0,t)}};c();import*as He from"path";function Qb(r,e,t){let o=r.match(/^---\n([\s\S]*?)\n---/),n="",s="",i,a=[];if(o&&o[1]){let $=o[1].split(`
606
+ `);for(let P of $){let M=P.indexOf(":");if(M===-1)continue;let R=P.substring(0,M).trim(),D=P.substring(M+1).trim();if(R==="name"&&(n=D),R==="title"&&(s=D),R==="version"&&(i=D),R==="tags"){let _=D.match(/\[(.*)\]/);_&&_[1]&&(a=_[1].split(",").map(W=>W.trim().replace(/"/g,"")).filter(Boolean))}}}n||(n=He.basename(e,".skill.md"));let l=r.match(/## Description\n\n([\s\S]*?)(?=\n## |$)/),p=l&&l[1]?l[1].trim():"",m=r.match(/## Triggers\n\n([\s\S]*?)(?=\n## |$)/),f=[];if(m&&m[1]){let $=m[1].split(`
607
+ `).filter(P=>P.startsWith("- "));for(let P of $){let M=P.match(/^- "(.*)"/);M&&M[1]&&f.push(M[1])}}let g=r.match(/## Instructions\n\n([\s\S]*?)(?=\n## |$)/),w=g&&g[1]?g[1].trim():"",b=r.match(/## Examples\n\n([\s\S]*?)(?=\n## |$)/),T=b&&b[1]?b[1].trim():void 0,x=He.relative(t,e),C=He.dirname(x),v=C==="."?void 0:C.split(He.sep)[0];return{name:n,title:s,version:i,tags:a,category:v,filePath:e,description:p,triggers:f,instructions:w,examples:T||void 0,lastModified:0}}c();c();var H={name:50,title:100,tags:{count:10,each:30},description:300,triggers:{count:10,min:1,each:100},instructions:2e3,examples:3e3};var sC=/^[a-z][a-z0-9-]*$/;function Xb(r,e){let t=[],o=[];r.name?(sC.test(r.name)||t.push(`name "${r.name}" must match kebab-case pattern /^[a-z][a-z0-9-]*$/`),r.name.length>H.name&&o.push(`name exceeds ${H.name} character limit (${r.name.length} chars)`)):t.push("name is required in frontmatter"),r.title?r.title.length>H.title&&o.push(`title exceeds ${H.title} character limit (${r.title.length} chars)`):t.push("title is required in frontmatter"),r.tags.length>H.tags.count&&o.push(`too many tags (${r.tags.length}); maximum is ${H.tags.count}`);for(let n of r.tags)n.length>H.tags.each&&o.push(`tag "${n}" exceeds ${H.tags.each} character limit`);if(r.description?r.description.length>H.description&&o.push(`description exceeds ${H.description} character limit (${r.description.length} chars)`):t.push("## Description section is required and must not be empty"),!r.triggers||r.triggers.length===0)t.push("## Triggers section must contain at least one trigger");else{r.triggers.length>H.triggers.count&&o.push(`too many triggers (${r.triggers.length}); maximum is ${H.triggers.count}`);for(let n of r.triggers)n.length>H.triggers.each&&o.push(`trigger "${n.substring(0,50)}..." exceeds ${H.triggers.each} character limit`)}return r.instructions?r.instructions.length>H.instructions&&o.push(`instructions exceed ${H.instructions} character limit (${r.instructions.length} chars)`):t.push("## Instructions section is required and must not be empty"),r.examples&&r.examples.length>H.examples&&o.push(`examples exceed ${H.examples} character limit (${r.examples.length} chars)`),{file:e,errors:t,warnings:o}}var _r=class{dir;onValidationError;loaded=!1;skills=new Map;fileMtimes=new Map;index=new Rr;_buildPromise=null;constructor(e){this.dir=Et.resolve(e.dir),this.onValidationError=e.onValidationError}async findSkillFiles(e){let t=[],o;try{o=await Ke.readdir(e)}catch{return t}for(let n of o){let s=Et.join(e,n),i;try{i=await Ke.stat(s)}catch{continue}if(i.isDirectory()){let a=await this.findSkillFiles(s);t.push(...a)}else i.isFile()&&n.endsWith(".skill.md")&&t.push(s)}return t}buildIndexContent(e){let t=[];t.push(e.name,e.name,e.name),t.push(e.title,e.title,e.title);for(let o of e.tags)t.push(o,o);for(let o of e.triggers)t.push(o,o);return t.push(e.description),t.join(" ")}async needsRebuild(e){if(!this.loaded||e.length!==this.fileMtimes.size)return!0;for(let t of e)try{let o=await Ke.stat(t),n=this.fileMtimes.get(t);if(n===void 0||o.mtimeMs!==n)return!0}catch{return!0}return!1}async buildIndex(e){this.loaded=!1,this.skills.clear(),this.fileMtimes.clear(),this.index.clear();let t=[],o=[],n=new Map;for(let s of e){let i,a;try{let[g,w]=await Promise.all([Ke.readFile(s,"utf-8"),Ke.stat(s)]);i=g.replace(/\r\n/g,`
608
+ `),a=w.mtimeMs}catch{continue}this.fileMtimes.set(s,a);let l=Qb(i,s,this.dir);l.lastModified=a;let p=Et.relative(this.dir,s),m=Xb(l,p);if(m.warnings.length>0)for(let g of m.warnings)console.warn(`[skills] ${p}: ${g}`);if(m.errors.length>0){t.push({file:p,errors:m.errors}),this.onValidationError==="warn"&&console.warn(`[skills] Skipping invalid skill "${p}": ${m.errors.join("; ")}`);continue}let f=n.get(l.name);if(f){let g=`duplicate skill name "${l.name}" \u2014 already defined in "${f}"`;t.push({file:p,errors:[g]}),this.onValidationError==="warn"&&console.warn(`[skills] Skipping "${p}": ${g}`);continue}n.set(l.name,p),o.push(l)}if(t.length>0&&this.onValidationError==="fail"){let s=t.map(i=>` ${i.file}:
609
609
  ${i.errors.join(`
610
610
  `)}`).join(`
611
611
  `);throw new Error(`Skills validation failed \u2014 fix the following files before starting:
612
- ${s}`)}for(let s of o)this.skills.set(s.name,s),this.index.addDocument(s.name,this.buildIndexContent(s));this.loaded=!0}async ensureLoaded(){if(this._buildPromise)return this._buildPromise;let e=await this.findSkillFiles(this.dir);if(this._buildPromise)return this._buildPromise;if(await this.needsRebuild(e))return this._buildPromise?this._buildPromise:(this._buildPromise=this.buildIndex(e).finally(()=>{this._buildPromise=null}),this._buildPromise)}async search(e,t,o){await this.ensureLoaded();let n=this.index.search(e,t),s=[];for(let i of n){if(i.score<o)continue;let a=this.skills.get(i.id);a&&s.push({skill:a,score:i.score})}return s}async get(e){return await this.ensureLoaded(),this.skills.get(e)}async list(e){await this.ensureLoaded();let t=Array.from(this.skills.values());return e?.tag?t.filter(o=>o.tags.includes(e.tag)):t}};function rC(r){let e=r?.dir??".toolpack/skills",t=r?.maxSkills??3,o=r?.minScore??.3,n=r?.onValidationError??"fail",s=new Rr({dir:e,onValidationError:n});return Object.assign(async(i,a)=>{let c=i.messages??[],p=-1;for(let g=c.length-1;g>=0;g--)if(c[g].role==="user"){p=g;break}let m=p>=0?c[p]:null,f=m&&typeof m.content=="string"?m.content.trim():"";if(f){let g=await s.search(f,t,o);if(g.length>0){let b=`<skill-instructions>
613
- ${g.map(v=>`--- Skill: ${v.skill.title} ---
614
- ${v.skill.instructions.trim()}
612
+ ${s}`)}for(let s of o)this.skills.set(s.name,s),this.index.addDocument(s.name,this.buildIndexContent(s));this.loaded=!0}async ensureLoaded(){if(this._buildPromise)return this._buildPromise;let e=await this.findSkillFiles(this.dir);if(this._buildPromise)return this._buildPromise;if(await this.needsRebuild(e))return this._buildPromise?this._buildPromise:(this._buildPromise=this.buildIndex(e).finally(()=>{this._buildPromise=null}),this._buildPromise)}async search(e,t,o){await this.ensureLoaded();let n=this.index.search(e,t),s=[];for(let i of n){if(i.score<o)continue;let a=this.skills.get(i.id);a&&s.push({skill:a,score:i.score})}return s}async get(e){return await this.ensureLoaded(),this.skills.get(e)}async list(e){await this.ensureLoaded();let t=Array.from(this.skills.values());return e?.tag?t.filter(o=>o.tags.includes(e.tag)):t}};function iC(r){let e=r?.dir??".toolpack/skills",t=r?.maxSkills??3,o=r?.minScore??.3,n=r?.onValidationError??"fail",s=new _r({dir:e,onValidationError:n});return Object.assign(async(i,a)=>{let l=i.messages??[],p=-1;for(let g=l.length-1;g>=0;g--)if(l[g].role==="user"){p=g;break}let m=p>=0?l[p]:null,f=m&&typeof m.content=="string"?m.content.trim():"";if(f){let g=await s.search(f,t,o);if(g.length>0){let b=`<skill-instructions>
613
+ ${g.map(x=>`--- Skill: ${x.skill.title} ---
614
+ ${x.skill.instructions.trim()}
615
615
  ---`).join(`
616
616
 
617
617
  `)}
618
- </skill-instructions>`,T=c.map((v,C)=>C===p&&typeof v.content=="string"?{...v,content:`${b}
618
+ </skill-instructions>`,T=l.map((x,C)=>C===p&&typeof x.content=="string"?{...x,content:`${b}
619
619
 
620
- ${v.content}`}:v);return a({...i,messages:T})}}return a(i)},{init:()=>s.ensureLoaded()})}export{Ib as AGENT_MODE,zi as AGENT_PLANNING_PROMPT,Ob as AGENT_WORKFLOW,xn as AIClient,vn as AnthropicAdapter,we as AuthenticationError,Ot as BM25SearchEngine,Tr as BUILT_IN_MODES,Lb as CHAT_MODE,Ab as CHAT_WORKFLOW,jb as CODING_MODE,Kv as CODING_PLANNING_PROMPT,Nb as CODING_WORKFLOW,Gb as CONFIG_DIR_NAME,Bb as CONFIG_FILE_NAME,Qe as ConnectionError,ea as ContextWindowConfigError,_r as ContextWindowExceededError,Ar as ContextWindowStateManager,ta as ConversationNotFoundError,St as DEFAULT_MODE_NAME,re as DEFAULT_TOOLS_CONFIG,dw as DEFAULT_TOOL_SEARCH_CONFIG,hU as DEFAULT_WORKFLOW,Hi as DEFAULT_WORKFLOW_CONFIG,kn as GeminiAdapter,Ki as InMemoryConversationStore,$r as InsufficientContextError,j as InvalidRequestError,fn as McpClient,Me as McpConnectionError,br as McpTimeoutError,wr as McpToolManager,gn as ModeRegistry,et as OllamaAdapter,Gt as OllamaProvider,ht as OpenAIAdapter,Rn as OpenRouterAdapter,Yi as PageError,hn as Planner,Z as ProviderAdapter,W as ProviderError,Pe as RateLimitError,A as SDKError,Ji as SQLiteConversationStore,Er as SummarizationError,Ub as TOOLPACK_DIR_NAME,Nt as TOOL_SEARCH_NAME,Zi as TimeoutError,mt as ToolDiscoveryCache,un as ToolRegistry,It as ToolRouter,qb as Toolpack,Cn as VertexAIAdapter,xr as WorkflowExecutor,Pw as addBypassRule,RC as buildSummarizedHistory,gr as cloudDeployTool,yr as cloudListTool,hr as cloudStatusTool,zy as cloudToolsProject,nn as codingExtractFunctionTool,Qo as codingFindReferencesTool,Ko as codingFindSymbolTool,rn as codingGetCallHierarchyTool,tn as codingGetDiagnosticsTool,on as codingGetExportsTool,Vo as codingGetImportsTool,en as codingGetOutlineTool,Jo as codingGetSymbolsTool,Xo as codingGoToDefinitionTool,Yo as codingMultiFileEditTool,Zo as codingRefactorRenameTool,uh as codingToolsProject,na as countTokens,ca as createContextWindowStateManager,qi as createMcpToolProject,Jv as createMode,rC as createSkillInterceptor,Hv as createSkillTools,_C as createSummarizationReport,Nr as createSummarySystemMessage,Ov as createToolProject,ur as dbCountTool,dr as dbDeleteTool,pr as dbInsertTool,ar as dbQueryTool,lr as dbSchemaTool,cr as dbTablesTool,Ny as dbToolsProject,mr as dbUpdateTool,or as diffApplyTool,tr as diffCreateTool,nr as diffPreviewTool,ay as diffToolsProject,Wi as disconnectMcpToolProject,Kb as ensureGlobalConfigDir,k1 as ensureLocalConfigDir,cw as estimateSummaryTokens,Ne as estimateTokenCount,go as execKillTool,ho as execListProcessesTool,fo as execReadOutputTool,uo as execRunBackgroundTool,po as execRunShellTool,co as execRunTool,Dp as execToolsProject,SC as extractConversationKeypoints,Pa as fetchUrlAsBase64,Ht as fsAppendFileTool,ao as fsBatchReadTool,lo as fsBatchWriteTool,eo as fsCopyTool,Xt as fsCreateDirTool,io as fsDeleteDirTool,Kt as fsDeleteFileTool,Jt as fsExistsTool,so as fsGlobTool,Qt as fsListDirTool,Yt as fsMoveTool,to as fsReadFileRangeTool,Bt as fsReadFileTool,no as fsReplaceInFileTool,oo as fsSearchTool,Vt as fsStatTool,Bc as fsToolsProject,ro as fsTreeTool,zt as fsWriteFileTool,lw as generateSummarizationPrompt,Ir as generateToolCategoriesPrompt,yC as getContextWindowPercentage,Rw as getDefaultSlmModel,zb as getGlobalConfigDir,Cr as getGlobalConfigPath,eC as getGlobalToolpackDir,Hb as getLocalConfigDir,kr as getLocalConfigPath,tC as getLocalToolpackDir,vC as getMessageStats,xa as getMimeType,Sn as getOllamaBaseUrl,kw as getOllamaProviderEntries,$w as getRegisteredSlmModels,E1 as getRuntimeConfigStatus,ra as getSafeOutputReserve,At as getToolSearchSchema,qr as getToolpackConfig,Zv as getUserHomeDir,Hn as gitAddTool,Jn as gitBlameTool,Qn as gitBranchCreateTool,Vn as gitBranchListTool,Xn as gitCheckoutTool,er as gitCloneTool,Kn as gitCommitTool,Bn as gitDiffTool,zn as gitLogTool,Gn as gitStatusTool,Hh as gitToolsProject,_o as githubContentsGetTextTool,Ro as githubGraphqlExecuteTool,Ao as githubIssuesCommentsCreateTool,Mo as githubPrDiffGetTool,Oo as githubPrFilesListTool,Do as githubPrReviewCommentsReplyTool,$o as githubPrReviewThreadsListTool,Eo as githubPrReviewThreadsResolveTool,No as githubPrReviewsSubmitTool,tu as githubToolsProject,xC as groupMessagesByRole,pC as handleContextWindowError,Po as httpDeleteTool,So as httpDownloadTool,vo as httpGetTool,Co as httpPostTool,ko as httpPutTool,Vm as httpToolsProject,D1 as initializeGlobalConfigIfFirstRun,cC as isContextWindowError,va as isDataUri,_w as isRegisteredSlm,bn as isToolSearchTool,Mi as k8sApplyManifestTool,Oi as k8sDeleteResourceTool,Ei as k8sDescribeTool,Ii as k8sGetConfigMapTool,Di as k8sGetLogsTool,ji as k8sGetNamespacesTool,Ai as k8sListDeploymentsTool,$i as k8sListPodsTool,Ni as k8sListServicesTool,Li as k8sSwitchContextTool,Lv as k8sToolsProject,Fi as k8sWaitForDeploymentTool,An as loadFullConfig,$1 as loadRuntimeConfig,Lo as loadToolsConfig,$C as mergeSummarizationResults,xw as normalizeImagePart,Se as ollamaRequest,Ur as ollamaStream,Ca as parseDataUri,la as parseSummarizationResponse,aa as prepareSummarizationRequest,sa as pruneMessages,ka as readFileAsBase64,Wr as reloadToolpackConfig,Sw as removeBypassRule,jT as saveToolsConfig,dn as slackAuthTestTool,ln as slackChatPostEphemeralTool,an as slackChatPostMessageTool,pn as slackConversationsHistoryTool,mn as slackConversationsRepliesTool,cn as slackReactionsAddTool,$b as slackToolsProject,To as systemCwdTool,xo as systemDiskUsageTool,bo as systemEnvTool,yo as systemInfoTool,wo as systemSetEnvTool,dm as systemToolsProject,Tw as toDataUri,dt as toolSearchDefinition,TC as truncateMessage,ia as validateSummarizationResult,qo as webExtractLinksTool,Bo as webFeedTool,Io as webFetchTool,Wo as webMapTool,Uo as webMetadataTool,Fo as webScrapeTool,zo as webScreenshotTool,jo as webSearchTool,Go as webSitemapTool,kf as webToolsProject,hC as wouldExceedContextWindow};
620
+ ${x.content}`}:x);return a({...i,messages:T})}}return a(i)},{init:()=>s.ensureLoaded()})}export{jb as AGENT_MODE,Hi as AGENT_PLANNING_PROMPT,Ab as AGENT_WORKFLOW,vn as AIClient,Cn as AnthropicAdapter,xe as AuthenticationError,Nt as BM25SearchEngine,xr as BUILT_IN_MODES,Fb as CHAT_MODE,Lb as CHAT_WORKFLOW,qb as CODING_MODE,Vv as CODING_PLANNING_PROMPT,Ib as CODING_WORKFLOW,zb as CONFIG_DIR_NAME,Hb as CONFIG_FILE_NAME,Ve as ConnectionError,ta as ContextWindowConfigError,$r as ContextWindowExceededError,Ir as ContextWindowStateManager,oa as ConversationNotFoundError,Rt as DEFAULT_MODE_NAME,le as DEFAULT_TOOLS_CONFIG,fw as DEFAULT_TOOL_SEARCH_CONFIG,v1 as DEFAULT_WORKFLOW,Ki as DEFAULT_WORKFLOW_CONFIG,kn as GeminiAdapter,Ji as InMemoryConversationStore,Er as InsufficientContextError,L as InvalidRequestError,gn as McpClient,Oe as McpConnectionError,wr as McpTimeoutError,Tr as McpToolManager,hn as ModeRegistry,Ze as OllamaAdapter,Bt as OllamaProvider,yt as OpenAIAdapter,_n as OpenRouterAdapter,Zi as PageError,yn as Planner,te as ProviderAdapter,q as ProviderError,fe as RateLimitError,A as SDKError,Vi as SQLiteConversationStore,Dr as SummarizationError,Bb as TOOLPACK_DIR_NAME,At as TOOL_SEARCH_NAME,ea as TimeoutError,dt as ToolDiscoveryCache,fn as ToolRegistry,Lt as ToolRouter,Ub as Toolpack,Pn as VertexAIAdapter,vr as WorkflowExecutor,Rw as addBypassRule,MC as buildSummarizedHistory,hr as cloudDeployTool,br as cloudListTool,yr as cloudStatusTool,Ky as cloudToolsProject,rn as codingExtractFunctionTool,Xo as codingFindReferencesTool,Jo as codingFindSymbolTool,sn as codingGetCallHierarchyTool,on as codingGetDiagnosticsTool,nn as codingGetExportsTool,Qo as codingGetImportsTool,tn as codingGetOutlineTool,Vo as codingGetSymbolsTool,Yo as codingGoToDefinitionTool,Zo as codingMultiFileEditTool,en as codingRefactorRenameTool,gh as codingToolsProject,sa as countTokens,ma as createContextWindowStateManager,Wi as createMcpToolProject,Qv as createMode,iC as createSkillInterceptor,Jv as createSkillTools,OC as createSummarizationReport,Ar as createSummarySystemMessage,Av as createToolProject,fr as dbCountTool,ur as dbDeleteTool,mr as dbInsertTool,lr as dbQueryTool,cr as dbSchemaTool,pr as dbTablesTool,Iy as dbToolsProject,dr as dbUpdateTool,nr as diffApplyTool,or as diffCreateTool,rr as diffPreviewTool,cy as diffToolsProject,Ui as disconnectMcpToolProject,Vb as ensureGlobalConfigDir,EU as ensureLocalConfigDir,mw as estimateSummaryTokens,Ne as estimateTokenCount,ho as execKillTool,yo as execListProcessesTool,go as execReadOutputTool,fo as execRunBackgroundTool,mo as execRunShellTool,po as execRunTool,Op as execToolsProject,DC as extractConversationKeypoints,Ra as fetchUrlAsBase64,Kt as fsAppendFileTool,lo as fsBatchReadTool,co as fsBatchWriteTool,to as fsCopyTool,Yt as fsCreateDirTool,ao as fsDeleteDirTool,Jt as fsDeleteFileTool,Vt as fsExistsTool,io as fsGlobTool,Xt as fsListDirTool,Zt as fsMoveTool,oo as fsReadFileRangeTool,zt as fsReadFileTool,ro as fsReplaceInFileTool,no as fsSearchTool,Qt as fsStatTool,Hc as fsToolsProject,so as fsTreeTool,Ht as fsWriteFileTool,pw as generateSummarizationPrompt,Lr as generateToolCategoriesPrompt,vC as getContextWindowPercentage,$w as getDefaultSlmModel,Kb as getGlobalConfigDir,Pr as getGlobalConfigPath,oC as getGlobalToolpackDir,Jb as getLocalConfigDir,kr as getLocalConfigPath,nC as getLocalToolpackDir,RC as getMessageStats,Ca as getMimeType,Rn as getOllamaBaseUrl,Sw as getOllamaProviderEntries,Dw as getRegisteredSlmModels,IU as getRuntimeConfigStatus,ia as getSafeOutputReserve,It as getToolSearchSchema,Wr as getToolpackConfig,tC as getUserHomeDir,Kn as gitAddTool,Vn as gitBlameTool,Xn as gitBranchCreateTool,Qn as gitBranchListTool,Yn as gitCheckoutTool,tr as gitCloneTool,Jn as gitCommitTool,zn as gitDiffTool,Hn as gitLogTool,Bn as gitStatusTool,Jh as gitToolsProject,$o as githubContentsGetTextTool,_o as githubGraphqlExecuteTool,Io as githubIssuesCommentsCreateTool,Oo as githubPrDiffGetTool,No as githubPrFilesListTool,Mo as githubPrReviewCommentsReplyTool,Eo as githubPrReviewThreadsListTool,Do as githubPrReviewThreadsResolveTool,Ao as githubPrReviewsSubmitTool,nu as githubToolsProject,SC as groupMessagesByRole,dC as handleContextWindowError,So as httpDeleteTool,Ro as httpDownloadTool,Co as httpGetTool,Po as httpPostTool,ko as httpPutTool,Xm as httpToolsProject,LU as initializeGlobalConfigIfFirstRun,mC as isContextWindowError,Pa as isDataUri,Ew as isRegisteredSlm,wn as isToolSearchTool,Oi as k8sApplyManifestTool,Ni as k8sDeleteResourceTool,Di as k8sDescribeTool,Li as k8sGetConfigMapTool,Mi as k8sGetLogsTool,Fi as k8sGetNamespacesTool,Ii as k8sListDeploymentsTool,Ei as k8sListPodsTool,Ai as k8sListServicesTool,ji as k8sSwitchContextTool,Fv as k8sToolsProject,qi as k8sWaitForDeploymentTool,In as loadFullConfig,AU as loadRuntimeConfig,jo as loadToolsConfig,NC as mergeSummarizationResults,Cw as normalizeImagePart,Re as ollamaRequest,Gr as ollamaStream,ka as parseDataUri,pa as parseSummarizationResponse,ca as prepareSummarizationRequest,aa as pruneMessages,Sa as readFileAsBase64,Ur as reloadToolpackConfig,_w as removeBypassRule,qT as saveToolsConfig,un as slackAuthTestTool,cn as slackChatPostEphemeralTool,ln as slackChatPostMessageTool,mn as slackConversationsHistoryTool,dn as slackConversationsRepliesTool,pn as slackReactionsAddTool,Db as slackToolsProject,xo as systemCwdTool,vo as systemDiskUsageTool,wo as systemEnvTool,bo as systemInfoTool,To as systemSetEnvTool,fm as systemToolsProject,vw as toDataUri,ut as toolSearchDefinition,kC as truncateMessage,la as validateSummarizationResult,Wo as webExtractLinksTool,zo as webFeedTool,Lo as webFetchTool,Uo as webMapTool,Go as webMetadataTool,qo as webScrapeTool,Ho as webScreenshotTool,Fo as webSearchTool,Bo as webSitemapTool,Sf as webToolsProject,xC as wouldExceedContextWindow};