@whoz-oss/coday-server 0.57.0 → 0.57.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/package.json +1 -1
- package/server.js +1 -1
package/package.json
CHANGED
package/server.js
CHANGED
|
@@ -1250,7 +1250,7 @@ ${o}`;return i.debug(`\u2713 Successfully converted Confluence page to Markdown,
|
|
|
1250
1250
|
${i}`)}return n}createResourceTool(t,n,i){let a=`mcp__${t.id}__${i.name}`,s=async l=>{try{this.lastUsed=Date.now();let u=i.uriTemplate.replace(/\{([^}]+)\}/g,(p,d)=>encodeURIComponent(l[d]||"")),f=await n.readResource({uri:u});if(!f||!f.contents)throw new Error(`No content returned from resource ${i.name}`);return f.contents.map(p=>"text"in p?{uri:p.uri,text:p.text,mimeType:p.mimeType||"text/plain"}:"blob"in p?{uri:p.uri,blob:p.blob,mimeType:p.mimeType||"application/octet-stream"}:p)}catch(u){throw console.error(`[MCP] Error retrieving resource ${i.name}: ${u}`),new Error(`Failed to retrieve resource: ${u}`)}},o={},c=i.uriTemplate.match(/\{([^}]+)\}/g)||[];for(let l of c){let u=l.slice(1,-1);o[u]={type:"string",description:`Parameter ${u} for resource ${i.name}`}}return{type:"function",function:{name:a,description:i.description||`Resource from MCP server ${t.name}`,parameters:{type:"object",properties:o},parse:JSON.parse,function:s}}}createFunctionTool(t,n,i){let a=`${t.name}__${i.name}`,s=async o=>{this.lastUsed=Date.now(),this.serverConfig.debug&&console.debug(`[MCP] ${a} input:
|
|
1251
1251
|
|
|
1252
1252
|
\`\`\`json
|
|
1253
|
-
`+JSON.stringify(o)+"\n```");try{let c=await n.callTool({name:i.name,arguments:o});if(this.serverConfig.debug&&console.debug("[MCP] Tool output:\n\n```json\n"+JSON.stringify(c)+"\n```"),c&&"content"in c&&Array.isArray(c.content)){let l=c.content.map(u=>u.type==="text"?u.text:u.type==="image"&&u.data?{type:"image",content:u.data,mimeType:u.mimeType||"image/png",...u.width&&{width:u.width},...u.height&&{height:u.height}}:u.type==="resource"?u.resource:u);return l.length===1?l[0]:l}else if(c&&"toolResult"in c)return c.toolResult;return c}catch(c){throw console.error(`[MCP] Error calling function ${i.name}: ${c}`),new Error(`Failed to call function: ${c}`)}};return{type:"function",function:{name:a,description:i.description||`Function from MCP server ${t.name}`,parameters:{type:"object",properties:i.inputSchema?.properties||{}},parse:JSON.parse,function:s}}}};var ZS=class{constructor(e,t,n){this.interactor=e;this.services=t;this.mcpConfigs=t.mcp.getMergedConfiguration().servers,this.toolFactories=[new xw(e,n),new ww(e,n),new Sw(e),new Uw(e,t.integration),new Hw(e),new Ww(e,t.integration),new Gw(e,t.memory),new O_(e,t.integration),new I_(e,t.integration),new zw(e,t.integration),new R_(e,t.integration)]}toolFactories;mcpConfigs;tools=[];async kill(){console.log("[TOOLBOX] Closing non-MCP tool factories"),await Promise.all(this.toolFactories.map(e=>e.kill())),console.log("[TOOLBOX] Closed non-MCP tool factories")}async getTools(e){let{context:t,integrations:n,agentName:i}=e,a=t.aiThread?.id;a||this.interactor.warn("No thread ID in context, MCP tools will not be available");let s=[];if(a)for(let l of this.mcpConfigs)try{let u=await this.services.mcpPool.getOrCreateFactory(l,a,()=>new JS(l));s.push(u)}catch(u){this.interactor.debug(`Error creating MCP factory for ${l.name}: ${u}`)}let c=[...this.toolFactories,...s].filter(l=>!n||n.has(l.name));try{let l=await Promise.all(c.map(async u=>{try{return await u.getTools(t,n?.get(u.name)??[],i??"default")}catch(f){return this.interactor.debug(`Error building tools from ${u.name} for agent ${i}: ${f}`),[]}}));return this.tools=l.flat(),this.tools}catch(l){return this.interactor.debug(`Unexpected error building tools for agent ${i}: ${l}`),[]}}};var YS=class{constructor(e){this.tools=e;this.charLength=JSON.stringify(e).length}charLength=0;getTools(){return[...this.tools]}async run(e){let t=this.tools.find(o=>o.function.name===e.name);if(!t)throw new Error(`Tool '${e.name}' not found`);let n,i=t.function.function,a=JSON.parse(e.args),s=Array.isArray(a)?a:[a];if(n=await i(...s),n||(n=`Tool function ${e.name} finished without error.`),typeof n!="string"){if(n&&typeof n=="object"&&"type"in n&&(n.type==="text"||n.type==="image"))return e.buildResponse(n);n=JSON.stringify(n)}return e.buildResponse(n)}};var J1=class{constructor(e,t,n,i,a=[]){this.interactor=e;this.aiClientProvider=t;this.services=n;this.projectPath=i;this.commandLineAgentFolders=a;this.services.project.selectedProject$.subscribe(()=>{this.agentCache.clear(),this.agentDefinitions=[]}),this.toolbox=new ZS(this.interactor,n,this)}agentCache=new Map;agentDefinitions=[];toolbox;listAgentSummaries(){return this.agentDefinitions.map(e=>({name:e.definition.name,description:e.definition.description})).sort((e,t)=>e.name.toLowerCase().localeCompare(t.name.toLowerCase()))}async initialize(e){if(this.agentDefinitions.length>0)return;let t=performance.now();this.interactor.debug("\u{1F680} Starting agent initialization..."),this.interactor.debug("\u{1F6E0}\uFE0F Pre-initializing tools in parallel..."),this.toolbox.getTools({context:e,integrations:void 0,agentName:"pre-init"}).then(i=>this.interactor.debug("\u{1F6E0}\uFE0F ...completed pre-initializing tools in parallel")).catch(i=>this.interactor.debug(`Pre-initialization warning: ${i.message}`));try{let i=performance.now();if(e.project.agents?.length)for(let d of e.project.agents)this.addDefinition(d,this.projectPath);let a=performance.now()-i;this.interactor.debug(`\u{1F4CB} Loaded agent definitions from coday.yml: ${a.toFixed(2)}ms (${e.project.agents?.length||0} agents)`);let s=performance.now(),o=this.services.project.selectedProject;if(o?.config.agents?.length)for(let d of o.config.agents)this.addDefinition(d,this.projectPath);let c=performance.now()-s;this.interactor.debug(`\u2699\uFE0F Loaded agent definitions from project local config: ${c.toFixed(2)}ms (${o?.config.agents?.length||0} agents)`);let l=performance.now();await this.loadFromFiles(e);let u=performance.now()-l;this.interactor.debug(`\u{1F4C1} Loaded agent definitions from files: ${u.toFixed(2)}ms`);let f=performance.now();this.generateVirtualAgentsFromModels();let p=performance.now()-f;this.interactor.debug(`\u{1F916} Generated virtual agents from models: ${p.toFixed(2)}ms`)
|
|
1253
|
+
`+JSON.stringify(o)+"\n```");try{let c=await n.callTool({name:i.name,arguments:o});if(this.serverConfig.debug&&console.debug("[MCP] Tool output:\n\n```json\n"+JSON.stringify(c)+"\n```"),c&&"content"in c&&Array.isArray(c.content)){let l=c.content.map(u=>u.type==="text"?u.text:u.type==="image"&&u.data?{type:"image",content:u.data,mimeType:u.mimeType||"image/png",...u.width&&{width:u.width},...u.height&&{height:u.height}}:u.type==="resource"?u.resource:u);return l.length===1?l[0]:l}else if(c&&"toolResult"in c)return c.toolResult;return c}catch(c){throw console.error(`[MCP] Error calling function ${i.name}: ${c}`),new Error(`Failed to call function: ${c}`)}};return{type:"function",function:{name:a,description:i.description||`Function from MCP server ${t.name}`,parameters:{type:"object",properties:i.inputSchema?.properties||{}},parse:JSON.parse,function:s}}}};var ZS=class{constructor(e,t,n){this.interactor=e;this.services=t;this.mcpConfigs=t.mcp.getMergedConfiguration().servers,this.toolFactories=[new xw(e,n),new ww(e,n),new Sw(e),new Uw(e,t.integration),new Hw(e),new Ww(e,t.integration),new Gw(e,t.memory),new O_(e,t.integration),new I_(e,t.integration),new zw(e,t.integration),new R_(e,t.integration)]}toolFactories;mcpConfigs;tools=[];async kill(){console.log("[TOOLBOX] Closing non-MCP tool factories"),await Promise.all(this.toolFactories.map(e=>e.kill())),console.log("[TOOLBOX] Closed non-MCP tool factories")}async getTools(e){let{context:t,integrations:n,agentName:i}=e,a=t.aiThread?.id;a||this.interactor.warn("No thread ID in context, MCP tools will not be available");let s=[];if(a)for(let l of this.mcpConfigs)try{let u=await this.services.mcpPool.getOrCreateFactory(l,a,()=>new JS(l));s.push(u)}catch(u){this.interactor.debug(`Error creating MCP factory for ${l.name}: ${u}`)}let c=[...this.toolFactories,...s].filter(l=>!n||n.has(l.name));try{let l=await Promise.all(c.map(async u=>{try{return await u.getTools(t,n?.get(u.name)??[],i??"default")}catch(f){return this.interactor.debug(`Error building tools from ${u.name} for agent ${i}: ${f}`),[]}}));return this.tools=l.flat(),this.tools}catch(l){return this.interactor.debug(`Unexpected error building tools for agent ${i}: ${l}`),[]}}};var YS=class{constructor(e){this.tools=e;this.charLength=JSON.stringify(e).length}charLength=0;getTools(){return[...this.tools]}async run(e){let t=this.tools.find(o=>o.function.name===e.name);if(!t)throw new Error(`Tool '${e.name}' not found`);let n,i=t.function.function,a=JSON.parse(e.args),s=Array.isArray(a)?a:[a];if(n=await i(...s),n||(n=`Tool function ${e.name} finished without error.`),typeof n!="string"){if(n&&typeof n=="object"&&"type"in n&&(n.type==="text"||n.type==="image"))return e.buildResponse(n);n=JSON.stringify(n)}return e.buildResponse(n)}};var J1=class{constructor(e,t,n,i,a=[]){this.interactor=e;this.aiClientProvider=t;this.services=n;this.projectPath=i;this.commandLineAgentFolders=a;this.services.project.selectedProject$.subscribe(()=>{this.agentCache.clear(),this.agentDefinitions=[]}),this.toolbox=new ZS(this.interactor,n,this)}agentCache=new Map;agentDefinitions=[];toolbox;listAgentSummaries(){return this.agentDefinitions.map(e=>({name:e.definition.name,description:e.definition.description})).sort((e,t)=>e.name.toLowerCase().localeCompare(t.name.toLowerCase()))}async initialize(e){if(this.agentDefinitions.length>0)return;let t=performance.now();this.interactor.debug("\u{1F680} Starting agent initialization..."),this.interactor.debug("\u{1F6E0}\uFE0F Pre-initializing tools in parallel..."),this.toolbox.getTools({context:e,integrations:void 0,agentName:"pre-init"}).then(i=>this.interactor.debug("\u{1F6E0}\uFE0F ...completed pre-initializing tools in parallel")).catch(i=>this.interactor.debug(`Pre-initialization warning: ${i.message}`));try{let i=performance.now();if(e.project.agents?.length)for(let d of e.project.agents)this.addDefinition(d,this.projectPath);let a=performance.now()-i;this.interactor.debug(`\u{1F4CB} Loaded agent definitions from coday.yml: ${a.toFixed(2)}ms (${e.project.agents?.length||0} agents)`);let s=performance.now(),o=this.services.project.selectedProject;if(o?.config.agents?.length)for(let d of o.config.agents)this.addDefinition(d,this.projectPath);let c=performance.now()-s;this.interactor.debug(`\u2699\uFE0F Loaded agent definitions from project local config: ${c.toFixed(2)}ms (${o?.config.agents?.length||0} agents)`);let l=performance.now();await this.loadFromFiles(e);let u=performance.now()-l;this.interactor.debug(`\u{1F4C1} Loaded agent definitions from files: ${u.toFixed(2)}ms`),this.agentDefinitions.length===0&&(this.addDefinition(Fv,this.projectPath),this.interactor.debug("\u{1F504} No agent definitions found, using Coday as backup"));let f=performance.now();this.generateVirtualAgentsFromModels();let p=performance.now()-f;this.interactor.debug(`\u{1F916} Generated virtual agents from models: ${p.toFixed(2)}ms`)}catch(i){throw this.interactor.error(`Failed to initialize agent definitions: ${i}`),i}let n=performance.now()-t;this.interactor.debug(`\u{1F3AF} Total agent definition loading time: ${n.toFixed(2)}ms`)}async findByName(e,t){await this.initialize(t);let n=e.toLowerCase();if(this.agentCache.has(n))return this.agentCache.get(n);let i=this.agentDefinitions.find(a=>a.definition.name.toLowerCase()===n);if(i){let a=await this.tryAddAgent(i,t);if(a)return this.agentCache.set(n,a),a}}async findAgentByNameStart(e,t){if(!e)return;await this.initialize(t);let n=await this.findAgentsByNameStart(e?.toLowerCase()||"",t);if(n.length===0)return;if(n.length===1)return n[0];let i=n.map(a=>a.name);try{if(t.oneshot)throw new Error("Agent ambiguous names not allowed in oneshot context");let a=await this.interactor.chooseOption(i,`Multiple agents match '${e}', please select one:`);return n.find(s=>s.name===a)}catch{this.interactor.error("Selection cancelled");return}}async findAgentsByNameStart(e,t){await this.initialize(t);let n=e.toLowerCase(),i=this.agentDefinitions.filter(s=>s.definition.name.toLowerCase().startsWith(n)),a=[];for(let s of i){let o=s.definition.name.toLowerCase(),c=this.agentCache.get(o);c||(c=await this.tryAddAgent(s,t),c&&this.agentCache.set(o,c)),c&&a.push(c)}return a}getPreferredAgent(){let e=this.services.project.selectedProject?.name;return e?this.services.user.config.projects?.[e]?.defaultAgent:void 0}async kill(){this.aiClientProvider.kill(),await this.toolbox.kill()}addDefinition(e,t=this.projectPath){this.agentDefinitions.find(n=>n.definition.name===e.name)||this.agentDefinitions.push({definition:{...Fv,...e},basePath:t})}generateVirtualAgentsFromModels(){let e=this.aiClientProvider.getAllModels();for(let t of e){let n={name:t.name,description:`Direct access to ${t.name} model (${t.providerName})`,instructions:"",aiProvider:t.providerName,modelName:t.name};this.addDefinition(n,this.projectPath)}this.interactor.debug(`\u{1F916} Generated ${e.length} virtual agents from available models: ${e.map(t=>t.name).join(", ")}`)}async loadFromFiles(e){let t=[],n=[],i=this.services.project.selectedProject;i&&t.push(y0.join(i.configPath,"agents"));let a=this.services.project.selectedProject?.config.path;if(a){let u=await e3({text:"coday.yaml",root:a});if(u.length>0){let f=y0.dirname(u[0]);t.push(y0.join(a,f,"agents"))}e.project.agentFolders?.length&&t.push(...e.project.agentFolders)}t.push(...this.commandLineAgentFolders);let s=performance.now();await Promise.all(t.map(async u=>{try{n.push(...(await XS.readdir(u)).filter(f=>f.endsWith(".yml")||f.endsWith(".yaml")).map(f=>y0.join(u,f)))}catch(f){f.code==="EPERM"?console.error(`Permission denied to access ${u}. This is common for protected directories.
|
|
1254
1254
|
Consider moving your agent files to a less restricted location.`):console.error(`Could not read directory ${u}: ${f.code}`)}}));let o=performance.now()-s;this.interactor.debug(` \u{1F4C2} Scanned agent directories: ${o.toFixed(2)}ms (found ${n.length} files)`);let c=performance.now();await Promise.all(n.map(async u=>{try{let f=await XS.readFile(u,"utf-8"),p=Sme.parse(f),d=y0.dirname(u),h=d.startsWith(this.projectPath)?this.projectPath:d;this.addDefinition(p,h)}catch(f){console.error(f)}}));let l=performance.now()-c;this.interactor.debug(` \u{1F4DD} Parsed agent files: ${l.toFixed(2)}ms`)}async tryAddAgent(e,t){let n={...Fv,...e.definition},i=performance.now();try{if(n.openaiAssistantId&&(n.aiProvider="openai"),!this.aiClientProvider||!this.toolbox){console.error(`Cannot create agent ${n.name}: dependencies not set. Call setDependencies first.`);return}this.interactor.debug(`\u{1F3D7}\uFE0F Creating agent '${n.name}' on-demand...`);let a=performance.now(),s=this.aiClientProvider.getClient(n.aiProvider,n.modelName);if(!s){this.interactor.error(`Cannot create agent ${n.name}: AI client creation failed`);return}let o=performance.now()-a,c=e.basePath,l=performance.now(),u=await Sy(n,this.interactor,c,n.name),f=performance.now()-l;n.instructions=`${n.instructions}
|
|
1255
1255
|
|
|
1256
1256
|
|