@smythos/sdk
Version:
114 lines (90 loc) • 88.5 kB
JavaScript
import{SRE,AccessCandidate,DEFAULT_TEAM_ID,SmythFS,ConnectorService,TConnectorService,TAccessRole,Conversation,TLLMEvent,DummyAccount,Job,Schedule,TLLMProvider,BinaryInput,AgentProcess}from"@smythos/sre";import{AccessCandidate as AccessCandidate2,Job as Job2,Schedule as Schedule2,TLLMEvent as TLLMEvent2,TLLMProvider as TLLMProvider2}from"@smythos/sre";import EventEmitter$1,{EventEmitter}from"events";import*as fs from"fs";import fs__default,{existsSync}from"fs";import chalk from"chalk";import*as acorn from"acorn";import express from"express";import{SSEServerTransport}from"@modelcontextprotocol/sdk/server/sse.js";import{Server}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport}from"@modelcontextprotocol/sdk/server/stdio.js";import{ListToolsRequestSchema,CallToolRequestSchema}from"@modelcontextprotocol/sdk/types.js";import{lookup}from"mime-types";import path,{extname}from"path";import{readFile}from"fs/promises";import*as mammoth from"mammoth";var version="1.3.40";function uid(){return(Date.now()+Math.random()).toString(36).replace(".","").toUpperCase()}function nGramSearch(str,array,n=3){if(!str||!array?.length)return null;const getNGrams=(s,gramSize)=>{const ngrams=new Set,source=s.toLowerCase();if(source.length<gramSize)return source.length>0&&ngrams.add(source),ngrams;for(let i=0;i<=source.length-gramSize;i++)ngrams.add(source.substring(i,i+gramSize));return ngrams},strNGrams=getNGrams(str,n);let bestMatch=null,bestScore=-1;for(const candidate of array){const candidateNGrams=getNGrams(candidate,n),intersection=new Set([...strNGrams].filter(gram=>candidateNGrams.has(gram))),union=new Set([...strNGrams,...candidateNGrams]),similarity=union.size===0?0:intersection.size/union.size;similarity>bestScore&&(bestScore=similarity,bestMatch=candidate)}return bestMatch}function isFile(str){if(!str||str.length>=1e3||!isValidPathFormat(str))return!1;try{return fs__default.statSync(str).isFile()}catch{return!1}}function isValidPathFormat(path2){if(/[\0<>"|?*]/.test(path2))return!1;const windowsAbsolute=/^[a-zA-Z]:[\\\/]/,windowsUNC=/^\\\\[^\\]+\\[^\\]+/,windowsRelative=/^\.{1,2}[\\\/]/,unixAbsolute=/^\//,unixHome=/^~[\/]/,unixRelative=/^\.{1,2}\//,genericRelative=/^[^\\\/]/;return windowsAbsolute.test(path2)||windowsUNC.test(path2)||windowsRelative.test(path2)||unixAbsolute.test(path2)||unixHome.test(path2)||unixRelative.test(path2)||genericRelative.test(path2)}const SDKLog={warn:(...args)=>{console.warn(chalk.gray("[WARN]",...args))},error:(...args)=>{console.error(chalk.red("[ERR]",...args))},info:(...args)=>{console.info("[INFO]",...args)},debug:(...args)=>{console.debug("[DBG]",...args)},log:(...args)=>{console.log(...args)}};var __defProp$f=Object.defineProperty,__defNormalProp$f=(obj,key,value)=>key in obj?__defProp$f(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$f=(obj,key,value)=>__defNormalProp$f(obj,typeof key!="symbol"?key+"":key,value);class ControlledPromise extends Promise{constructor(executor){let internalResolve,internalReject,_isSettled=!1;super((resolve,reject)=>{internalResolve=value=>{_isSettled||(_isSettled=!0,resolve(value))},internalReject=reason=>{_isSettled||(_isSettled=!0,reject(reason))}}),__publicField$f(this,"_isSettled",!1),__publicField$f(this,"isSettled"),__publicField$f(this,"resolve"),__publicField$f(this,"reject"),this.resolve=internalResolve,this.reject=internalReject,this.isSettled=()=>_isSettled,executor(this.resolve,this.reject,this.isSettled)}}var __defProp$e=Object.defineProperty,__defNormalProp$e=(obj,key,value)=>key in obj?__defProp$e(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$e=(obj,key,value)=>__defNormalProp$e(obj,typeof key!="symbol"?key+"":key,value);class SDKObject{constructor(){__publicField$e(this,"_eventEmitter"),__publicField$e(this,"_readyPromise"),this._eventEmitter=new EventEmitter,this._readyPromise=new ControlledPromise(this.init.bind(this))}get ready(){return this._readyPromise}async init(revolveReadyPromise=!0){SRE.initializing||SRE.init({}),await SRE.ready(),revolveReadyPromise&&this._readyPromise.resolve(!0)}async initSignal(){this._readyPromise.resolve(!0)}on(event,listener){this._eventEmitter.on(event,listener)}emit(event,...args){this._eventEmitter.emit(event,...args)}off(event,listener){this._eventEmitter.off(event,listener)}once(event,listener){this._eventEmitter.once(event,listener)}removeListener(event,listener){this._eventEmitter.removeListener(event,listener)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
const TStorageProvider={default:"default",LocalStorage:"LocalStorage",S3:"S3"};var __defProp$d=Object.defineProperty,__defNormalProp$d=(obj,key,value)=>key in obj?__defProp$d(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$d=(obj,key,value)=>__defNormalProp$d(obj,typeof key!="symbol"?key+"":key,value);class StorageInstance extends SDKObject{constructor(providerId,storageSettings={},candidate){if(super(),__publicField$d(this,"_candidate"),__publicField$d(this,"_teamId"),__publicField$d(this,"_fs"),this._candidate=candidate||AccessCandidate.team(DEFAULT_TEAM_ID),providerId===TStorageProvider.default){this._fs=SmythFS.Instance;return}let connector=ConnectorService.getStorageConnector(providerId||"");if(!connector?.valid&&(connector=ConnectorService.init(TConnectorService.Storage,providerId,providerId,{}),!connector?.valid))throw console.error(`Storage connector ${providerId} is not available`),new Error(`Storage connector ${providerId} is not available`);const instance=connector.instance(storageSettings||connector.settings);this._fs=SmythFS.getInstance(instance)}get fs(){return this._fs}async getResourceId(resourceName){if(!this._teamId){const accountConnector=ConnectorService.getAccountConnector();this._teamId=await accountConnector.getCandidateTeam(this._candidate)}return`teams/${this._teamId}/${resourceName}`}async getResourceUri(resourceName){if(!this._teamId){const accountConnector=ConnectorService.getAccountConnector();this._teamId=await accountConnector.getCandidateTeam(this._candidate)}let tld="";switch(this._candidate.role){case TAccessRole.Agent:tld=".agent";break;case TAccessRole.User:tld=".user";break;default:tld=".team"}return`smythfs://${this._candidate.id}${tld}/${resourceName}`}async read(resourceName){const uri=resourceName.startsWith("smythfs://")?resourceName:await this.getResourceUri(resourceName);try{return await this.fs.read(uri,this._candidate)}catch(error){throw console.error(error),error}}async write(resourceName,data){const uri=resourceName.startsWith("smythfs://")?resourceName:await this.getResourceUri(resourceName);try{return await this.fs.write(uri,data,this._candidate),uri}catch(error){throw console.error(error),error}}async delete(resourceName){const uri=resourceName.startsWith("smythfs://")?resourceName:await this.getResourceUri(resourceName);try{return await this.fs.delete(uri,this._candidate),uri}catch(error){throw console.error(error),error}}async exists(resourceName){const uri=resourceName.startsWith("smythfs://")?resourceName:await this.getResourceUri(resourceName);try{return await this.fs.exists(uri,this._candidate),uri}catch(error){throw console.error(error),error}}}var __defProp$c=Object.defineProperty,__defNormalProp$c=(obj,key,value)=>key in obj?__defProp$c(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$c=(obj,key,value)=>__defNormalProp$c(obj,typeof key!="symbol"?key+"":key,value);const console$4=SDKLog;class LocalChatStore extends SDKObject{constructor(_conversationId,candidate){super(),this._conversationId=_conversationId,__publicField$c(this,"_storage"),this._storage=new StorageInstance(null,null,candidate)}async save(messages){try{await this._storage.write(`${this._conversationId}`,JSON.stringify(messages))}catch(error){throw console$4.error("Error saving chat messages: ",error),error}}async load(count){try{const buffer=await this._storage.read(`${this._conversationId}`);return buffer?JSON.parse(buffer.toString()):[]}catch(error){throw console$4.error("Error loading chat messages: ",error),error}}async getMessage(message_id){return(await this.load()).find(m=>m.__smyth_data__?.message_id===message_id)}}class ChatCommand{constructor(prompt,chat,options){this.prompt=prompt,this.chat=chat,this.options=options,__publicField$c(this,"_conversation"),this._conversation=chat._conversation}then(resolve,reject){return this.run().then(resolve,reject)}async run(){return await this.chat.ready,await this._conversation.ready,await this._conversation.streamPrompt(this.prompt,this.options?.headers,this.options?.concurrentCalls)}async stream(){await this.chat.ready,await this._conversation.ready;const eventEmitter=new EventEmitter,toolInfoHandler=toolInfo=>{eventEmitter.emit(TLLMEvent.ToolInfo,toolInfo),this.chat.emit(TLLMEvent.ToolInfo,toolInfo)},interruptedHandler=interrupted=>{eventEmitter.emit(TLLMEvent.Interrupted,interrupted),this.chat.emit(TLLMEvent.Interrupted,interrupted)},dataHandler=data=>{eventEmitter.emit(TLLMEvent.Data,data),this.chat.emit(TLLMEvent.Data,data)},contentHandler=content=>{eventEmitter.emit(TLLMEvent.Content,content),this.chat.emit(TLLMEvent.Content,content)},toolCallHandler=toolCall=>{eventEmitter.emit(TLLMEvent.ToolCall,toolCall),this.chat.emit(TLLMEvent.ToolCall,toolCall)},toolResultHandler=toolResult=>{eventEmitter.emit(TLLMEvent.ToolResult,toolResult),this.chat.emit(TLLMEvent.ToolResult,toolResult)},endHandler=()=>{eventEmitter.emit(TLLMEvent.End),this.chat.emit(TLLMEvent.End),removeHandlers()},errorHandler=error=>{eventEmitter.emit(TLLMEvent.Error,error),this.chat.emit(TLLMEvent.Error,error),removeHandlers()},usageHandler=usage=>{eventEmitter.emit(TLLMEvent.Usage,usage),this.chat.emit(TLLMEvent.Usage,usage)},removeHandlers=()=>{this._conversation.off(TLLMEvent.ToolCall,toolCallHandler),this._conversation.off(TLLMEvent.ToolResult,toolResultHandler),this._conversation.off(TLLMEvent.Usage,usageHandler),this._conversation.off(TLLMEvent.End,endHandler),this._conversation.off(TLLMEvent.Error,errorHandler),this._conversation.off(TLLMEvent.Content,contentHandler),this._conversation.off(TLLMEvent.ToolInfo,toolInfoHandler),this._conversation.off(TLLMEvent.Interrupted,interruptedHandler),this._conversation.off(TLLMEvent.Data,dataHandler)};return this._conversation.on(TLLMEvent.ToolCall,toolCallHandler),this._conversation.on(TLLMEvent.ToolResult,toolResultHandler),this._conversation.on(TLLMEvent.Usage,usageHandler),this._conversation.on(TLLMEvent.End,endHandler),this._conversation.on(TLLMEvent.Error,errorHandler),this._conversation.on(TLLMEvent.Content,contentHandler),this._conversation.on(TLLMEvent.ToolInfo,toolInfoHandler),this._conversation.on(TLLMEvent.Interrupted,interruptedHandler),this._conversation.on(TLLMEvent.Data,dataHandler),this._conversation.streamPrompt(this.prompt,this.options?.headers,this.options?.concurrentCalls).catch(error=>{eventEmitter.emit(TLLMEvent.Error,error)}),eventEmitter}}class Chat extends SDKObject{constructor(options,source,_convOptions={}){super(),this.source=source,this._convOptions=_convOptions,__publicField$c(this,"_id"),__publicField$c(this,"_conversation"),__publicField$c(this,"_curAgentModes",""),__publicField$c(this,"_emptyData",{version:"1.0.0",name:"Agent",behavior:"",components:[],connections:[],defaultModel:"",id:uid()}),__publicField$c(this,"_data",{});const _data=source?.data||source||{},_model=options.model||_data?.defaultModel||"";this._data={...this._emptyData,..._data,defaultModel:_model},this._id=options.id||uid(),options.persist&&(options.candidate?(!this._convOptions?.store&&typeof options.persist=="boolean"&&(this._convOptions.store=new LocalChatStore(this._id,options.candidate)),!this._convOptions?.store&&this.isValidPersistanceObject(options.persist)&&(this._convOptions.store=options.persist)):(console$4.warn("Agent ID or Team ID are required to use chat persistance."),console$4.warn("Chat persistance disabled!"))),options.maxContextSize&&(this._convOptions.maxContextSize=options.maxContextSize),options.maxOutputTokens&&(this._convOptions.maxOutputTokens=options.maxOutputTokens),this.source?.modes&&(this._curAgentModes=this.source.modes.join("|")),this._conversation=createConversation(this._data,this._convOptions)}get conversation(){return this._conversation}get id(){return this._id}get agentData(){return this._data}isValidPersistanceObject(persistance){return typeof persistance=="object"&&"save"in persistance&&"load"in persistance&&"getMessage"in persistance}async init(){await super.init(),await registerProcessSkills(this._conversation,this._data)}prompt(prompt,options){if(this.source?.modes){const modes=this.source.modes.join("|");if(modes!==this._curAgentModes){const _data=this.source.data||this.source,_model=this._data?.defaultModel||"";this._data={...this._emptyData,..._data,defaultModel:_model},this._conversation.spec=this._data,this._curAgentModes=modes}}return new ChatCommand(prompt,this,options)}}function createConversation(agentData,options){const filteredAgentData={...agentData,components:agentData.components},conversation=new Conversation(agentData.defaultModel,filteredAgentData,{agentId:agentData.id,...options});return conversation.on(TLLMEvent.Error,error=>{console$4.error("An error occurred while running the agent: ",error.message,error.stack)}),conversation}async function registerProcessSkills(conversation,agentData){}async function prepareConversation(agentData,options){const conversation=createConversation(agentData,options);return await registerProcessSkills(),conversation}function createSafeAccessor(base,root,currentPath,props){return new Proxy(base,{get(target,prop){if(prop==="__root__")return root;if(prop==="__path__")return currentPath||"";if(prop==="__props__")return props||{};if(typeof target[prop]=="function")return target[prop];if(!(prop in target)){const newPath=currentPath?`${currentPath}.${prop}`:prop;return createSafeAccessor({},root,newPath)}return target[prop]}})}var __defProp$b=Object.defineProperty,__defNormalProp$b=(obj,key,value)=>key in obj?__defProp$b(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$b=(obj,key,value)=>__defNormalProp$b(obj,typeof key!="symbol"?key+"":key,value);class ComponentWrapper{constructor(_internalData,_agentMaker){this._internalData=_internalData,this._agentMaker=_agentMaker,__publicField$b(this,"_id"),__publicField$b(this,"outputPathRewrite",path2=>path2),this._id="C"+uid()}get internalData(){return this._internalData}get id(){return this._id}get agentMaker(){return this._agentMaker}set agentMaker(agentMaker){this._agentMaker=agentMaker}get data(){const processInputs=this._internalData.process?this.extractArgsInputs(this._internalData.process):[],data={name:this._name,data:this._settings,displayName:this._name,title:this._name,id:this._id,process:typeof this._internalData.process=="function"?this._internalData.process:void 0,left:"0px",top:"0px",inputs:[...processInputs,...Object.keys(this._inputs||{}).map(key=>({name:key,type:this._inputs[key].type||"Any",description:this._inputs[key].description||void 0,optional:this._inputs[key].optional||!1,default:this._inputs[key].default||void 0}))],outputs:Object.keys(this._outputs||{}).map(key=>({name:key,...this._outputs?.[key]?.__props__||{}}))},inputs=data.inputs.reduce((acc,input)=>(acc[input.name]?acc[input.name]={...acc[input.name],...input}:acc[input.name]=input,acc),{});return data.inputs=Object.values(inputs),data}get _name(){return this._internalData.name}get _settings(){return this._internalData.settings}get _inputs(){return this._internalData.inputs}get _outputs(){return this._internalData.outputs}inputs(inputsList){for(let key in inputsList){const val=inputsList[key],sourceData=val?.__root__?.data;let outputPath=val?.__path__;const agentMaker=val?.__root__?.agentMaker;if(agentMaker){this.agentMaker||(this.agentMaker=agentMaker),agentMaker?.structure?.components.find(c=>c.id==this._id)||agentMaker?.structure?.components?.push(this);const sourceId=sourceData?.id,targetId=this._id;if(sourceId&&targetId){const sourceComponent=agentMaker?.structure?.components?.find(c=>c.id==sourceId);outputPath=sourceComponent.outputPathRewrite(outputPath),Object.keys(sourceComponent?._outputs).includes(outputPath)||(sourceComponent._outputs[outputPath]=createSafeAccessor({},sourceComponent,outputPath));const connection={sourceId,targetId,sourceIndex:outputPath,targetIndex:key};agentMaker?.structure?.connections?.push(connection)}}typeof sourceData<"u"?(inputsList[key]={source:val},this._inputs[key]||(this._inputs[key]={source:val,component:this,type:"Any",default:!1})):this._inputs[key]||(this._inputs[key]={component:this,type:"Any",default:!1,...val})}return this}extractArgsInputs(fn){const params=acorn.parse(`(${fn.toString()})`,{ecmaVersion:"latest"}).body[0].expression.params;let counter=0;function handleParam(param){return param.type==="Identifier"?[{name:param.name,type:"Any",description:""}]:param.type==="AssignmentPattern"&¶m.left.type==="Identifier"?[{name:param.left.name,type:"Any",description:""}]:param.type==="RestElement"&¶m.argument.type==="Identifier"?[{name:param.argument.name,type:"Any",description:""}]:param.type==="ObjectPattern"?(counter++,param.properties.map(prop=>({name:prop.key.name||`unknown_${counter++}`,type:"Any",description:""}))):{name:`unknown_${counter++}`,type:"Any",description:""}}return params.map(handleParam).flat()}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function APICall(settings,agent){const dataObject={name:"APICall",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({Headers:createSafeAccessor({},component,"Headers",{description:"The headers of the API call response",default:!0}),Response:createSafeAccessor({},component,"Response",{description:"The response of the API call",default:!0})},component,""),_in={};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function APIOutput(settings,agent){const dataObject={name:"APIOutput",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({},component,""),_in={};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function Await(settings,agent){const dataObject={name:"Await",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({},component,""),_in={};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function Classifier(settings,agent){const dataObject={name:"Classifier",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({},component,""),_in={Input:{component,type:"Any",optional:!1,default:!0}};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function ECMASandbox(settings,agent){const dataObject={name:"ECMASandbox",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({},component,""),_in={};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function FTimestamp(settings,agent){const dataObject={name:"FTimestamp",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({},component,""),_in={};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function GenAILLM(settings,agent){const dataObject={name:"GenAILLM",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({Reply:createSafeAccessor({},component,"Reply",{default:!0})},component,""),_in={Input:{component,type:"Any",optional:!1,default:!1},Attachment:{component,type:"Binary",optional:!0,default:!1}};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function HuggingFace(settings,agent){const dataObject={name:"HuggingFace",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({},component,""),_in={};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function ImageGenerator(settings,agent){const dataObject={name:"ImageGenerator",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({},component,""),_in={};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function MCPClient(settings,agent){const dataObject={name:"MCPClient",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({},component,""),_in={};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function ScrapflyWebScrape(settings,agent){const dataObject={name:"ScrapflyWebScrape",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({Results:createSafeAccessor({},component,"Results",{type:"Array",description:"The scraped results",default:!0}),FailedURLs:createSafeAccessor({},component,"FailedURLs",{type:"Array",description:"The URLs that failed to scrape",default:!0})},component,""),_in={URLs:{component,type:"Array",optional:!1,default:!0}};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function ServerlessCode(settings,agent){const dataObject={name:"ServerlessCode",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({},component,""),_in={};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
function TavilyWebSearch(settings,agent){const dataObject={name:"TavilyWebSearch",settings:{...settings}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({Results:createSafeAccessor({},component,"Results",{type:"Array",description:"The web search results",default:!0})},component,""),_in={SearchQuery:{component,type:"Text",optional:!1,default:!0}};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),{out:_out,in:component.inputs.bind(component)}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
const Components={APICall,APIOutput,Await,Classifier,ECMASandbox,FTimestamp,GenAILLM,HuggingFace,ImageGenerator,MCPClient,ScrapflyWebScrape,ServerlessCode,TavilyWebSearch};function normalizeEndpointName(name){return name.replace(/[^a-zA-Z0-9]/g,"_")}function Skill(settings,agent){const{name,process,inputs,...settingsWithoutName}=settings||{},dataObject={name:"APIEndpoint",process,settings:{...settingsWithoutName,endpoint:normalizeEndpointName(settings?.endpoint||settings?.name),status_message:settings?.status_message||"",ai_exposed:settings?.ai_exposed||!0,method:settings?.method||"POST"}},component=new ComponentWrapper(dataObject,agent);agent&&(agent.structure.components.push(component),agent.sync());const _out=createSafeAccessor({headers:createSafeAccessor({},component,"headers"),body:createSafeAccessor({},component,"body"),query:createSafeAccessor({},component,"query")},component,""),_in={};return dataObject.outputs=_out,dataObject.inputs=_in,component.inputs(_in),component.outputPathRewrite=path2=>path2.startsWith("body.")?path2:`body.${path2}`,{out:_out,in:component.inputs.bind(component)}}const Component={...Components,Skill};class DummyAccountHelper{static addAgentToTeam(agentId,teamId){const accountConnector=ConnectorService.getAccountConnector();if(accountConnector instanceof DummyAccount)return accountConnector.data[teamId]||(accountConnector.data[teamId]={users:{},agents:{},settings:{}}),accountConnector.data[teamId].agents[agentId]||(accountConnector.data[teamId].agents[agentId]={settings:{}}),accountConnector.data[teamId].agents[agentId]}static addUserToTeam(userId,teamId){const accountConnector=ConnectorService.getAccountConnector();if(accountConnector instanceof DummyAccount)return accountConnector.data[teamId]||(accountConnector.data[teamId]={users:{},agents:{},settings:{}}),accountConnector.data[teamId].users[userId]||(accountConnector.data[teamId].users[userId]={settings:{}}),accountConnector.data[teamId].users[userId]}}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
const TSchedulerProvider={default:"default",LocalScheduler:"LocalScheduler"};var __defProp$a=Object.defineProperty,__defNormalProp$a=(obj,key,value)=>key in obj?__defProp$a(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$a=(obj,key,value)=>__defNormalProp$a(obj,typeof key!="symbol"?key+"":key,value);function simpleHash(str){let hash=0;for(let i=0;i<str.length;i++){const char=str.charCodeAt(i);hash=(hash<<5)-hash+char,hash=hash&hash}return Math.abs(hash).toString(36)}class SchedulerJobCommand{constructor(schedulerRequest,jobId,jobConfig){__publicField$a(this,"_schedulerRequest"),__publicField$a(this,"_jobId"),__publicField$a(this,"_jobConfig"),__publicField$a(this,"_scheduled",!1),__publicField$a(this,"job"),__publicField$a(this,"_scheduledJob"),this._schedulerRequest=schedulerRequest,this._jobId=jobId,this._jobConfig=jobConfig}async every(interval){this._scheduled=!0,this.job=new Job(this._jobConfig);const schedule=Schedule.every(interval);await this._schedulerRequest.add(this._jobId,this.job,schedule)}async pause(){await this._schedulerRequest.pause(this._jobId)}async resume(){await this._schedulerRequest.resume(this._jobId)}async delete(){await this._schedulerRequest.delete(this._jobId)}then(onfulfilled,onrejected){if(!this._scheduled){const warning=`\u26A0\uFE0F Warning: Job '${this._jobId}' was not scheduled.
Complete the chain with .every('interval') in order to schedule the job.`;console.warn(warning)}return Promise.resolve().then(onfulfilled,onrejected)}}class SchedulerInstance extends SDKObject{constructor(providerId,schedulerSettings={},candidate){super(),__publicField$a(this,"_candidate"),__publicField$a(this,"_agent"),__publicField$a(this,"_schedulerRequest"),__publicField$a(this,"_teamId"),this._agent=candidate instanceof Agent?candidate:void 0,this._candidate=this._agent?AccessCandidate.agent(this._agent.id):candidate||AccessCandidate.team(DEFAULT_TEAM_ID);let connector=ConnectorService.getSchedulerConnector(providerId||"");if(!connector?.valid&&(connector=ConnectorService.init(TConnectorService.Scheduler,providerId,providerId,schedulerSettings),!connector?.valid))throw console.error(`Scheduler connector ${providerId} is not available`),new Error(`Scheduler connector ${providerId} is not available`);const instance=connector.instance(schedulerSettings||connector.settings);this._schedulerRequest=instance.requester(this._candidate)}on(event,listener){return this._schedulerRequest.on(event,listener),this}off(event,listener){return this._schedulerRequest.off(event,listener),this}async add(jobId,job,schedule){try{return await this._schedulerRequest.add(jobId,job,schedule),!0}catch(error){console.error(`\u274C Error adding job ${jobId}:`,error.message||error)}return!1}async list(){try{return await this._schedulerRequest.list()}catch(error){throw console.error("Error listing jobs:",error),error}}async get(jobId){try{return await this._schedulerRequest.get(jobId)}catch(error){throw console.error(`Error getting job ${jobId}:`,error),error}}async pause(jobId){try{await this._schedulerRequest.pause(jobId)}catch(error){throw console.error(`Error pausing job ${jobId}:`,error),error}}async resume(jobId){try{await this._schedulerRequest.resume(jobId)}catch(error){throw console.error(`Error resuming job ${jobId}:`,error),error}}async delete(jobId){try{await this._schedulerRequest.delete(jobId)}catch(error){throw console.error(`Error deleting job ${jobId}:`,error),error}}call(skillName,args,metadata){if(!this._agent)throw new Error("Cannot use .call() without an agent. ");const jobId=`${this._agent.id}-skill-${skillName}`,jobConfig={type:"skill",agentId:this._agent.id,skillName,args,metadata};return new SchedulerJobCommand(this._schedulerRequest,jobId,jobConfig)}prompt(prompt,metadata){if(!this._agent)throw new Error("Cannot use .prompt() without an agent. Please provide an Agent instance when creating the SchedulerInstance: new SchedulerInstance(provider, settings, agent)");const promptHash=simpleHash(prompt),jobId=`${this._agent.id}-prompt-${promptHash}`,jobConfig={type:"prompt",agentId:this._agent.id,prompt,metadata};return new SchedulerJobCommand(this._schedulerRequest,jobId,jobConfig)}trigger(triggerName,metadata){if(!this._agent)throw new Error("Cannot use .trigger() without an agent. Please provide an Agent instance when creating the SchedulerInstance: new SchedulerInstance(provider, settings, agent)");const jobId=`${this._agent.id}-trigger-${triggerName}`,jobConfig={type:"trigger",agentId:this._agent.id,triggerName,metadata};return new SchedulerJobCommand(this._schedulerRequest,jobId,jobConfig)}}const console$3=SDKLog,HELP={SRE:{SECURITY_MODEL:""},SDK:{AGENT_STORAGE_ACCESS:"",AGENT_VECTORDB_ACCESS:"",CHAT_PERSISTENCE:""}};function showHelp(url,message="Learn more:"){url&&console$3.log(`${message} ${url}
`)}//!!! DO NOT EDIT THIS FILE, IT IS AUTO-GENERATED !!!//
const TVectorDBProvider={default:"default",Milvus:"Milvus",Pinecone:"Pinecone",RAMVec:"RAMVec"};var __defProp$9=Object.defineProperty,__defNormalProp$9=(obj,key,value)=>key in obj?__defProp$9(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$9=(obj,key,value)=>__defNormalProp$9(obj,typeof key!="symbol"?key+"":key,value);const console$2=SDKLog;class VectorDBInstance extends SDKObject{constructor(providerId,VectorDBSettings,candidate){super(),this.providerId=providerId,this.VectorDBSettings=VectorDBSettings,__publicField$9(this,"_candidate"),__publicField$9(this,"_VectorDBRequest"),__publicField$9(this,"_namespace"),__publicField$9(this,"_teamId"),this._candidate=candidate||AccessCandidate.team(DEFAULT_TEAM_ID)}async init(){if(await super.init(),this.providerId===TVectorDBProvider.default){let connector2=ConnectorService.getVectorDBConnector();this._VectorDBRequest=connector2.requester(this._candidate),this._namespace=this.VectorDBSettings.namespace;return}let connector=ConnectorService.getVectorDBConnector(this.providerId);if(!connector?.valid&&(connector=ConnectorService.init(TConnectorService.VectorDB,this.providerId,this.providerId,{}),!connector.valid))throw console$2.error(`VectorDB connector ${this.providerId} is not available`),new Error(`VectorDB connector ${this.providerId} is not available`);const instance=connector.instance(this.VectorDBSettings);this._VectorDBRequest=instance.requester(this._candidate),this._namespace=this.VectorDBSettings.namespace}async namespaceExists(){return await this.ready,await this._VectorDBRequest.namespaceExists(this._namespace)}async ensureNamespaceExists(){await this.ready,await this._VectorDBRequest.namespaceExists(this._namespace)||await this._VectorDBRequest.createNamespace(this._namespace)}_normalizeName(name){return name.toLowerCase().replace(/[^a-z0-9]/g,"_")}async insertDoc(name,data,options){await this.ready,await this.ensureNamespaceExists();const metadata=options?.metadata||{},chunkSize=options?.chunkSize,chunkOverlap=options?.chunkOverlap,optionsKeys=Object.keys(options||{}),validKeys=["metadata","chunkSize","chunkOverlap","returnFullVectorInfo"],invalidKeys=optionsKeys.filter(key=>!validKeys.includes(key));if(invalidKeys.length>0&&console$2.warn(`Invalid options for insertDoc() call : { ${invalidKeys.join(", ")} }
Did you mean to use metadata? e.g. { metadata: { ${invalidKeys.join(", ")} } }`),typeof data=="string")return await this._VectorDBRequest.createDatasource(this._namespace,{text:data,id:this._normalizeName(name),label:name,metadata,chunkSize,chunkOverlap,returnFullVectorInfo:options?.returnFullVectorInfo});{const doc=data,promises=[];for(let page of doc.pages){let rawPageText="";for(let content of page.content)content.text&&(rawPageText+=content.text+" ");promises.push(this._VectorDBRequest.createDatasource(this._namespace,{text:rawPageText,id:this._normalizeName(name),label:name,metadata:{...metadata,pageNumber:page.metadata?.pageNumber,docTitle:doc.title,author:doc.metadata?.author},chunkSize,chunkOverlap,returnFullVectorInfo:options?.returnFullVectorInfo}))}return await Promise.all(promises)}}async updateDoc(name,data,options){return await this.ready,await this.ensureNamespaceExists(),await this.insertDoc(name,data,options)}async deleteDoc(name){return await this.ready,await this.namespaceExists()?(await this._VectorDBRequest.deleteDatasource(this._namespace,this._normalizeName(name)),!0):!1}async search(query,options){return await this.ready,await this.namespaceExists()?(await this._VectorDBRequest.search(this._namespace,query,{topK:options?.topK||10,includeMetadata:!0})).map(result=>({embedding:options?.includeEmbeddings?result.values:void 0,text:result?.text,metadata:typeof result.metadata=="string"?JSON.parse(result.metadata):result.metadata})):[]}async purge(){await this.ready,await this.namespaceExists()&&await this._VectorDBRequest.deleteNamespace(this._namespace)}}var __defProp$8=Object.defineProperty,__defNormalProp$8=(obj,key,value)=>key in obj?__defProp$8(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$8=(obj,key,value)=>__defNormalProp$8(obj,typeof key!="symbol"?key+"":key,value);class Team{constructor(id){this.id=id,__publicField$8(this,"_storageProviders"),__publicField$8(this,"_vectorDBProviders"),__publicField$8(this,"_schedulerProviders")}addAgent(settings){return settings.teamId=this.id,new Agent(settings)}get storage(){if(!this._storageProviders){this._storageProviders={};for(const provider of Object.values(TStorageProvider))this._storageProviders[provider]=storageSettings=>new StorageInstance(provider,storageSettings,AccessCandidate.team(this.id))}return this._storageProviders}get vectorDB(){if(!this._vectorDBProviders){this._vectorDBProviders={};for(const provider of Object.values(TVectorDBProvider))this._vectorDBProviders[provider]=(namespace,vectorDBSettings)=>new VectorDBInstance(provider,{...vectorDBSettings,namespace},AccessCandidate.team(this.id))}return this._vectorDBProviders}get scheduler(){if(!this._schedulerProviders){this._schedulerProviders={};for(const provider of Object.values(TSchedulerProvider))this._schedulerProviders[provider]=schedulerSettings=>new SchedulerInstance(provider,schedulerSettings,AccessCandidate.team(this.id))}return this._schedulerProviders}}function adaptModelParams(modelSettings,fallbackProvider,defaultSettings){const{model,provider,baseURL,inputTokens,outputTokens,interface:interfaceType,features,...params}=modelSettings,modelObject={provider:provider||fallbackProvider,modelId:model,model,interface:interfaceType,features:[...features||[],...defaultSettings?.features||[]],baseURL,tags:["sdk",...defaultSettings?.tags||[]],tokens:inputTokens||defaultSettings?.keyOptions?.tokens||defaultSettings?.tokens,completionTokens:outputTokens||defaultSettings?.keyOptions?.completionTokens||defaultSettings?.completionTokens,credentials:modelSettings?.credentials||defaultSettings?.credentials};return modelObject.params=params,typeof modelObject?.params?.apiKey=="string"&&(modelObject.credentials={apiKey:modelObject?.params?.apiKey},delete modelObject?.params?.apiKey),(!modelObject.credentials||modelObject?.credentials?.length===0)&&(modelObject.credentials=["vault"]),{model:modelObject}}const Model={};for(const provider of Object.keys(TLLMProvider))Model[provider]=(modelIdOrParams,modelParams)=>typeof modelIdOrParams=="string"?adaptModelParams({model:modelIdOrParams,...modelParams},TLLMProvider[provider]).model:adaptModelParams(modelIdOrParams,TLLMProvider[provider]).model;function findClosestModelInfo(models,modelId){if(models[modelId])return models[modelId];const closestModelId=nGramSearch(modelId,Object.keys(models));if(closestModelId){const modelInfo=JSON.parse(JSON.stringify(models[closestModelId]));return modelInfo.enabled=!0,modelInfo.modelId=modelId,modelInfo.credentials=["internal","vault"],models[modelId]=modelInfo,modelInfo}return null}var __defProp$7=Object.defineProperty,__defNormalProp$7=(obj,key,value)=>key in obj?__defProp$7(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$7=(obj,key,value)=>__defNormalProp$7(obj,key+"",value);class LLMCommand{constructor(_llm,_params,_options){this._llm=_llm,this._params=_params,this._options=_options}then(resolve,reject){return this.run().then(resolve,reject)}async getFiles(){let files=[];return this._options?.files&&(files=await Promise.all(this._options.files.map(async file=>{if(isFile(file)){const buffer=await fs.promises.readFile(file,null),binaryInput=BinaryInput.from(buffer);return await binaryInput.ready(),binaryInput}else return BinaryInput.from(file)}))),files.length>0?files:void 0}async run(){await this._llm.ready;let files=await this.getFiles();const params={...this._params,...this._llm.modelSettings,files},result=await this._llm.requester.request(params);return result.finishReason!=="stop"&&result.finishReason!=="end_turn"&&this._llm.emit("error",new Error("The model stopped before completing the response, this is usually due to output token limit reached.")),result?.content??""}async stream(){await this._llm.ready;const files=await this.getFiles(),params={...this._params,...this._llm.modelSettings,files};return await this._llm.requester.streamRequest(params)}}class LLMInstance extends SDKObject{constructor(_providerId,_modelSettings,_candidate2){super(),this._providerId=_providerId,this._modelSettings=_modelSettings,this._candidate=_candidate2,__publicField$7(this,"_llmRequester")}get modelSettings(){return this._modelSettings}get requester(){return this._llmRequester}async init(){await super.init(!1),this._candidate=this._candidate||AccessCandidate.team(DEFAULT_TEAM_ID);const models=await ConnectorService.getModelsProviderConnector().requester(this._candidate).getModels(),model=this._modelSettings,builtInModelInfo=findClosestModelInfo(models,model.modelId||model.model),llmConnector=ConnectorService.getLLMConnector(this._providerId);this._llmRequester=llmConnector.user(this._candidate),this._modelSettings=adaptModelParams(this._modelSettings,this._providerId,builtInModelInfo),this.initSignal()}prompt(prompt,options){const messages=[],behavior=options?.behavior||this._modelSettings?.behavior;return behavior&&messages.push({role:"system",content:behavior}),messages.push({role:"user",content:prompt}),new LLMCommand(this,{...this._modelSettings,messages},options)}chat(options){const model=this._modelSettings.model;typeof options=="string"&&(options={id:options,persist:!0});const chatOptions={...options,candidate:this._candidate};return chatOptions.model||(chatOptions.model=model),new Chat(chatOptions,void 0,{baseUrl:chatOptions.baseUrl})}}var Scope=(Scope2=>(Scope2.AGENT="agent",Scope2.TEAM="team",Scope2))(Scope||{}),__defProp$6=Object.defineProperty,__defNormalProp$6=(obj,key,value)=>key in obj?__defProp$6(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$6=(obj,key,value)=>__defNormalProp$6(obj,typeof key!="symbol"?key+"":key,value),MCPTransport=(MCPTransport2=>(MCPTransport2.STDIO="stdio",MCPTransport2.SSE="sse",MCPTransport2))(MCPTransport||{});const DEFAULT_MCP_PORT=3388;class MCP{constructor(agent){this.agent=agent,__publicField$6(this,"clientTransports",new Map),__publicField$6(this,"_app"),__publicField$6(this,"_port"),__publicField$6(this,"_server"),__publicField$6(this,"getMCPServer",async(agentSource,transport,res)=>{let agentData;if(typeof agentSource=="string"){if(!fs__default.existsSync(agentSource))throw new Error(`File ${agentSource} does not exist`);agentData=JSON.parse(fs__default.readFileSync(agentSource,"utf8"))}else agentData=agentSource;const formattedAgentData={data:agentData},openAPISpec=await ConnectorService.getAgentDataConnector().getOpenAPIJSON(formattedAgentData,"http://localhost/",agentData.version,!0).catch(error=>(console.error("Failed to get OpenAPI JSON:",error),null));this._server=new Server({name:openAPISpec.info.title,version:openAPISpec.info.version},{capabilities:{tools:{}}});const tools=Object.entries(openAPISpec.paths).map(([path2,methods])=>{const method=Object.keys(methods)[0],endpoint=path2.split("/api/")[1],operation=methods[method],schema=this.extractMCPToolSchema(operation,method),properties=schema?.properties||{};for(const property in properties)properties[property].type==="array"&&(properties[property]={type:"array",items:{type:["string","number","boolean","object","array"]}});return{name:endpoint,description:operation.summary||`Endpoint that handles ${method.toUpperCase()} requests to ${endpoint}. ${schema?.description||""}`,inputSchema:{type:"object",properties,required:schema?.required||[]}}});if(this._server.setRequestHandler(ListToolsRequestSchema,async()=>({tools})),this._server.setRequestHandler(CallToolRequestSchema,async request=>{try{const{name,arguments:args}=request.params,result=await this.agent.call(name,args);return{content:[{type:"text",text:JSON.stringify(result)}],isError:!1}}catch(error){return{content:[{type:"text",text:`Error processing request: ${error.message}`}],isError:!0}}}),transport==="stdio"){const transport2=new StdioServerTransport;return await this._server.connect(transport2),this._server}if(transport==="sse"){const transport2=new SSEServerTransport("/message",res);return await this._server.connect(transport2),this.clientTransports.set(transport2.sessionId,{transport:transport2,server:this._server}),this._server}throw new Error(`Invalid MCP server transport: ${transport}`)})}async start(settings){if(settings.transport==="stdio")return await this.startStdioServer();if(settings.transport==="sse")return await this.starSSEpServer(settings.port)}async startStdioServer(){const agentData=this.agent.data;return await this.getMCPServer(agentData,"stdio",null),"stdio"}async starSSEpServer(port){const agentData=this.agent.data;return this._app=express(),this._app.use(express.json()),this._app.use(express.urlencoded({extended:!0})),this._app.get("/mcp",async(req,res)=>{await this.getMCPServer(agentData,"sse",res)}),this._app.post("/message",async(req,res)=>{const sessionId=req.query.sessionId,transport=this.clientTransports.get(sessionId)?.transport;if(!transport)return res.status(404).send({error:"Transport not found"});await transport.handlePostMessage(req,res,req.body)}),this._port=port||DEFAULT_MCP_PORT,new Promise(resolve=>{this._app.listen(this._port,()=>{resolve(`http://localhost:${this._port}/mcp`)})})}stop(){this._server.close()}extractMCPToolSchema(jsonSpec,method){if(method.toLowerCase()==="get"){const schema2=jsonSpec?.parameters;if(!schema2)return{};const properties={};let required=[];return schema2.forEach(param=>{param.in==="query"&&(properties[param.name]=param.schema,param.required&&required.push(param.name))}),required=[...new Set(required)],{type:"object",properties,required}}return jsonSpec?.requestBody?.content?.["application/json"]?.schema}}var __typeError$1=msg=>{throw TypeError(msg)},__accessCheck$1=(obj,member,msg)=>member.has(obj)||__typeError$1("Cannot "+msg),__privateGet$1=(obj,member,getter)=>(__accessCheck$1(obj,member,"read from private field"),getter?getter.call(obj):member.get(obj)),__privateAdd$1=(obj,member,value)=>member.has(obj)?__typeError$1("Cannot add the same private member more than once"):member instanceof WeakSet?member.add(obj):member.set(obj,value),__privateSet$1=(obj,member,value,setter)=>(__accessCheck$1(obj,member,"write to private field"),member.set(obj,value),value),_candidate,_vaultRequester;class VaultInstance extends SDKObject{constructor(candidate){super(),__privateAdd$1(this,_candidate),__privateAdd$1(this,_vaultRequester),__privateSet$1(this,_candidate,candidate||AccessCandidate.team("default"))}async init(){SRE.initializing||SRE.init({}),await SRE.ready();const vaultConnector=ConnectorService.getVaultConnector();__privateSet$1(this,_vaultRequester,vaultConnector.requester(__privateGet$1(this,_candidate))),this._readyPromise.resolve(!0)}async get(key){return await __privateGet$1(this,_vaultRequester).get(key)}async listKeys(){return await __privateGet$1(this,_vaultRequester).listKeys()}}_candidate=new WeakMap,_vaultRequester=new WeakMap;const _planner_prompt=`
=========================
Modus Operandi:
=========================
You are operating in planner mode, designed to handle complex tasks systematically and transparently.
## Core Planning Principles
When you receive a complex or multi-step task, you MUST:
1. **Plan first, act second**: Always create a plan before taking any action or calling tools, in this step you should break down the task into clear, actionable steps
2. **Stay focused**: Stick to the user's request without extrapolating unnecessarily
3. **Fill knowledge gaps**: If you lack information needed to complete a step, explicitly add a step to search for it or ask the user
## Planning Workflow
### Creating Plans
- Prepare your plan within <planning></planning> tags
- Use _sre_Plan_Tasks to formally track the steps that you planned
- Ensure each step is specific and contributes directly to achieving the user's goal
- *Do NOT* reveal the plan details to the user in your response, keep it inside <planning></planning> tags
### Managing Tasks
- **Breaking down complexity**: When processing a task that contains multiple steps, decompose it further using _sre_AddSubTasks
- **Maintaining status**: Update task and subtask status before and after *every* action (tool calls, responses, questions, etc.) using _sre_UpdateTasks
- **Marking completion**: After writing a response that completes a task, call _sre_UpdateTasks to mark that task as "completed"
- **Resetting**: If you need to start a completely new plan, call _sre_ClearTasks to clear existing tasks
### Verification
Once you finish answering the user, *ALWAYS* call _sre_TasksCompleted to:
- Update the plan status
- Verify that no steps were missed
- Ensure the user's request has been fully addressed
## Communication Guidelines
### Transparency
- **Express your reasoning**: Always share your thought process with the user inside <thinking> tags
- **Use thinking tags**: Wrap internal reasoning and any informations about the plan, the tasks and the tools that starts with _sre_* in <thinking></thinking> tags on separate lines
- **Announce actions**: Inform the user of your next step after every tool call that is not part of the _sre_* tools
- **Iterate openly**: You can include multiple <thinking> blocks in a single response to question previous answers or explore alternative approaches when stuck
### Typical pattern after a user question:
\`\`\`
<thinking>
The user asked about .... so I need to ....
</thinking>
I will help you with that by ...
<planning>
- Task 1: ...
- Task 2: ...
- Task 3: ...
</planning>
<thinking>
Before I start, I need to plan the tasks first
</thinking>
(call _sre_Plan_Tasks)
<thinking>
Now I need to ... for that I will ...
</thinking>
Ok, now I need to search for the information ...
(e.g call search tool if needed)
(e.g call _sre_UpdateTasks to update the task status if needed)
Great, now I need to address ...
<thinking>
humm it seems that this task is more complex than I thought, I need to break it down into smaller tasks
</thinking>
(call _sre_AddSubTasks)
(e.g call tools if needed)
(e.g call _sre_UpdateTasks to update the task status if needed)
<thinking>
I have now everything I need to answer the user's question, let me write the answer ...
</thinking>
(...write your answer...)
(*Never* say something like "Now I'll update the tasks" in a separate line, this kind of statement should be inside <thinking> tags)
(call _sre_TasksCompleted to verify that no steps were missed)
\`\`\`
### Tag Usage Rules
- Special tags like <thinking> and <planning> must NOT be nested
- Each tag must be properly closed before opening another tag of the same typ