@whoz-oss/coday-server 0.227.0 → 0.228.0
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
|
@@ -969,7 +969,7 @@ ${FS(u.stderr,c)}`:"",p=`Command failed: ${u.message??u}${f}${d}`;return i.error
|
|
|
969
969
|
`)}</messages>
|
|
970
970
|
|
|
971
971
|
Generate a short title for this conversation between <conversation-name></conversation-name> tags, and without introduction nor line jumps.
|
|
972
|
-
`;try{let i=await e.getAiClient().complete(n,{maxTokens:300,temperature:1}),s=i.match(/<conversation-name>([\s\S]*?)<\/conversation-name>/);return s&&s[1]?s[1].trim().replace(/^["']|["']$/g,"").replace(/\.$/,"").trim():i.trim()||`Thread ${new Date().toISOString().split("T")[0]}`}catch(i){return console.error("Error generating thread name:",i),`Thread ${new Date().toISOString().split("T")[0]}`}}QM();var Moe=sn(ru(),1);var itr=[{name:"gpt-5.6-sol",contextWindow:105e4,alias:"BIGGEST",temperature:1,maxOutputTokens:128e3,price:{inputMTokens:5,cacheRead:.5,outputMTokens:30}},{name:"gpt-5.6-terra",alias:"BIG",contextWindow:105e4,temperature:1,maxOutputTokens:128e3,price:{inputMTokens:2.5,cacheRead:.25,outputMTokens:15}},{name:"gpt-5.6-luna",alias:"SMALL",contextWindow:105e4,temperature:1,maxOutputTokens:128e3,price:{inputMTokens:1,cacheRead:.1,outputMTokens:6}}],P9=class t extends jv{constructor(r,n,i){super(n,i);this.interactor=r;this.mergeModels(itr),n.name.toLowerCase()!=="openai"&&(this.models=n.models??[]),this.name=n.name}name;static MAX_TOOLS=128;truncateToolsIfNeeded(r){return r.length<=t.MAX_TOOLS?r:(this.interactor.warn(`\u26A0\uFE0F OpenAI limits tools to ${t.MAX_TOOLS} maximum. Your agent has ${r.length} tools. Truncating to first ${t.MAX_TOOLS} tools. Consider reducing your integrations or using a shorter tool list for better performance.`),r.slice(0,t.MAX_TOOLS))}async run(r,n){n.resetUsageForRun();let i=this.isOpenaiReady();if(!i)return this.returnError("Client not ready");let s=this.getModel(r);if(!s)return this.returnError(`Model not found for agent ${r.name}`);if(r.definition.openaiAssistantId)return this.runAssistant(r,s,n);let a=new Moe.Subject,o=this.startThinkingInterval();return this.processThread(i,r,s,n,a).catch(c=>{a.next(new fc({error:c}))}).finally(()=>{this.stopThinkingInterval(o),this.showAgentAndUsage(r,this.aiProviderConfig.name,s.name,n);let c=n.usage?.price||0;this.logAgentUsage(r,s.name,c,n),a.complete()}),a}async runAssistant(r,n,i){let s=this.isOpenaiReady();if(!s)return this.returnError("Client not ready");let a=new Moe.Subject;i.data.openai={price:i.data?.openai?.price??0,runPrice:0,assistantThreadData:i.data?.openai?.assistantThreadData??{}};let o=n.contextWindow*this.charsPerToken-r.systemInstructions.length-r.tools.charLength,c=new Set(r.tools.getTools().map(g=>g.function.name)),u=await this.getMessages(i,o,n.name,r.name,c);u.compacted&&(i.data.openai.assistantThreadData={});let f=i.data.openai.assistantThreadData,d=this.startThinkingInterval();if(!f.threadId){let g=await s.beta.threads.create();this.interactor.displayText("Assistant thread created"),f.threadId=g.id}let p=u.messages,h=f.lastTimestamp?p.findIndex(g=>g.timestamp>=f.lastTimestamp):-1,m=p.slice(h+1);return this.updateAssistantThread(s,i,m).then(async()=>await this.processAssistantThread(s,r,n,i,a)).finally(()=>{this.stopThinkingInterval(d),this.showAgentAndUsage(r,this.aiProviderConfig.name,n.name,i);let g=i.usage?.price||0;this.logAgentUsage(r,n.name,g,i),a.complete()}),a}async processAssistantThread(r,n,i,s,a){let o=r.beta.threads.runs.stream(s.data.openai.assistantThreadData.threadId,{assistant_id:n.definition.openaiAssistantId,tools:this.truncateToolsIfNeeded([...n.tools.getTools(),{type:"file_search"}]),tool_choice:"auto",max_completion_tokens:12e4,max_prompt_tokens:12e4,parallel_tool_calls:!1});await this.processAssistantStream(o,n,i,r,s,a)}async processThread(r,n,i,s,a){try{let o=n.systemInstructions.length+n.tools.charLength+20,c=i.contextWindow*this.charsPerToken-o,u=new Set(n.tools.getTools().map(g=>g.function.name)),f=await this.getMessages(s,c,i.name,n.name,u),d;try{d=await this.streamApiCall(r,i,n,s,f.messages,a)}catch(g){this.interactor.debug(`\u26A0\uFE0F Streaming failed (${g.message}), falling back to non-streaming mode...`),d=await this.nonStreamApiCall(r,i,n,f.messages)}this.updateUsage(d.usage,n,i,s);let p=d.choices[0];if(p.finish_reason==="length")throw new Error("Max tokens reached for Openai \u{1F62C}");let h=p.message.content?.trim();this.handleText(s,h,n,a);let m=p.message?.tool_calls?.filter(g=>g.type==="function").map(g=>new Di({toolRequestId:g.id,name:g.function.name,args:g.function.arguments}));await this.shouldProcessAgainAfterResponse(h,m,n,s)&&await this.processThread(r,n,i,s,a)}catch(o){this.handleError(o,a,this.aiProviderConfig.name)}}async streamApiCall(r,n,i,s,a,o){let c=await r.chat.completions.create({model:n.name,messages:this.toOpenAiMessage(i,a),tools:this.truncateToolsIfNeeded(i.tools.getTools()),max_completion_tokens:i.definition.maxOutputTokens??n.maxOutputTokens??void 0,temperature:i.definition.temperature??n.temperature??.8,stream:!0,stream_options:{include_usage:!0}}),u="",f=[],d=null,p;for await(let m of c){if(!this.shouldProceed(s))throw new Error("Stream interrupted by user");let g=m.choices[0]?.delta;if(g?.content&&(u+=g.content,o.next(new Y2({chunk:g.content,threadId:s.id}))),g?.tool_calls)for(let v of g.tool_calls){let y=v.index;f[y]??={id:v.id||"",type:"function",function:{name:"",arguments:""}},v.id&&(f[y].id=v.id),v.function?.name&&(f[y].function.name+=v.function.name),v.function?.arguments&&(f[y].function.arguments+=v.function.arguments)}m.choices[0]?.finish_reason&&(d=m.choices[0].finish_reason),m.usage&&(p=m.usage)}return{id:"chatcmpl-stream",object:"chat.completion",created:Math.floor(Date.now()/1e3),model:n.name,choices:[{index:0,message:{role:"assistant",content:u||null,refusal:null,tool_calls:f.length>0?f:void 0},logprobs:null,finish_reason:d||"stop"}],usage:p}}async nonStreamApiCall(r,n,i,s){return await r.chat.completions.create({model:n.name,messages:this.toOpenAiMessage(i,s),tools:this.truncateToolsIfNeeded(i.tools.getTools()),max_completion_tokens:i.definition.maxOutputTokens??n.maxOutputTokens??void 0,temperature:i.definition.temperature??n.temperature??.8,stream:!1})}updateUsage(r,n,i,s){let a=r?.prompt_tokens_details?.cached_tokens??0,o=(r?.prompt_tokens??0)-a,c=o*(i?.price?.inputMTokens??0),u=r?.completion_tokens??0,f=u*(i?.price?.outputMTokens??0),d=a*(i?.price?.cacheRead??0),p=(c+f+d)/1e6;s.addUsage({input:o,output:u,cache_read:a,cache_write:0,price:p})}isOpenaiReady(){if(!this.aiProviderConfig.apiKey){this.interactor.warn(`${this.aiProviderConfig.name}_API_KEY not set, skipping AI command. Please configure your API key.`);return}try{return new Gt({apiKey:this.aiProviderConfig.apiKey,baseURL:this.aiProviderConfig.url})}catch(r){let n=r instanceof Error?r.message:"Unknown error";this.interactor.warn(`Failed to initialize ${this.aiProviderConfig.name} client: ${n}`),console.error(`${this.aiProviderConfig.name} client initialization error:`,r);return}}toOpenAiMessage(r,n){let i={content:r.systemInstructions,role:"system"},s=n.flatMap(a=>{if(a instanceof Ro)return[{role:"user",content:a.summary}];if(a instanceof wr){let c=a.content.map(u=>{if(u.type==="text")return{type:"text",text:u.content};if(u.type==="image"){let f={type:"image_url",image_url:{url:`data:${u.mimeType};base64,${u.content}`,detail:"auto"}};return console.log("got an image in message event"),f}if(u.type==="audio")return{type:"text",text:u.transcription?`[Voice message]: ${u.transcription}`:"[Voice message: no transcription available]"};throw new Error(`Unknown content type: ${u.type}`)});return a.role==="assistant"?[{role:"assistant",content:typeof c=="string"?c:c.map(u=>u.type==="text"?u.text:"[Image]").join(" "),name:r.name}]:[{role:"user",content:c,name:a.name}]}if(a instanceof Di)return[{role:"assistant",name:r.name,tool_calls:[{type:"function",id:a.toolRequestId,function:{name:a.name,arguments:a.args}}]}];if(a instanceof Qi){if(typeof a.output=="string")return[{role:"tool",content:a.output,tool_call_id:a.toolRequestId}];{let o=a.output;if(o.type==="image")return[{role:"tool",content:"Image retrieved successfully. See following message.",tool_call_id:a.toolRequestId},{role:"user",content:[{type:"image_url",image_url:{url:`data:${o.mimeType};base64,${o.content}`,detail:"auto"}}],name:"system"}];if(o.type==="text")return[{role:"tool",content:o.content,tool_call_id:a.toolRequestId}];throw new Error(`Unknown content type: ${o.type}`)}}if(a instanceof ks)return[{role:"assistant",content:a.invite,name:r.name}];if(a instanceof As){let c=(Array.isArray(a.options)?a.options:[]).map((f,d)=>`${d+1}. ${f}`).join(`
|
|
972
|
+
`;try{let i=await e.getAiClient().complete(n,{maxTokens:300,temperature:1}),s=i.match(/<conversation-name>([\s\S]*?)<\/conversation-name>/);return s&&s[1]?s[1].trim().replace(/^["']|["']$/g,"").replace(/\.$/,"").trim():i.trim()||`Thread ${new Date().toISOString().split("T")[0]}`}catch(i){return console.error("Error generating thread name:",i),`Thread ${new Date().toISOString().split("T")[0]}`}}QM();var Moe=sn(ru(),1);var itr=[{name:"gpt-5.6-sol",contextWindow:105e4,alias:"BIGGEST",temperature:1,maxOutputTokens:128e3,price:{inputMTokens:5,cacheRead:.5,outputMTokens:30}},{name:"gpt-5.6-terra",alias:"BIG",contextWindow:105e4,temperature:1,maxOutputTokens:128e3,price:{inputMTokens:2.5,cacheRead:.25,outputMTokens:15}},{name:"gpt-5.6-luna",alias:"SMALL",contextWindow:105e4,temperature:1,maxOutputTokens:128e3,price:{inputMTokens:1,cacheRead:.1,outputMTokens:6}}],P9=class t extends jv{constructor(r,n,i){super(n,i);this.interactor=r;this.mergeModels(itr),n.name.toLowerCase()!=="openai"&&(this.models=n.models??[]),this.name=n.name}name;static MAX_TOOLS=128;truncateToolsIfNeeded(r){return r.length<=t.MAX_TOOLS?r:(this.interactor.warn(`\u26A0\uFE0F OpenAI limits tools to ${t.MAX_TOOLS} maximum. Your agent has ${r.length} tools. Truncating to first ${t.MAX_TOOLS} tools. Consider reducing your integrations or using a shorter tool list for better performance.`),r.slice(0,t.MAX_TOOLS))}async run(r,n){n.resetUsageForRun();let i=this.isOpenaiReady();if(!i)return this.returnError("Client not ready");let s=this.getModel(r);if(!s)return this.returnError(`Model not found for agent ${r.name}`);if(r.definition.openaiAssistantId)return this.runAssistant(r,s,n);let a=new Moe.Subject,o=this.startThinkingInterval();return this.processThread(i,r,s,n,a).catch(c=>{a.next(new fc({error:c}))}).finally(()=>{this.stopThinkingInterval(o),this.showAgentAndUsage(r,this.aiProviderConfig.name,s.name,n);let c=n.usage?.price||0;this.logAgentUsage(r,s.name,c,n),a.complete()}),a}async runAssistant(r,n,i){let s=this.isOpenaiReady();if(!s)return this.returnError("Client not ready");let a=new Moe.Subject;i.data.openai={price:i.data?.openai?.price??0,runPrice:0,assistantThreadData:i.data?.openai?.assistantThreadData??{}};let o=n.contextWindow*this.charsPerToken-r.systemInstructions.length-r.tools.charLength,c=new Set(r.tools.getTools().map(g=>g.function.name)),u=await this.getMessages(i,o,n.name,r.name,c);u.compacted&&(i.data.openai.assistantThreadData={});let f=i.data.openai.assistantThreadData,d=this.startThinkingInterval();if(!f.threadId){let g=await s.beta.threads.create();this.interactor.displayText("Assistant thread created"),f.threadId=g.id}let p=u.messages,h=f.lastTimestamp?p.findIndex(g=>g.timestamp>=f.lastTimestamp):-1,m=p.slice(h+1);return this.updateAssistantThread(s,i,m).then(async()=>await this.processAssistantThread(s,r,n,i,a)).finally(()=>{this.stopThinkingInterval(d),this.showAgentAndUsage(r,this.aiProviderConfig.name,n.name,i);let g=i.usage?.price||0;this.logAgentUsage(r,n.name,g,i),a.complete()}),a}async processAssistantThread(r,n,i,s,a){let o=r.beta.threads.runs.stream(s.data.openai.assistantThreadData.threadId,{assistant_id:n.definition.openaiAssistantId,tools:this.truncateToolsIfNeeded([...n.tools.getTools(),{type:"file_search"}]),tool_choice:"auto",max_completion_tokens:12e4,max_prompt_tokens:12e4,parallel_tool_calls:!1});await this.processAssistantStream(o,n,i,r,s,a)}async processThread(r,n,i,s,a){try{let o=n.systemInstructions.length+n.tools.charLength+20,c=i.contextWindow*this.charsPerToken-o,u=new Set(n.tools.getTools().map(g=>g.function.name)),f=await this.getMessages(s,c,i.name,n.name,u),d;try{d=await this.streamApiCall(r,i,n,s,f.messages,a)}catch(g){this.interactor.debug(`\u26A0\uFE0F Streaming failed (${g.message}), falling back to non-streaming mode...`),d=await this.nonStreamApiCall(r,i,n,f.messages)}this.updateUsage(d.usage,n,i,s);let p=d.choices[0];if(p.finish_reason==="length")throw new Error("Max tokens reached for Openai \u{1F62C}");let h=p.message.content?.trim();this.handleText(s,h,n,a);let m=p.message?.tool_calls?.filter(g=>g.type==="function").map(g=>new Di({toolRequestId:g.id,name:g.function.name,args:g.function.arguments}));await this.shouldProcessAgainAfterResponse(h,m,n,s)&&await this.processThread(r,n,i,s,a)}catch(o){this.handleError(o,a,this.aiProviderConfig.name)}}async streamApiCall(r,n,i,s,a,o){let c=await r.chat.completions.create({model:n.name,messages:this.toOpenAiMessage(i,a),tools:this.truncateToolsIfNeeded(i.tools.getTools()),max_completion_tokens:i.definition.maxOutputTokens??n.maxOutputTokens??void 0,temperature:i.definition.temperature??n.temperature??.8,reasoning_effort:"none",stream:!0,stream_options:{include_usage:!0}}),u="",f=[],d=null,p;for await(let m of c){if(!this.shouldProceed(s))throw new Error("Stream interrupted by user");let g=m.choices[0]?.delta;if(g?.content&&(u+=g.content,o.next(new Y2({chunk:g.content,threadId:s.id}))),g?.tool_calls)for(let v of g.tool_calls){let y=v.index;f[y]??={id:v.id||"",type:"function",function:{name:"",arguments:""}},v.id&&(f[y].id=v.id),v.function?.name&&(f[y].function.name+=v.function.name),v.function?.arguments&&(f[y].function.arguments+=v.function.arguments)}m.choices[0]?.finish_reason&&(d=m.choices[0].finish_reason),m.usage&&(p=m.usage)}return{id:"chatcmpl-stream",object:"chat.completion",created:Math.floor(Date.now()/1e3),model:n.name,choices:[{index:0,message:{role:"assistant",content:u||null,refusal:null,tool_calls:f.length>0?f:void 0},logprobs:null,finish_reason:d||"stop"}],usage:p}}async nonStreamApiCall(r,n,i,s){return await r.chat.completions.create({model:n.name,messages:this.toOpenAiMessage(i,s),tools:this.truncateToolsIfNeeded(i.tools.getTools()),max_completion_tokens:i.definition.maxOutputTokens??n.maxOutputTokens??void 0,temperature:i.definition.temperature??n.temperature??.8,reasoning_effort:"none",stream:!1})}updateUsage(r,n,i,s){let a=r?.prompt_tokens_details?.cached_tokens??0,o=(r?.prompt_tokens??0)-a,c=o*(i?.price?.inputMTokens??0),u=r?.completion_tokens??0,f=u*(i?.price?.outputMTokens??0),d=a*(i?.price?.cacheRead??0),p=(c+f+d)/1e6;s.addUsage({input:o,output:u,cache_read:a,cache_write:0,price:p})}isOpenaiReady(){if(!this.aiProviderConfig.apiKey){this.interactor.warn(`${this.aiProviderConfig.name}_API_KEY not set, skipping AI command. Please configure your API key.`);return}try{return new Gt({apiKey:this.aiProviderConfig.apiKey,baseURL:this.aiProviderConfig.url})}catch(r){let n=r instanceof Error?r.message:"Unknown error";this.interactor.warn(`Failed to initialize ${this.aiProviderConfig.name} client: ${n}`),console.error(`${this.aiProviderConfig.name} client initialization error:`,r);return}}toOpenAiMessage(r,n){let i={content:r.systemInstructions,role:"system"},s=n.flatMap(a=>{if(a instanceof Ro)return[{role:"user",content:a.summary}];if(a instanceof wr){let c=a.content.map(u=>{if(u.type==="text")return{type:"text",text:u.content};if(u.type==="image"){let f={type:"image_url",image_url:{url:`data:${u.mimeType};base64,${u.content}`,detail:"auto"}};return console.log("got an image in message event"),f}if(u.type==="audio")return{type:"text",text:u.transcription?`[Voice message]: ${u.transcription}`:"[Voice message: no transcription available]"};throw new Error(`Unknown content type: ${u.type}`)});return a.role==="assistant"?[{role:"assistant",content:typeof c=="string"?c:c.map(u=>u.type==="text"?u.text:"[Image]").join(" "),name:r.name}]:[{role:"user",content:c,name:a.name}]}if(a instanceof Di)return[{role:"assistant",name:r.name,tool_calls:[{type:"function",id:a.toolRequestId,function:{name:a.name,arguments:a.args}}]}];if(a instanceof Qi){if(typeof a.output=="string")return[{role:"tool",content:a.output,tool_call_id:a.toolRequestId}];{let o=a.output;if(o.type==="image")return[{role:"tool",content:"Image retrieved successfully. See following message.",tool_call_id:a.toolRequestId},{role:"user",content:[{type:"image_url",image_url:{url:`data:${o.mimeType};base64,${o.content}`,detail:"auto"}}],name:"system"}];if(o.type==="text")return[{role:"tool",content:o.content,tool_call_id:a.toolRequestId}];throw new Error(`Unknown content type: ${o.type}`)}}if(a instanceof ks)return[{role:"assistant",content:a.invite,name:r.name}];if(a instanceof As){let c=(Array.isArray(a.options)?a.options:[]).map((f,d)=>`${d+1}. ${f}`).join(`
|
|
973
973
|
`);return[{role:"assistant",content:a.optionalQuestion?`${a.optionalQuestion}
|
|
974
974
|
${a.invite}
|
|
975
975
|
${c}`:`${a.invite}
|