eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
2 lines • 2.68 kB
JavaScript
import{escapeForQuote,isAstNode,keyMatches,lineAt,parseAgentObject,unwrapExpression}from"./agent-config-ast.js";import{CHATGPT_MODEL_SELECTION_PREFIX,DEFAULT_CHATGPT_MODEL_SELECTION,normalizeChatGptModelId,parseChatGptModelSelection}from"#shared/chatgpt-model.js";async function applyModelSelectionToSource(e,t){let n=await parseAgentObject(e);if(n.kind===`bail`)return n;let r=findModelValue(n.object);if(r===void 0||r.start===void 0||r.end===void 0)return{kind:`bail`,reason:"`model` is absent or cannot be edited safely",line:lineAt(e,n.object.start)};let i=currentSelection(r);if(i===void 0)return{kind:`bail`,reason:"`model` is neither a string literal nor an eve `chatgpt()` call",line:lineAt(e,r.start)};let a=parseChatGptModelSelection(t),o=a===void 0?`${e[r.start]===`'`?`'`:`"`}${escapeForQuote(t,e[r.start]===`'`?`'`:`"`)}${e[r.start]===`'`?`'`:`"`}`:`chatgpt(${JSON.stringify(a)})`,s=e.slice(0,r.start)+o+e.slice(r.end);return a===void 0?parseChatGptModelSelection(i)!==void 0&&!/\bchatgpt\s*\(/u.test(s)&&(s=removeChatGptImport(s)):s=ensureChatGptImport(s),{kind:`applied`,from:i,to:t,nextSource:s}}function findModelValue(e){for(let t of e.properties)if(t.type===`Property`&&!t.computed&&keyMatches(t.key,`model`))return isAstNode(t.value)?unwrapExpression(t.value):void 0}function currentSelection(e){if(e.type===`Literal`&&typeof e.value==`string`)return e.value;if(e.type!==`CallExpression`||!isAstNode(e.callee))return;let t=unwrapExpression(e.callee);if(t.type!==`Identifier`||t.name!==`chatgpt`)return;let n=e.arguments?.[0];if(n===void 0)return DEFAULT_CHATGPT_MODEL_SELECTION;if(!isAstNode(n))return;let r=unwrapExpression(n);if(r.type!==`Literal`||typeof r.value!=`string`)return;let i=normalizeChatGptModelId(r.value);return i===void 0?void 0:`${CHATGPT_MODEL_SELECTION_PREFIX}${i}`}function ensureChatGptImport(e){let t=e.match(/import\s*\{([^}]*)\}\s*from\s*["']eve\/models\/openai["'];?/u);if(t!==null){let n=t[1].split(`,`).map(e=>e.trim()).filter(Boolean);if(n.includes(`chatgpt`))return e;let r=`import { ${[...n,`chatgpt`].join(`, `)} } from "eve/models/openai";`;return e.slice(0,t.index)+r+e.slice(t.index+t[0].length)}let n=[...e.matchAll(/^import .*;\s*$/gmu)].at(-1),r=n===void 0?0:n.index+n[0].length,i=r===0?``:`
`;return`${e.slice(0,r)}${i}import { chatgpt } from "eve/models/openai";${e.slice(r)}`}function removeChatGptImport(e){return e.replace(/import\s*\{([^}]*)\}\s*from\s*["']eve\/models\/openai["'];?\n?/u,(e,t)=>{let n=t.split(`,`).map(e=>e.trim()).filter(Boolean),r=n.filter(e=>e!==`chatgpt`);return r.length===n.length?e:r.length===0?``:`import { ${r.join(`, `)} } from "eve/models/openai";\n`})}export{applyModelSelectionToSource};