@whoz-oss/coday-server 0.121.0 → 0.121.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.121.0",
3
+ "version": "0.121.1",
4
4
  "repository": "https://github.com/whoz-oss/coday",
5
5
  "type": "module",
6
6
  "main": "server/server.js",
package/server.js CHANGED
@@ -960,7 +960,7 @@ The following shows current values at different levels:
960
960
  Note: Your global bio will also be included:
961
961
  "${u}"`)}let c=await this.interactor.promptText(s,o||"");if(c!==null){a?this.services.user.setBio(c):this.services.user.setProjectBio(n,c);let u=a?"USER-level":`PROJECT-level for "${n}"`;c.trim()?this.interactor.displayText(`\u2705 ${u} bio updated successfully`):this.interactor.displayText(`\u2705 ${u} bio cleared`)}return i}};var dE=class extends Ne{constructor(t){super({commandWord:"cost",description:"Configure the cost limit threshold for AI operations"});this.interactor=t}async handle(t,n){let i=n.aiThread?.usage.priceThreshold??E5.priceThreshold,a=await this.interactor.promptText(`Cost limit in dollars (${i.toFixed(2)}):`,i.toString()),o=parseFloat(a.trim());return isNaN(o)||o<=0?(this.interactor.error("Invalid cost limit. Please enter a positive number or 0."),n):(n.aiThread&&(n.aiThread.usage.priceThreshold=o),this.interactor.displayText(`\u2705 Cost limit updated to $${o.toFixed(2)}`),n)}};var hE=class extends Yn{constructor(t,n){super({commandWord:"config",description:"handles config related commands"},t);this.services=n;this.selectProjectHandler=new aE(this.interactor,this.services),this.handlers=[new lE(this.interactor,this.services),new Fk(this.interactor,this.services),new fE(this.interactor,this.services),new zk(this.interactor,this.services),new pE(this.interactor,this.services),new dE(this.interactor)]}selectProjectHandler};var yde={anthropic:"ANTHROPIC_API_KEY",openai:"OPENAI_API_KEY",google:"GEMINI_API_KEY"},Gm=class{constructor(e,t,n,i){this.interactor=e;this.userService=t;this.projectStateService=n;this.logger=i}aiClients=[];aiProviderConfigs;init(e){if(this.aiProviderConfigs)return;let t=e.project.ai||[],n=this.projectStateService.selectedProject?.config?.ai||[],i=this.userService.config.ai||[],a=this.detectProvidersFromEnvironment(),o=new Set([...t.map(l=>l.name.toLowerCase()),...n.map(l=>l.name.toLowerCase()),...i.map(l=>l.name.toLowerCase())]);this.aiProviderConfigs=[];for(let l of[...a,...t,...n,...i]){let f=this.aiProviderConfigs.findIndex(p=>p.name===l.name);if(f===-1)this.aiProviderConfigs.push(l);else{let p=this.aiProviderConfigs[f],d=p.models?[...p.models]:[];(l.models??[]).forEach(h=>{let g=d.findIndex(v=>v.alias===h.alias||v.name===h.name);if(g===-1)d.push(h);else{let v=d[g];d[g]={...v,...h,price:{...v.price,...h.price}}}}),this.aiProviderConfigs[f]={...p,...l,models:d}}}this.aiClients=this.aiProviderConfigs.map(l=>this.createClient(l)).filter(l=>!!l);let s=a.filter(l=>!o.has(l.name.toLowerCase())).map(l=>l.name.toLowerCase()),c=new Set(s),u=`AI providers (models listed as: name (alias)):
962
962
  `+this.aiProviderConfigs.map(l=>{let f=this.aiClients.find(v=>v.name.toLowerCase()===l.name.toLowerCase()),p=!!f,d=p?"\u2705":"\u274C",h=c.has(l.name.toLowerCase())?" (auto-detected)":"",g=` - ${d} ${l.name}${h}`;if(p&&Array.isArray(f.models)&&f.models.length>0){let v=f.models.map(y=>y.alias&&y.alias!==y.name?`${y.name} (${y.alias})`:y.name).join(", ");g+=`, models: ${v}`}return g}).join(`
963
- `);this.interactor.displayText(u)}getClient(e,t){let n=this.aiClients.filter(i=>{let a=!e||i.name.toLowerCase()===e.toLowerCase(),o=!t||i.supportsModel(t.toLowerCase());return a&&o});return n.length?n[0]:void 0}getAllModels(){let e=[];for(let t of this.aiClients)if(t.models)for(let n of t.models)e.push({name:n.name,providerName:t.name});return e}cleanup(){this.aiClients.forEach(e=>e.kill()),this.aiClients=[]}kill(){this.cleanup(),this.aiProviderConfigs=void 0}getApiKey(e){let t=yde[e.name];return(t?process.env[t]??process.env[`${e.name.toUpperCase()}_API_KEY`]:void 0)??e.apiKey}detectProvidersFromEnvironment(){let e=[];for(let[t,n]of Object.entries(yde)){let i=process.env[n];if(i){let a={name:t,apiKey:i};e.push(a),this.interactor.debug(`\u{1F50D} Auto-detected ${t} provider from ${n} environment variable`)}}return e}createClient(e){let t=this.getApiKey(e);if(!t){this.interactor.displayText(`\u2139\uFE0F no api key for AI provider '${e.name}'`);return}let n={...e,apiKey:t};switch(e.name.toLowerCase()){case"anthropic":return new i_(this.interactor,n,this.logger);case"google":return new Sk(this.interactor,n,this.logger);default:return new Rm(this.interactor,n,this.logger)}}};function bde(r){return({query:t,agentName:n})=>{try{let i=`@${n} ${t}`;return r.addCommands(i),`Query successfully redirected to agent '${n}'. The agent will process the query with full context after this run completes.`}catch(i){return`Error during redirection: ${i.message}`}}}var Ig=class extends Zt{constructor(t,n,i,a){super(t,i,a);this.agentSummaries=n}static TYPE="AI";async buildTools(t,n){let i=[];if(!t.oneshot){let a=async({message:s,options:c})=>`User answered: ${c?.length?await this.interactor.chooseOption(c,s,void 0,!0):await this.interactor.promptText(s)}`,o={type:"function",function:{name:`${this.name}__queryUser`,description:`Allows to ask the user a question.
963
+ `);this.interactor.displayText(u)}getClient(e,t){let n=this.aiClients.filter(i=>{let a=!e||i.name.toLowerCase()===e.toLowerCase(),o=!t||i.supportsModel(t.toLowerCase());return a&&o});return n.length?n[0]:void 0}getAllModels(){let e=[];for(let t of this.aiClients)if(t.models)for(let n of t.models)e.push({name:n.name,providerName:t.name});return e}cleanup(){this.aiClients.forEach(e=>e.kill()),this.aiClients=[]}kill(){this.cleanup(),this.aiProviderConfigs=void 0}getApiKey(e){let t=yde[e.name];return(t?process.env[t]??process.env[`${e.name.toUpperCase()}_API_KEY`]:void 0)??e.apiKey}detectProvidersFromEnvironment(){let e=[];for(let[t,n]of Object.entries(yde)){let i=process.env[n];if(i){let a={name:t,apiKey:i};e.push(a),this.interactor.debug(`\u{1F50D} Auto-detected ${t} provider from ${n} environment variable`)}}return e}createClient(e){let t=this.getApiKey(e);if(!t){this.interactor.displayText(`\u2139\uFE0F no api key for AI provider '${e.name}'`);return}let n={...e,apiKey:t};switch(e.name.toLowerCase()){case"anthropic":return new i_(this.interactor,n,this.logger);case"google":return new Sk(this.interactor,n,this.logger);default:return new Rm(this.interactor,n,this.logger)}}};function bde(r,e){return({query:t,agentName:n})=>{try{if(e&&n.toLowerCase()===e.toLowerCase())return`Redirection to self ('${n}') is not allowed. Please answer the query directly instead of redirecting to yourself.`;let i=`@${n} ${t}`;return r.addCommands(i),`Query successfully redirected to agent '${n}'. The agent will process the query with full context after this run completes.`}catch(i){return`Error during redirection: ${i.message}`}}}var Ig=class extends Zt{constructor(t,n,i,a){super(t,i,a);this.agentSummaries=n}static TYPE="AI";async buildTools(t,n){let i=[];if(!t.oneshot){let a=async({message:s,options:c})=>`User answered: ${c?.length?await this.interactor.chooseOption(c,s,void 0,!0):await this.interactor.promptText(s)}`,o={type:"function",function:{name:`${this.name}__queryUser`,description:`Allows to ask the user a question.
964
964
  IMPORTANT: Use this tool only when necessary, as it is intrusive for the user.
965
965
 
966
966
  If no options are provided, the user can answer with free text.