@whoz-oss/coday-server 3.32.0 → 3.33.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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/server.js +2 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whoz-oss/coday-server",
3
- "version": "3.32.0",
3
+ "version": "3.33.0",
4
4
  "repository": "https://github.com/whoz-oss/coday",
5
5
  "type": "module",
6
6
  "main": "server/server.js",
package/server.js CHANGED
@@ -897,7 +897,7 @@ Stopping will:
897
897
  - Clear pending commands
898
898
  - Return to prompt`;if(await this.interactor.chooseOption(["proceed","stop"],u,"What do you want to do?")==="stop")return i.runStatus="STOPPED",!1;s.price>0?(s.priceThreshold*=2,this.interactor.displayText(`Cost threshold increased to ${s.priceThreshold.toFixed(2)}`)):(s.iterationsThreshold*=2,this.interactor.displayText(`Iteration threshold increased to ${s.iterationsThreshold}`))}return await Promise.all(r.map(async a=>{let o;try{a.threadId=i.id,this.interactor.sendEvent(a),o=await n.tools.run(a,i)}catch(c){let u=`Error running tool ${a.name}: ${c}`;console.error(u),o=a.buildResponse(u)}o.threadId=i.id,this.interactor.sendEvent(o),i.addToolRequests(n.name,[a]),i.addToolResponseEvents([o])})),this.shouldProceed(i)}handleError(e,r,n){let i=`${n} error occurred`;if(e instanceof Error){i=`${n} error: ${e.message}`;let s=e;s.status===401||s.statusCode===401?i=`${n} authentication failed. Please check your API key.`:s.status===429||s.statusCode===429?i=`${n} rate limit exceeded. Please try again later.`:s.code==="ECONNREFUSED"||s.code==="ENOTFOUND"||s.code==="ETIMEDOUT"?i=`Network error connecting to ${n}. Please check your internet connection.`:e.message?.includes("Max tokens")&&(i=`${n} response exceeded token limit. Try simplifying your request or splitting it into smaller parts.`)}console.error(`${n} client error:`,e),r.next(new Zo({error:e instanceof Error?e:new Error(i)})),this.interactor.displayText(`\u26A0\uFE0F ${i}`)}shouldProceed(e){return e.runStatus==="RUNNING"&&!this.killed}showAgentAndUsage(e,r,n,i){let s=`\u{1F916} ${e.name} | ${r} - ${n} `;if(!i.usage)return;let a=`Loop${i.usage.iterations>1?"s":""}: ${i.usage.iterations} | `,o=`Input: ${i.usage.input}, Output: ${i.usage.output} | `,c=`Cache write: ${i.usage.cache_write}, Cache read: ${i.usage.cache_read}`,u=`\u{1F3C3}${i.usage.price.toFixed(3)} / \u{1F9F5}${i.price.toFixed(3)}`;this.interactor.sendEvent(new _p({text:s+u,threadId:i.id})),this.interactor.debug(a+o+c)}getModel(e){let r=e.definition.modelName?.toLowerCase(),n=this.models.find(i=>i.alias?.toLowerCase()===r);return n||this.models.find(i=>i.name.toLowerCase()===r)}supportsModel(e){return this.models.some(r=>r.name.toLowerCase()===e||r?.alias?.toLowerCase()===e)}returnError(e){return(0,FEe.of)(new Zo({error:e}))}logAgentUsage(e,r,n,i){let s=i?.usage?.input??0,a=i?.usage?.output??0,o=s+a;this.logger?.logAgentUsage(i?.username??this.username??"no_username",e.name,r,n,this.name,s,a,o)}};var vr=class{constructor(e,r,n){this.interactor=e;this.name=r,this.config=n}tools=[];name;config;async kill(){}async getTools(e,r,n){return this.tools=await this.buildTools(e,n),this.tools.filter(i=>{if(!r||!r.length)return!0;let s=i.function.name.split("__")[1]??i.function.name;return r.includes(s)})}};var l8=class t{constructor(e,r){this.project=e;this.username=r}commandQueue=[];clearCommands(){this.commandQueue=[]}oneshot=!1;fileReadOnly=!1;threadFilesRoot;stackDepth=10;data={};aiThread;addCommands(...e){this.commandQueue.unshift(...e)}getFirstCommand(){return this.commandQueue.shift()}getSubContext(...e){let r=new t(this.project,this.username);return r.oneshot=this.oneshot,r.fileReadOnly=this.fileReadOnly,r.addCommands(...e),r.stackDepth=this.stackDepth-1,r}cloneWithoutCommands(){let e=new t(this.project,this.username);return e.oneshot=this.oneshot,e.fileReadOnly=this.fileReadOnly,e.stackDepth=this.stackDepth,e.data=this.data,e}};var MLt=["project","user"],ya=class{static validate(e){if(!MLt.includes(e))throw new Error(`Invalid configuration level: ${e}. Only PROJECT and USER levels are allowed.`)}};var NEe=[".pdf",".doc",".docx",".odt",".rtf",".xls",".xlsx",".ods",".csv",".tsv",".txt",".md",".markdown",".rst",".json",".xml",".yaml",".yml",".toml",".html",".htm",".css",".svg",".ts",".tsx",".js",".jsx",".py",".java",".cpp",".c",".h",".hpp",".cs",".go",".rs",".rb",".php",".swift",".kt",".scala",".sh",".bash",".sql",".env",".properties",".ini",".conf",".config",".log"];function XD(t){let e=t.toLowerCase().substring(t.lastIndexOf("."));return NEe.includes(e)}function jEe(){return NEe.join(", ")}var YD=class{constructor(e){this.tools=e;this.charLength=JSON.stringify(e).length}charLength=0;getTools(){return[...this.tools]}async run(e,r){let n=this.tools.find(c=>c.function.name===e.name);if(!n)throw new Error(`Tool '${e.name}' not found`);let i,s=n.function.function,a=JSON.parse(e.args),o=Array.isArray(a)?a:[a];if(i=await s(...o,r),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 QD={CONFLUENCE:[],GIT:[],GIT_WORKTREE:[],GITLAB:[],JIRA:[],SLACK:[],ZENDESK:[],BASECAMP:[]},Fm=Object.keys(QD).filter(t=>QD[t]?.length===0);var Ps=Ur(zc(),1),eF=class{events=new Ps.Subject;thinking$=new Ps.Subject;subs=[];lastQuestionEvent;debugLevelEnabled=!1;constructor(){this.subs.push(this.thinking$.pipe((0,Ps.throttleTime)(Dm.debounce)).subscribe(()=>this.sendEvent(new Dm({}))))}lastAnswerName=void 0;async promptText(e,r){let n=new ps({invite:e,defaultValue:r});this.lastQuestionEvent=n;let i=this.events.pipe((0,Ps.filter)(s=>s.parentKey===n.timestamp),(0,Ps.filter)(s=>s instanceof dn),(0,Ps.take)(1),(0,Ps.map)(s=>s));this.sendEvent(n);try{let s=await(0,Ps.firstValueFrom)(i);return this.lastAnswerName=s.name,this.lastQuestionEvent=void 0,s.answer}catch(s){throw new Error(`No answer received over invite ${n.timestamp} : ${s.message}`)}}async promptSecretText(e,r,n="********"){let i=r?n:"",s=await this.promptText(e,i);if(s===n&&r)return r;if(s)return s}async chooseOption(e,r,n,i){let s=new hs({options:e,invite:r,optionalQuestion:n,allowFreeText:i??!1});this.lastQuestionEvent=s;let a=this.events.pipe((0,Ps.filter)(o=>o.parentKey===s.timestamp),(0,Ps.filter)(o=>o instanceof dn),(0,Ps.take)(1),(0,Ps.map)(o=>o.answer));this.sendEvent(s);try{let o=await(0,Ps.firstValueFrom)(a);return this.lastQuestionEvent=void 0,o}catch(o){throw new Error(`No answer received over choice ${s.timestamp} : ${o.message}`)}}displayText(e,r){this.sendEvent(new _p({text:e,speaker:r}))}debug(e){if(!this.debugLevelEnabled)return;let r=`${new Date().toISOString()} DEBUG: ${e.toString()}`;console.log(r),this.sendEvent(new _p({text:r}))}warn(e){this.sendEvent(new a8({warning:e}))}error(e){this.sendEvent(new Zo({error:e}))}thinking(){this.thinking$.next(null)}sendEvent(e){this.events.next(e)}replayLastQuestion(){this.lastQuestionEvent&&this.sendEvent(this.lastQuestionEvent)}getLastQuestionEvent(){return this.lastQuestionEvent}kill(){this.subs.forEach(e=>e.unsubscribe()),this.events.complete()}};var Tw=class{title;content;level;agentName;createdAt;updatedAt;constructor(e){this.title=e.title??"no title",this.content=e.content??"no content",this.level=e.level??"PROJECT",this.agentName=e.agentName,this.createdAt=e.createdAt??new Date,this.updatedAt=e.updatedAt}update(e){return this.title=e.title??this.title,this.content=e.content??this.content,this.level=e.level??this.level,this.agentName=e.agentName,this.createdAt=e.createdAt??new Date,this.updatedAt=e.updatedAt??new Date,this}};var Xf=class extends eF{constructor(r){super();this.clientId=r}addAnswerEvent(r,n){let i=new dn({answer:r,parentKey:n});this.sendEvent(i)}kill(){console.log(`Interactor for clientId ${this.clientId} killed`),super.kill()}};var $Ee={version:1};var tF=class extends dt{constructor(r){super({commandWord:"add-query",description:"[internal] used to allow user feedback between flow commands.",isInternal:!0});this.interactor=r}async handle(r,n){let i=this.getSubCommand(r),s=i||"What message would you want to add ?",a=await this.interactor.promptText(`${s}
899
899
  (type nothing to proceed) `),o=i?`To the following query: "${i}"
900
- I answer: `:"",c=a?`"${a}"`:i?'nothing."':"";return(a||i)&&n.addCommands(`@ ${o}${c}`),n}};rQ();var gN=Ur(zc(),1);var szt=[{name:"claude-fable-5",alias:"FRONTIER",contextWindow:2e5,maxOutputTokens:64e3,price:{inputMTokens:10,cacheWrite:12.5,cacheRead:1,outputMTokens:50}},{name:"claude-sonnet-4-6",alias:"BIG",contextWindow:2e5,temperature:.8,maxOutputTokens:64e3,price:{inputMTokens:3,cacheWrite:3.75,cacheRead:.3,outputMTokens:15}},{name:"claude-opus-5",alias:"BIGGEST",contextWindow:2e5,maxOutputTokens:64e3,price:{inputMTokens:5,cacheWrite:6.25,cacheRead:.5,outputMTokens:25}},{name:"claude-haiku-4-5",alias:"SMALL",contextWindow:2e5,temperature:.8,maxOutputTokens:64e3,price:{inputMTokens:1,cacheWrite:1.25,cacheRead:.1,outputMTokens:5}}],azt=60,uee=.4,ozt=16e3,lee=.9,dke=.5,czt=5,mN=class extends u8{constructor(r,n,i){super(n,i);this.interactor=r;this.name="Anthropic",this.mergeModels(szt)}name;rateLimitInfo=null;async run(r,n){let i=this.isAnthropicReady(),s=this.getModel(r);if(!i||!s)return(0,gN.of)();n.resetUsageForRun();let a=new gN.Subject,o=this.startThinkingInterval();return this.processThread(i,r,s,n,a).catch(c=>{a.next(new Zo({error:c}))}).finally(()=>{this.stopThinkingInterval(o),this.showAgentAndUsage(r,"Anthropic",s.name,n);let c=n.usage?.price||0;this.logAgentUsage(r,s.name,c,n),a.complete()}),a}async processThread(r,n,i,s,a){await this.applyThrottlingDelay();let o=n.systemInstructions.length+n.tools.charLength+20,c=Math.max(i.contextWindow*this.charsPerToken-o,1e4),u,f;try{let h=await this.streamApiCall(r,i,n,s,c,a);u=h.data,f=h.response}catch(h){if(h.status===400&&h.error?.error?.message?.includes("prompt is too long")){this.interactor.displayText("\u26A0\uFE0F Context window exceeded. Forcing aggressive compaction...");let m=h.error.error.message.match(/(\d+) tokens > (\d+) maximum/);if(m){let g=parseInt(m[1]),v=parseInt(m[2]),y=g-v,b=Math.ceil(y*this.charsPerToken*1.2);c=Math.max(c-b,5e3),this.interactor.debug(`Token overshoot: ${y} tokens (${b} chars). Reduced budget to ${c} chars.`)}else c=Math.floor(c*.7),this.interactor.debug(`Reduced budget by 30% to ${c} chars.`);try{let g=await this.streamApiCall(r,i,n,s,c,a,!0);u=g.data,f=g.response,this.interactor.displayText("\u2705 Successfully recovered with compacted context")}catch(g){this.handleError(g,a,this.name);return}}else if(h.status===429&&h.headers){let m=parseInt(h.headers["retry-after"]??"60");this.interactor.displayText(`\u23F3 Rate limit hit. Waiting ${m} seconds before retry...`),this.updateRateLimitsFromHeaders(h.headers),this.displayRateLimitStatus(h.headers);try{await this.delay(m*1e3,"rate limit retry")}catch{this.handleError(new Error("Rate limit retry interrupted by shutdown"),a,this.name);return}this.interactor.displayText("\u{1F504} Retrying request...");try{let g=await this.streamApiCall(r,i,n,s,c,a);u=g.data,f=g.response}catch(g){this.handleError(g,a,this.name);return}}else{this.handleError(h,a,this.name);return}}if(f&&this.updateRateLimitsFromHeaders(f.headers),this.updateUsage(u?.usage,n,s),u.stop_reason==="max_tokens")throw new Error("Max tokens reached for Anthropic \u{1F62C}");let d=u.content.filter(h=>h.type==="text").map(h=>h.text.trim()).filter(h=>!!h).join(`
900
+ I answer: `:"",c=a?`"${a}"`:i?'nothing."':"";return(a||i)&&n.addCommands(`@ ${o}${c}`),n}};rQ();var gN=Ur(zc(),1);var szt=[{name:"claude-fable-5-1",alias:"FRONTIER",contextWindow:1e6,maxOutputTokens:128e3,price:{inputMTokens:10,cacheWrite:12.5,cacheRead:.25,outputMTokens:50}},{name:"claude-sonnet-5-5",alias:"BIG",contextWindow:1e6,maxOutputTokens:128e3,price:{inputMTokens:2,cacheWrite:2.5,cacheRead:.1,outputMTokens:10}},{name:"claude-opus-5-5",alias:"BIGGEST",contextWindow:1e6,maxOutputTokens:128e3,price:{inputMTokens:4,cacheWrite:5,cacheRead:.2,outputMTokens:20}},{name:"claude-haiku-5-5",alias:"SMALL",contextWindow:1e5,maxOutputTokens:128e3,price:{inputMTokens:.1,cacheWrite:.125,cacheRead:.01,outputMTokens:.5}}],azt=60,uee=.4,ozt=16e3,lee=.9,dke=.5,czt=5,mN=class extends u8{constructor(r,n,i){super(n,i);this.interactor=r;this.name="Anthropic",this.mergeModels(szt)}name;rateLimitInfo=null;async run(r,n){let i=this.isAnthropicReady(),s=this.getModel(r);if(!i||!s)return(0,gN.of)();n.resetUsageForRun();let a=new gN.Subject,o=this.startThinkingInterval();return this.processThread(i,r,s,n,a).catch(c=>{a.next(new Zo({error:c}))}).finally(()=>{this.stopThinkingInterval(o),this.showAgentAndUsage(r,"Anthropic",s.name,n);let c=n.usage?.price||0;this.logAgentUsage(r,s.name,c,n),a.complete()}),a}async processThread(r,n,i,s,a){await this.applyThrottlingDelay();let o=n.systemInstructions.length+n.tools.charLength+20,c=Math.max(i.contextWindow*this.charsPerToken-o,1e4),u,f;try{let h=await this.streamApiCall(r,i,n,s,c,a);u=h.data,f=h.response}catch(h){if(h.status===400&&h.error?.error?.message?.includes("prompt is too long")){this.interactor.displayText("\u26A0\uFE0F Context window exceeded. Forcing aggressive compaction...");let m=h.error.error.message.match(/(\d+) tokens > (\d+) maximum/);if(m){let g=parseInt(m[1]),v=parseInt(m[2]),y=g-v,b=Math.ceil(y*this.charsPerToken*1.2);c=Math.max(c-b,5e3),this.interactor.debug(`Token overshoot: ${y} tokens (${b} chars). Reduced budget to ${c} chars.`)}else c=Math.floor(c*.7),this.interactor.debug(`Reduced budget by 30% to ${c} chars.`);try{let g=await this.streamApiCall(r,i,n,s,c,a,!0);u=g.data,f=g.response,this.interactor.displayText("\u2705 Successfully recovered with compacted context")}catch(g){this.handleError(g,a,this.name);return}}else if(h.status===429&&h.headers){let m=parseInt(h.headers["retry-after"]??"60");this.interactor.displayText(`\u23F3 Rate limit hit. Waiting ${m} seconds before retry...`),this.updateRateLimitsFromHeaders(h.headers),this.displayRateLimitStatus(h.headers);try{await this.delay(m*1e3,"rate limit retry")}catch{this.handleError(new Error("Rate limit retry interrupted by shutdown"),a,this.name);return}this.interactor.displayText("\u{1F504} Retrying request...");try{let g=await this.streamApiCall(r,i,n,s,c,a);u=g.data,f=g.response}catch(g){this.handleError(g,a,this.name);return}}else{this.handleError(h,a,this.name);return}}if(f&&this.updateRateLimitsFromHeaders(f.headers),this.updateUsage(u?.usage,n,s),u.stop_reason==="max_tokens")throw new Error("Max tokens reached for Anthropic \u{1F62C}");let d=u.content.filter(h=>h.type==="text").map(h=>h.text.trim()).filter(h=>!!h).join(`
901
901
  `);this.handleText(s,d,n,a);let p=u.content.filter(h=>h.type==="tool_use").map(h=>new hi({toolRequestId:h.id,name:h.name,args:JSON.stringify(h.input)}));await this.shouldProcessAgainAfterResponse(d,p,n,s)&&await this.processThread(r,n,i,s,a)}updateUsage(r,n,i){let s=this.getModel(n),a=(r?.input_tokens??0)*(s?.price?.inputMTokens??0),o=(r?.output_tokens??0)*(s?.price?.outputMTokens??0),c=(r?.cache_creation_input_tokens??0)*(s?.price?.cacheWrite??0),u=(r?.cache_read_input_tokens??0)*(s?.price?.cacheRead??0),f=(a+o+c+u)/1e6;i.addUsage({input:r?.input_tokens??0,output:r?.output_tokens??0,cache_read:r?.cache_read_input_tokens??0,cache_write:r?.cache_creation_input_tokens??0,price:f}),this.interactor.sendEvent(new E2({inputTokens:r?.input_tokens??0,outputTokens:i.usage.output,contextWindow:this.getModel(n)?.contextWindow??0,price:i.usage.price,iterations:i.usage.iterations,cacheReadTokens:r?.cache_read_input_tokens??0,threadId:i.id}))}isAnthropicReady(){if(!this.apiKey){this.interactor.warn("ANTHROPIC_API_KEY not set, skipping AI command. Please configure your API key.");return}try{return new ad({apiKey:this.apiKey,defaultHeaders:{"anthropic-beta":"prompt-caching-2024-07-31"}})}catch(r){let n=r instanceof Error?r.message:"Unknown error";this.interactor.warn(`Failed to initialize Anthropic client: ${n}`),console.error("Anthropic client initialization error:",r);return}}toClaudeMessage(r,n,i=!1){let s=this.getOrUpdateCacheMarker(n,r,i);return r.map(a=>{let o,c=s&&a.timestamp===s;if(a instanceof So)o={role:"user",content:[{type:"text",text:a.summary,...c&&{cache_control:{type:"ephemeral"}}}]};else if(a instanceof fr){let u=a.content,f=u.map((d,p)=>{let h;return d.type==="text"&&(h={type:"text",text:d.content}),d.type==="image"&&(h={type:"image",source:{type:"base64",media_type:d.mimeType,data:d.content}}),d.type==="audio"&&(h={type:"text",text:d.transcription?`[Voice message]: ${d.transcription}`:"[Voice message: no transcription available]"}),h?{...h,...c&&p===u.length-1&&{cache_control:{type:"ephemeral"}}}:(this.interactor.warn(`Unknown content type: ${d.type}`),null)}).filter(Boolean);o={role:a.role,content:f}}if(a instanceof hi&&(o={role:"assistant",content:[{type:"tool_use",id:a.toolRequestId,name:a.name,input:JSON.parse(a.args),...c&&{cache_control:{type:"ephemeral"}}}]}),a instanceof $i){let u;if(typeof a.output=="string")u=a.output;else{let f=a.output;if(f.type==="text")u=[{type:"text",text:f.content}];else if(f.type==="image")u=[{type:"image",source:{type:"base64",media_type:f.mimeType,data:f.content}}];else throw new Error(`Unknown content type: ${f.type}`)}o={role:"user",content:[{type:"tool_result",tool_use_id:a.toolRequestId,content:u,...c&&{cache_control:{type:"ephemeral"}}}]}}else if(a instanceof ps)o={role:"assistant",content:[{type:"text",text:a.invite,...c&&{cache_control:{type:"ephemeral"}}}]};else if(a instanceof hs){let f=(Array.isArray(a.options)?a.options:[]).map((p,h)=>`${h+1}. ${p}`).join(`
902
902
  `);o={role:"assistant",content:[{type:"text",text:a.optionalQuestion?`${a.optionalQuestion}
903
903
  ${a.invite}
@@ -983,7 +983,7 @@ ${c}`,name:r.name}]}if(a instanceof dn)return[{role:"user",content:a.answer}];if
983
983
  `);return{role:"assistant",content:r.optionalQuestion?`${r.optionalQuestion}
984
984
  ${r.invite}
985
985
  ${i}`:`${r.invite}
986
- ${i}`}}if(r instanceof dn)return{role:"user",content:r.answer};if(r instanceof Uc)return{role:"user",content:"[Sub-thread delegation occurred here]"};throw new Error(`Unknown message type: ${r.type}`)}async processAssistantStream(r,n,i,s,a,o){try{r.on("textDone",c=>{a.data.openai.assistantThreadData.lastTimestamp=this.handleText(a,c.value,n,o)});for await(let c of r){if(this.interactor.thinking(),c.event==="thread.run.completed"){let u=c.data;this.updateUsage(u?.usage,n,i,a)}if(c.event==="thread.run.requires_action")try{let u=c.data.required_action?.submit_tool_outputs.tool_calls?.filter(p=>p.type==="function").map(p=>new hi({toolRequestId:p.id,name:p.function.name,args:p.function.arguments}))??[],f=[];await Promise.all(u.map(async p=>{let h;try{this.interactor.sendEvent(p),h=await n.tools.run(p,a)}catch(m){let g=`Error running tool ${p.name}: ${m}`;console.error(g),h=p.buildResponse(g)}this.interactor.sendEvent(h),a.addToolRequests(n.name,[p]),a.addToolResponseEvents([h]),f.push({tool_call_id:p.toolRequestId,output:h.getTextOutput()})}));let d=s.beta.threads.runs.submitToolOutputsStream(a.data.openai.assistantThreadData.threadId,{tool_outputs:f,thread_id:a.data.op.assistantThreadData.threadId});if(!this.shouldProceed(a))return;await this.processAssistantStream.call(this,d,n,i,s,a,o)}catch(u){console.error("Error processing tool call",u);let f=u instanceof Error?u.message:"Unknown error";this.interactor.displayText(`\u26A0\uFE0F Error processing tool call: ${f}`),o.next(new Zo({error:new Error(`Error processing OpenAI assistant tool call: ${f}`)}))}}}catch(c){this.handleError(c,o,this.aiProviderConfig.name)}}async complete(r,n){let i=this.isOpenaiReady();if(!i)throw new Error("OpenAI client not ready");let s=n?.model||this.models.find(a=>a.alias==="SMALL")?.name||"gpt-4o-mini";try{return(await i.chat.completions.create({model:s,messages:[{role:"user",content:r}],max_completion_tokens:n?.maxTokens??100,temperature:1})).choices[0]?.message?.content?.trim()||""}catch(a){throw console.error("OpenAI completion error:",a),new Error(`OpenAI completion failed: ${a.message}`)}}};var q$=class extends ny{models=[{name:"gemini-3.1-pro-preview",contextWindow:1e6,alias:"BIGGEST",temperature:.8,maxOutputTokens:65536,price:{inputMTokens:2,cacheRead:.2,outputMTokens:12}},{name:"gemini-3.6-flash",alias:"BIG",contextWindow:1e6,temperature:.8,maxOutputTokens:65536,price:{inputMTokens:1.5,cacheRead:.15,outputMTokens:7.5}},{name:"gemini-3.5-flash-lite",alias:"SMALL",contextWindow:1e6,temperature:.8,maxOutputTokens:65536,price:{inputMTokens:.3,cacheRead:.03,outputMTokens:2.5}}];constructor(e,r,n){let i={...r,url:r.url||"https://generativelanguage.googleapis.com/v1beta/openai/"};super(e,i,n)}};var bs=class extends dt{constructor(r,n){super(r);this.interactor=n}handlers=[];async handle(r,n){let i=this.getSubCommand(r),s=this.handlers.find(a=>a.accept(i,n));return s?s.handle(i,n):i.trim().length>0?(this.displayHelp(i),n):this.handleInteractiveSelection(n)}async handleInteractiveSelection(r){let n=this.buildHelpText();this.interactor.displayText(n);let i=this.handlers.filter(u=>!u.isInternal),s=new Map,a=i.map(u=>{let f=u.description.split(`
986
+ ${i}`}}if(r instanceof dn)return{role:"user",content:r.answer};if(r instanceof Uc)return{role:"user",content:"[Sub-thread delegation occurred here]"};throw new Error(`Unknown message type: ${r.type}`)}async processAssistantStream(r,n,i,s,a,o){try{r.on("textDone",c=>{a.data.openai.assistantThreadData.lastTimestamp=this.handleText(a,c.value,n,o)});for await(let c of r){if(this.interactor.thinking(),c.event==="thread.run.completed"){let u=c.data;this.updateUsage(u?.usage,n,i,a)}if(c.event==="thread.run.requires_action")try{let u=c.data.required_action?.submit_tool_outputs.tool_calls?.filter(p=>p.type==="function").map(p=>new hi({toolRequestId:p.id,name:p.function.name,args:p.function.arguments}))??[],f=[];await Promise.all(u.map(async p=>{let h;try{this.interactor.sendEvent(p),h=await n.tools.run(p,a)}catch(m){let g=`Error running tool ${p.name}: ${m}`;console.error(g),h=p.buildResponse(g)}this.interactor.sendEvent(h),a.addToolRequests(n.name,[p]),a.addToolResponseEvents([h]),f.push({tool_call_id:p.toolRequestId,output:h.getTextOutput()})}));let d=s.beta.threads.runs.submitToolOutputsStream(a.data.openai.assistantThreadData.threadId,{tool_outputs:f,thread_id:a.data.op.assistantThreadData.threadId});if(!this.shouldProceed(a))return;await this.processAssistantStream.call(this,d,n,i,s,a,o)}catch(u){console.error("Error processing tool call",u);let f=u instanceof Error?u.message:"Unknown error";this.interactor.displayText(`\u26A0\uFE0F Error processing tool call: ${f}`),o.next(new Zo({error:new Error(`Error processing OpenAI assistant tool call: ${f}`)}))}}}catch(c){this.handleError(c,o,this.aiProviderConfig.name)}}async complete(r,n){let i=this.isOpenaiReady();if(!i)throw new Error("OpenAI client not ready");let s=n?.model||this.models.find(a=>a.alias==="SMALL")?.name||"gpt-4o-mini";try{return(await i.chat.completions.create({model:s,messages:[{role:"user",content:r}],max_completion_tokens:n?.maxTokens??100,temperature:1})).choices[0]?.message?.content?.trim()||""}catch(a){throw console.error("OpenAI completion error:",a),new Error(`OpenAI completion failed: ${a.message}`)}}};var q$=class extends ny{models=[{name:"gemini-3.1-pro-preview",contextWindow:1e6,alias:"BIGGEST",temperature:.8,maxOutputTokens:65536,price:{inputMTokens:2,cacheRead:.2,outputMTokens:12}},{name:"gemini-3.8-flash",alias:"BIG",contextWindow:1e6,temperature:.8,maxOutputTokens:65536,price:{inputMTokens:1.5,cacheWrite:.5,cacheRead:.15,outputMTokens:7.5}},{name:"gemini-3.5-flash-lite",alias:"SMALL",contextWindow:1e6,temperature:.8,maxOutputTokens:65536,price:{inputMTokens:.3,cacheRead:.03,outputMTokens:2.5}}];constructor(e,r,n){let i={...r,url:r.url||"https://generativelanguage.googleapis.com/v1beta/openai/"};super(e,i,n)}};var bs=class extends dt{constructor(r,n){super(r);this.interactor=n}handlers=[];async handle(r,n){let i=this.getSubCommand(r),s=this.handlers.find(a=>a.accept(i,n));return s?s.handle(i,n):i.trim().length>0?(this.displayHelp(i),n):this.handleInteractiveSelection(n)}async handleInteractiveSelection(r){let n=this.buildHelpText();this.interactor.displayText(n);let i=this.handlers.filter(u=>!u.isInternal),s=new Map,a=i.map(u=>{let f=u.description.split(`
987
987
  `)[0],d=`${u.commandWord}: ${f}`;return s.set(d,u.commandWord),d});a.push("exit: Cancel and return"),s.set("exit: Cancel and return","exit");let o=await this.interactor.chooseOption(a,"Select a command:","Enter your choice"),c=s.get(o);return!c||c==="exit"?r:this.handle(`${this.commandWord} ${c}`,r)}buildHelpText(r){let n=[];return r&&n.push(`Sub-command '${r}' not understood.`),n.push("Available commands:"),[...this.handlers].filter(s=>!s.isInternal).sort((s,a)=>s.commandWord.localeCompare(a.commandWord)).forEach(s=>{let a=s.description.split(`
988
988
  `).map((o,c)=>c===0?o:` ${o}`).join(`
989
989
  `);n.push(` - ${s.commandWord}: ${a}`)}),n.join(`