@whoz-oss/coday-server 0.32.0 → 0.32.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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/server.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whoz-oss/coday-server",
3
- "version": "0.32.0",
3
+ "version": "0.32.1",
4
4
  "repository": "https://github.com/whoz-oss/coday",
5
5
  "type": "module",
6
6
  "main": "server/server.js",
package/server.js CHANGED
@@ -927,7 +927,7 @@ Do not memorize partial knowledge, single-use information, or minor implementati
927
927
  ${n}`)}return i}createResourceTool(t,i,n){let a=`mcp__${t.id}__${n.name}`,s=async l=>{try{let u=n.uriTemplate.replace(/\{([^}]+)\}/g,(p,d)=>encodeURIComponent(l[d]||"")),f=await i.readResource({uri:u});if(!f||!f.contents)throw new Error(`No content returned from resource ${n.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 this.interactor.error(`Error retrieving resource ${n.name}: ${u}`),new Error(`Failed to retrieve resource: ${u}`)}},o={},c=n.uriTemplate.match(/\{([^}]+)\}/g)||[];for(let l of c){let u=l.slice(1,-1);o[u]={type:"string",description:`Parameter ${u} for resource ${n.name}`}}return{type:"function",function:{name:a,description:n.description||`Resource from MCP server ${t.name}`,parameters:{type:"object",properties:o},parse:JSON.parse,function:s}}}createFunctionTool(t,i,n){let a=`${t.name}__${n.name}`,s=async o=>{this.serverConfig.debug&&this.interactor.debug(`${a} input:
928
928
 
929
929
  \`\`\`json
930
- `+JSON.stringify(o)+"\n```");try{let c=await i.callTool({name:n.name,arguments:o});return this.serverConfig.debug&&this.interactor.debug("MCP tool output:\n\n```json\n"+JSON.stringify(c)+"\n```"),c&&"content"in c&&Array.isArray(c.content)?c.content.map(l=>l.type==="text"?l.text:l.type==="resource"?l.resource:l):c&&"toolResult"in c?c.toolResult:c}catch(c){throw this.interactor.error(`Error calling function ${n.name}: ${c}`),new Error(`Failed to call function: ${c}`)}};return{type:"function",function:{name:a,description:n.description||`Function from MCP server ${t.name}`,parameters:{type:"object",properties:n.inputSchema?.properties||{}},parse:JSON.parse,function:s}}}};var oy=class{constructor(e,t,i){this.interactor=e;let n=t.mcp.getMergedConfiguration().servers;this.toolFactories=[new Kv(e,i),new Yv(e,i),new Qv(e),new bb(e,t.integration),new yb(e),new xb(e,t.integration),new wb(e,t.memory),new Sb(e,t.integration),new vb(e,t.integration),...n.filter(a=>!a.name.includes("atlassian")).map(a=>new sy(e,a))]}toolFactories;tools=[];async kill(){console.log("Closing all toolFactories"),await Promise.all(this.toolFactories.map(e=>e.kill())),console.log("Closed all toolFactories")}async getTools(e){let{context:t,integrations:i,agentName:n}=e,a=this.toolFactories.filter(s=>!i||i.has(s.name));try{let s=await Promise.all(a.map(async o=>{try{return await o.getTools(t,i?.get(o.name)??[],n??"default")}catch(c){return this.interactor.debug(`Error building tools from ${o.name} for agent ${n}: ${c}`),[]}}));return this.tools=s.flat(),this.tools}catch(s){return this.interactor.debug(`Unexpected error building tools for agent ${n}: ${s}`),[]}}};var cy=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 i,n=t.function.function,a=JSON.parse(e.args),s=Array.isArray(a)?a:[a];if(i=await n(...s),i||(i=`Tool function ${e.name} finished without error.`),typeof i!="string"){if(i&&typeof i=="object"&&"type"in i&&(i.type==="text"||i.type==="image"))return e.buildResponse(i);i=JSON.stringify(i)}return e.buildResponse(i)}};var ly=class{constructor(e,t,i,n,a=[]){this.interactor=e;this.aiClientProvider=t;this.services=i;this.projectPath=n;this.commandLineAgentFolders=a;this.services.project.selectedProject$.subscribe(()=>{this.agentCache.clear(),this.agentDefinitions=[]}),this.toolbox=new oy(this.interactor,i,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(a=>this.interactor.debug("\u{1F6E0}\uFE0F ...completed pre-initializing tools in parallel")).catch(a=>this.interactor.debug(`Pre-initialization warning: ${a.message}`));try{let a=performance.now();if(e.project.agents?.length)for(let p of e.project.agents)this.addDefinition(p,this.projectPath);let s=performance.now()-a;this.interactor.debug(`\u{1F4CB} Loaded agent definitions from coday.yml: ${s.toFixed(2)}ms (${e.project.agents?.length||0} agents)`);let o=performance.now(),c=this.services.project.selectedProject;if(c?.config.agents?.length)for(let p of c.config.agents)this.addDefinition(p,this.projectPath);let l=performance.now()-o;this.interactor.debug(`\u2699\uFE0F Loaded agent definitions from project local config: ${l.toFixed(2)}ms (${c?.config.agents?.length||0} agents)`);let u=performance.now();await this.loadFromFiles(e);let f=performance.now()-u;this.interactor.debug(`\u{1F4C1} Loaded agent definitions from files: ${f.toFixed(2)}ms`),this.agentDefinitions.length===0&&(this.addDefinition(Q9,this.projectPath),this.interactor.debug("\u{1F504} No agent definitions found, using Coday as backup"))}catch(a){throw this.interactor.error(`Failed to initialize agent definitions: ${a}`),a}let i=performance.now()-t;this.interactor.debug(`\u{1F3AF} Total agent definition loading time: ${i.toFixed(2)}ms`);let n=this.listAgentSummaries().map(a=>` - ${a.name} : ${a.description}`);n.length>1&&this.interactor.displayText(`Loaded agents (callable with '@[agent name]'):
930
+ `+JSON.stringify(o)+"\n```");try{let c=await i.callTool({name:n.name,arguments:o});return this.serverConfig.debug&&this.interactor.debug("MCP tool output:\n\n```json\n"+JSON.stringify(c)+"\n```"),c&&"content"in c&&Array.isArray(c.content)?c.content.map(l=>l.type==="text"?l.text:l.type==="resource"?l.resource:l):c&&"toolResult"in c?c.toolResult:c}catch(c){throw this.interactor.error(`Error calling function ${n.name}: ${c}`),new Error(`Failed to call function: ${c}`)}};return{type:"function",function:{name:a,description:n.description||`Function from MCP server ${t.name}`,parameters:{type:"object",properties:n.inputSchema?.properties||{}},parse:JSON.parse,function:s}}}};var oy=class{constructor(e,t,i){this.interactor=e;let n=t.mcp.getMergedConfiguration().servers;this.toolFactories=[new Kv(e,i),new Yv(e,i),new Qv(e),new bb(e,t.integration),new yb(e),new xb(e,t.integration),new wb(e,t.memory),new Sb(e,t.integration),new vb(e,t.integration),...n.map(a=>new sy(e,a))]}toolFactories;tools=[];async kill(){console.log("Closing all toolFactories"),await Promise.all(this.toolFactories.map(e=>e.kill())),console.log("Closed all toolFactories")}async getTools(e){let{context:t,integrations:i,agentName:n}=e,a=this.toolFactories.filter(s=>!i||i.has(s.name));try{let s=await Promise.all(a.map(async o=>{try{return await o.getTools(t,i?.get(o.name)??[],n??"default")}catch(c){return this.interactor.debug(`Error building tools from ${o.name} for agent ${n}: ${c}`),[]}}));return this.tools=s.flat(),this.tools}catch(s){return this.interactor.debug(`Unexpected error building tools for agent ${n}: ${s}`),[]}}};var cy=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 i,n=t.function.function,a=JSON.parse(e.args),s=Array.isArray(a)?a:[a];if(i=await n(...s),i||(i=`Tool function ${e.name} finished without error.`),typeof i!="string"){if(i&&typeof i=="object"&&"type"in i&&(i.type==="text"||i.type==="image"))return e.buildResponse(i);i=JSON.stringify(i)}return e.buildResponse(i)}};var ly=class{constructor(e,t,i,n,a=[]){this.interactor=e;this.aiClientProvider=t;this.services=i;this.projectPath=n;this.commandLineAgentFolders=a;this.services.project.selectedProject$.subscribe(()=>{this.agentCache.clear(),this.agentDefinitions=[]}),this.toolbox=new oy(this.interactor,i,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(a=>this.interactor.debug("\u{1F6E0}\uFE0F ...completed pre-initializing tools in parallel")).catch(a=>this.interactor.debug(`Pre-initialization warning: ${a.message}`));try{let a=performance.now();if(e.project.agents?.length)for(let p of e.project.agents)this.addDefinition(p,this.projectPath);let s=performance.now()-a;this.interactor.debug(`\u{1F4CB} Loaded agent definitions from coday.yml: ${s.toFixed(2)}ms (${e.project.agents?.length||0} agents)`);let o=performance.now(),c=this.services.project.selectedProject;if(c?.config.agents?.length)for(let p of c.config.agents)this.addDefinition(p,this.projectPath);let l=performance.now()-o;this.interactor.debug(`\u2699\uFE0F Loaded agent definitions from project local config: ${l.toFixed(2)}ms (${c?.config.agents?.length||0} agents)`);let u=performance.now();await this.loadFromFiles(e);let f=performance.now()-u;this.interactor.debug(`\u{1F4C1} Loaded agent definitions from files: ${f.toFixed(2)}ms`),this.agentDefinitions.length===0&&(this.addDefinition(Q9,this.projectPath),this.interactor.debug("\u{1F504} No agent definitions found, using Coday as backup"))}catch(a){throw this.interactor.error(`Failed to initialize agent definitions: ${a}`),a}let i=performance.now()-t;this.interactor.debug(`\u{1F3AF} Total agent definition loading time: ${i.toFixed(2)}ms`);let n=this.listAgentSummaries().map(a=>` - ${a.name} : ${a.description}`);n.length>1&&this.interactor.displayText(`Loaded agents (callable with '@[agent name]'):
931
931
  ${n.join(`
932
932
  `)}`)}async findByName(e,t){await this.initialize(t);let i=e.toLowerCase();if(this.agentCache.has(i))return this.agentCache.get(i);let n=this.agentDefinitions.find(a=>a.definition.name.toLowerCase()===i);if(n){let a=await this.tryAddAgent(n,t);if(a)return this.agentCache.set(i,a),a}}async findAgentByNameStart(e,t){if(!e)return;await this.initialize(t);let i=await this.findAgentsByNameStart(e?.toLowerCase()||"",t);if(i.length===0)return;if(i.length===1)return i[0];let n=i.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(n,`Multiple agents match '${e}', please select one:`);return i.find(s=>s.name===a)}catch{this.interactor.error("Selection cancelled");return}}async findAgentsByNameStart(e,t){await this.initialize(t);let i=e.toLowerCase(),n=this.agentDefinitions.filter(s=>s.definition.name.toLowerCase().startsWith(i)),a=[];for(let s of n){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(i=>i.definition.name===e.name)||this.agentDefinitions.push({definition:{...Q9,...e},basePath:t})}async loadFromFiles(e){let t=[],i=[],n=this.services.project.selectedProject;n&&t.push(fu.join(n.configPath,"agents"));let a=this.services.project.selectedProject?.config.path;if(a){let u=await Df({text:"coday.yaml",root:a});if(u.length>0){let f=fu.dirname(u[0]);t.push(fu.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{i.push(...(await uy.readdir(u)).filter(f=>f.endsWith(".yml")||f.endsWith(".yaml")).map(f=>fu.join(u,f)))}catch(f){f.code==="EPERM"?console.error(`Permission denied to access ${u}. This is common for protected directories.
933
933
  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 ${i.length} files)`);let c=performance.now();await Promise.all(i.map(async u=>{try{let f=await uy.readFile(u,"utf-8"),p=wie.parse(f),d=fu.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 i={...Q9,...e.definition},n=performance.now();try{if(i.openaiAssistantId&&(i.aiProvider="openai"),!this.aiClientProvider||!this.toolbox){console.error(`Cannot create agent ${i.name}: dependencies not set. Call setDependencies first.`);return}this.interactor.debug(`\u{1F3D7}\uFE0F Creating agent '${i.name}' on-demand...`);let a=performance.now(),s=this.aiClientProvider.getClient(i.aiProvider,i.modelName);if(!s){this.interactor.error(`Cannot create agent ${i.name}: AI client creation failed`);return}let o=performance.now()-a,c=e.basePath,l=performance.now(),u=await Q7(i,this.interactor,c,i.name),f=performance.now()-l;i.instructions=`${i.instructions}