@whoz-oss/coday-server 0.167.3 → 0.168.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 +2 -2
package/package.json
CHANGED
package/server.js
CHANGED
|
@@ -707,7 +707,7 @@ ${L6(u.stderr,c)}`:"",d=`Command failed: ${u.message??u}${l}${f}`;return i.error
|
|
|
707
707
|
`)}</messages>
|
|
708
708
|
|
|
709
709
|
Generate a short title for this conversation between <conversation-name></conversation-name> tags, and without introduction nor line jumps.
|
|
710
|
-
`;try{let i=await e.getAiClient().complete(n,{maxTokens:300,temperature:1}),a=i.match(/<conversation-name>([\s\S]*?)<\/conversation-name>/);return a&&a[1]?a[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]}`}}XE();var vU=dr(To(),1);var Fct=[{name:"gpt-5.
|
|
710
|
+
`;try{let i=await e.getAiClient().complete(n,{maxTokens:300,temperature:1}),a=i.match(/<conversation-name>([\s\S]*?)<\/conversation-name>/);return a&&a[1]?a[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]}`}}XE();var vU=dr(To(),1);var Fct=[{name:"gpt-5.4",contextWindow:272e3,alias:"BIG",temperature:1,maxOutputTokens:128e3,price:{inputMTokens:2.5,cacheRead:.25,outputMTokens:15}},{name:"gpt-5.4-mini",alias:"SMALL",contextWindow:272e3,temperature:1,maxOutputTokens:128e3,price:{inputMTokens:.75,cacheRead:.075,outputMTokens:4.5}},{name:"gpt-5.4-nano",alias:"SMALLEST",contextWindow:272e3,temperature:1,maxOutputTokens:128e3,price:{inputMTokens:.2,cacheRead:.02,outputMTokens:1.25}}],Jm=class r extends ph{constructor(t,n,i){super(n,i);this.interactor=t;this.mergeModels(Fct),n.name.toLowerCase()!=="openai"&&(this.models=n.models??[]),this.name=n.name}name;static MAX_TOOLS=128;truncateToolsIfNeeded(t){return t.length<=r.MAX_TOOLS?t:(this.interactor.warn(`\u26A0\uFE0F OpenAI limits tools to ${r.MAX_TOOLS} maximum. Your agent has ${t.length} tools. Truncating to first ${r.MAX_TOOLS} tools. Consider reducing your integrations or using a shorter tool list for better performance.`),t.slice(0,r.MAX_TOOLS))}async run(t,n){n.resetUsageForRun();let i=this.isOpenaiReady();if(!i)return this.returnError("Client not ready");let a=this.getModel(t);if(!a)return this.returnError(`Model not found for agent ${t.name}`);if(t.definition.openaiAssistantId)return this.runAssistant(t,a,n);let o=new vU.Subject,s=this.startThinkingInterval();return this.processThread(i,t,a,n,o).catch(c=>{o.next(new Ka({error:c}))}).finally(()=>{this.stopThinkingInterval(s),this.showAgentAndUsage(t,this.aiProviderConfig.name,a.name,n);let c=n.usage?.price||0;this.logAgentUsage(t,a.name,c,n),o.complete()}),o}async runAssistant(t,n,i){let a=this.isOpenaiReady();if(!a)return this.returnError("Client not ready");let o=new vU.Subject;i.data.openai={price:i.data?.openai?.price??0,runPrice:0,assistantThreadData:i.data?.openai?.assistantThreadData??{}};let s=n.contextWindow*this.charsPerToken-t.systemInstructions.length-t.tools.charLength,c=new Set(t.tools.getTools().map(h=>h.function.name)),u=await this.getMessages(i,s,n.name,t.name,c);u.compacted&&(i.data.openai.assistantThreadData={});let l=i.data.openai.assistantThreadData,f=this.startThinkingInterval();if(!l.threadId){let h=await a.beta.threads.create();this.interactor.displayText("Assistant thread created"),l.threadId=h.id}let d=u.messages,p=l.lastTimestamp?d.findIndex(h=>h.timestamp>=l.lastTimestamp):-1,m=d.slice(p+1);return this.updateAssistantThread(a,i,m).then(async()=>await this.processAssistantThread(a,t,n,i,o)).finally(()=>{this.stopThinkingInterval(f),this.showAgentAndUsage(t,this.aiProviderConfig.name,n.name,i);let h=i.usage?.price||0;this.logAgentUsage(t,n.name,h,i),o.complete()}),o}async processAssistantThread(t,n,i,a,o){let s=t.beta.threads.runs.stream(a.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(s,n,i,t,a,o)}async processThread(t,n,i,a,o){try{let s=n.systemInstructions.length+n.tools.charLength+20,c=i.contextWindow*this.charsPerToken-s,u=new Set(n.tools.getTools().map(h=>h.function.name)),l=await this.getMessages(a,c,i.name,n.name,u),f;try{f=await this.streamApiCall(t,i,n,a,l.messages,o)}catch(h){this.interactor.debug(`\u26A0\uFE0F Streaming failed (${h.message}), falling back to non-streaming mode...`),f=await this.nonStreamApiCall(t,i,n,l.messages)}this.updateUsage(f.usage,n,i,a);let d=f.choices[0];if(d.finish_reason==="length")throw new Error("Max tokens reached for Openai \u{1F62C}");let p=d.message.content?.trim();this.handleText(a,p,n,o);let m=d.message?.tool_calls?.filter(h=>h.type==="function").map(h=>new yn({toolRequestId:h.id,name:h.function.name,args:h.function.arguments}));await this.shouldProcessAgainAfterResponse(p,m,n,a)&&await this.processThread(t,n,i,a,o)}catch(s){this.handleError(s,o,this.aiProviderConfig.name)}}async streamApiCall(t,n,i,a,o,s){let c=await t.chat.completions.create({model:n.name,messages:this.toOpenAiMessage(i,o),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="",l=[],f=null,d;for await(let m of c){if(!this.shouldProceed(a))throw new Error("Stream interrupted by user");let h=m.choices[0]?.delta;if(h?.content&&(u+=h.content,s.next(new I2({chunk:h.content,threadId:a.id}))),h?.tool_calls)for(let g of h.tool_calls){let v=g.index;l[v]??={id:g.id||"",type:"function",function:{name:"",arguments:""}},g.id&&(l[v].id=g.id),g.function?.name&&(l[v].function.name+=g.function.name),g.function?.arguments&&(l[v].function.arguments+=g.function.arguments)}m.choices[0]?.finish_reason&&(f=m.choices[0].finish_reason),m.usage&&(d=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:l.length>0?l:void 0},logprobs:null,finish_reason:f||"stop"}],usage:d}}async nonStreamApiCall(t,n,i,a){return await t.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:!1})}updateUsage(t,n,i,a){let o=t?.prompt_tokens_details?.cached_tokens??0,s=(t?.prompt_tokens??0)-o,c=s*(i?.price?.inputMTokens??0),u=t?.completion_tokens??0,l=u*(i?.price?.outputMTokens??0),f=o*(i?.price?.cacheRead??0),d=(c+l+f)/1e6;a.addUsage({input:s,output:u,cache_read:o,cache_write:0,price:d})}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 Ct({apiKey:this.aiProviderConfig.apiKey,baseURL:this.aiProviderConfig.url})}catch(t){let n=t instanceof Error?t.message:"Unknown error";this.interactor.warn(`Failed to initialize ${this.aiProviderConfig.name} client: ${n}`),console.error(`${this.aiProviderConfig.name} client initialization error:`,t);return}}toOpenAiMessage(t,n){let i={content:t.systemInstructions,role:"system"},a=n.flatMap(o=>{if(o instanceof Aa)return[{role:"user",content:o.summary}];if(o instanceof Pt){let c=o.content.map(u=>{if(u.type==="text")return{type:"text",text:u.content};if(u.type==="image"){let l={type:"image_url",image_url:{url:`data:${u.mimeType};base64,${u.content}`,detail:"auto"}};return console.log("got an image in message event"),l}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 o.role==="assistant"?[{role:"assistant",content:typeof c=="string"?c:c.map(u=>u.type==="text"?u.text:"[Image]").join(" "),name:t.name}]:[{role:"user",content:c,name:o.name}]}if(o instanceof yn)return[{role:"assistant",name:t.name,tool_calls:[{type:"function",id:o.toolRequestId,function:{name:o.name,arguments:o.args}}]}];if(o instanceof Rn){if(typeof o.output=="string")return[{role:"tool",content:o.output,tool_call_id:o.toolRequestId}];{let s=o.output;if(s.type==="image")return[{role:"tool",content:"Image retrieved successfully. See following message.",tool_call_id:o.toolRequestId},{role:"user",content:[{type:"image_url",image_url:{url:`data:${s.mimeType};base64,${s.content}`,detail:"auto"}}],name:"system"}];if(s.type==="text")return[{role:"tool",content:s.content,tool_call_id:o.toolRequestId}];throw new Error(`Unknown content type: ${s.type}`)}}if(o instanceof ti)return[{role:"assistant",content:o.invite,name:t.name}];if(o instanceof ri){let c=(Array.isArray(o.options)?o.options:[]).map((l,f)=>`${f+1}. ${l}`).join(`
|
|
711
711
|
`);return[{role:"assistant",content:o.optionalQuestion?`${o.optionalQuestion}
|
|
712
712
|
${o.invite}
|
|
713
713
|
${c}`:`${o.invite}
|
|
@@ -721,7 +721,7 @@ ${c}`,name:t.name}]}if(o instanceof Cr)return[{role:"user",content:o.answer}];if
|
|
|
721
721
|
`);return{role:"assistant",content:t.optionalQuestion?`${t.optionalQuestion}
|
|
722
722
|
${t.invite}
|
|
723
723
|
${i}`:`${t.invite}
|
|
724
|
-
${i}`}}if(t instanceof Cr)return{role:"user",content:t.answer};if(t instanceof Po)return{role:"user",content:"[Sub-thread delegation occurred here]"};throw new Error(`Unknown message type: ${t.type}`)}async processAssistantStream(t,n,i,a,o,s){try{t.on("textDone",c=>{o.data.openai.assistantThreadData.lastTimestamp=this.handleText(o,c.value,n,s)});for await(let c of t){if(this.interactor.thinking(),c.event==="thread.run.completed"){let u=c.data;this.updateUsage(u?.usage,n,i,o)}if(c.event==="thread.run.requires_action")try{let u=c.data.required_action?.submit_tool_outputs.tool_calls?.filter(d=>d.type==="function").map(d=>new yn({toolRequestId:d.id,name:d.function.name,args:d.function.arguments}))??[],l=[];await Promise.all(u.map(async d=>{let p;try{this.interactor.sendEvent(d),p=await n.tools.run(d,o)}catch(m){let h=`Error running tool ${d.name}: ${m}`;console.error(h),p=d.buildResponse(h)}this.interactor.sendEvent(p),o.addToolRequests(n.name,[d]),o.addToolResponseEvents([p]),l.push({tool_call_id:d.toolRequestId,output:p.getTextOutput()})}));let f=a.beta.threads.runs.submitToolOutputsStream(o.data.openai.assistantThreadData.threadId,{tool_outputs:l,thread_id:o.data.op.assistantThreadData.threadId});if(!this.shouldProceed(o))return;await this.processAssistantStream.call(this,f,n,i,a,o,s)}catch(u){console.error("Error processing tool call",u);let l=u instanceof Error?u.message:"Unknown error";this.interactor.displayText(`\u26A0\uFE0F Error processing tool call: ${l}`),s.next(new Ka({error:new Error(`Error processing OpenAI assistant tool call: ${l}`)}))}}}catch(c){this.handleError(c,s,this.aiProviderConfig.name)}}async complete(t,n){let i=this.isOpenaiReady();if(!i)throw new Error("OpenAI client not ready");let a=n?.model||this.models.find(o=>o.alias==="SMALL")?.name||"gpt-4o-mini";try{return(await i.chat.completions.create({model:a,messages:[{role:"user",content:t}],max_completion_tokens:n?.maxTokens??100,temperature:1})).choices[0]?.message?.content?.trim()||""}catch(o){throw console.error("OpenAI completion error:",o),new Error(`OpenAI completion failed: ${o.message}`)}}};var QE=class extends Jm{models=[{name:"gemini-3-pro-preview",contextWindow:
|
|
724
|
+
${i}`}}if(t instanceof Cr)return{role:"user",content:t.answer};if(t instanceof Po)return{role:"user",content:"[Sub-thread delegation occurred here]"};throw new Error(`Unknown message type: ${t.type}`)}async processAssistantStream(t,n,i,a,o,s){try{t.on("textDone",c=>{o.data.openai.assistantThreadData.lastTimestamp=this.handleText(o,c.value,n,s)});for await(let c of t){if(this.interactor.thinking(),c.event==="thread.run.completed"){let u=c.data;this.updateUsage(u?.usage,n,i,o)}if(c.event==="thread.run.requires_action")try{let u=c.data.required_action?.submit_tool_outputs.tool_calls?.filter(d=>d.type==="function").map(d=>new yn({toolRequestId:d.id,name:d.function.name,args:d.function.arguments}))??[],l=[];await Promise.all(u.map(async d=>{let p;try{this.interactor.sendEvent(d),p=await n.tools.run(d,o)}catch(m){let h=`Error running tool ${d.name}: ${m}`;console.error(h),p=d.buildResponse(h)}this.interactor.sendEvent(p),o.addToolRequests(n.name,[d]),o.addToolResponseEvents([p]),l.push({tool_call_id:d.toolRequestId,output:p.getTextOutput()})}));let f=a.beta.threads.runs.submitToolOutputsStream(o.data.openai.assistantThreadData.threadId,{tool_outputs:l,thread_id:o.data.op.assistantThreadData.threadId});if(!this.shouldProceed(o))return;await this.processAssistantStream.call(this,f,n,i,a,o,s)}catch(u){console.error("Error processing tool call",u);let l=u instanceof Error?u.message:"Unknown error";this.interactor.displayText(`\u26A0\uFE0F Error processing tool call: ${l}`),s.next(new Ka({error:new Error(`Error processing OpenAI assistant tool call: ${l}`)}))}}}catch(c){this.handleError(c,s,this.aiProviderConfig.name)}}async complete(t,n){let i=this.isOpenaiReady();if(!i)throw new Error("OpenAI client not ready");let a=n?.model||this.models.find(o=>o.alias==="SMALL")?.name||"gpt-4o-mini";try{return(await i.chat.completions.create({model:a,messages:[{role:"user",content:t}],max_completion_tokens:n?.maxTokens??100,temperature:1})).choices[0]?.message?.content?.trim()||""}catch(o){throw console.error("OpenAI completion error:",o),new Error(`OpenAI completion failed: ${o.message}`)}}};var QE=class extends Jm{models=[{name:"gemini-3.1-pro-preview",contextWindow:2e5,alias:"BIGGEST",temperature:.8,maxOutputTokens:65536,price:{inputMTokens:2,cacheRead:.2,outputMTokens:12}},{name:"gemini-3.5-flash",alias:"BIG",contextWindow:1e6,temperature:.8,maxOutputTokens:65536,price:{inputMTokens:1.5,cacheRead:.15,outputMTokens:9}},{name:"gemini-3.1-flash-lite",alias:"SMALL",contextWindow:1e6,temperature:.8,maxOutputTokens:65536,price:{inputMTokens:.25,cacheRead:.025,outputMTokens:1.5}}];constructor(e,t,n){let i={...t,url:t.url||"https://generativelanguage.googleapis.com/v1beta/openai/"};super(e,i,n)}};var oi=class extends Me{constructor(t,n){super(t);this.interactor=n}handlers=[];async handle(t,n){let i=this.getSubCommand(t),a=this.handlers.find(o=>o.accept(i,n));return a?a.handle(i,n):i.trim().length>0?(this.displayHelp(i),n):this.handleInteractiveSelection(n)}async handleInteractiveSelection(t){let n=this.buildHelpText();this.interactor.displayText(n);let i=this.handlers.filter(u=>!u.isInternal),a=new Map,o=i.map(u=>{let l=u.description.split(`
|
|
725
725
|
`)[0],f=`${u.commandWord}: ${l}`;return a.set(f,u.commandWord),f});o.push("exit: Cancel and return"),a.set("exit: Cancel and return","exit");let s=await this.interactor.chooseOption(o,"Select a command:","Enter your choice"),c=a.get(s);return!c||c==="exit"?t:this.handle(`${this.commandWord} ${c}`,t)}buildHelpText(t){let n=[];return t&&n.push(`Sub-command '${t}' not understood.`),n.push("Available commands:"),[...this.handlers].filter(a=>!a.isInternal).sort((a,o)=>a.commandWord.localeCompare(o.commandWord)).forEach(a=>{let o=a.description.split(`
|
|
726
726
|
`).map((s,c)=>c===0?s:` ${s}`).join(`
|
|
727
727
|
`);n.push(` - ${a.commandWord}: ${o}`)}),n.join(`
|