UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

1 lines 5.71 kB
import{ALL_REASONING_LEVELS}from"#setup/boxes/model-capabilities.js";import{filterOptions,initialSelectState,reduceSelect,selectValueAtCursor}from"#setup/cli/select-state.js";const NOT_EDITABLE_TEXT=`No editable agent.ts config object is available`;function reasoningSectionView(e,t,n){return e.settingsEditable?n?.reasoning===!1&&t.reasoning==="default"?{kind:`static`,text:`Not supported by the selected model`}:{kind:`interactive`}:{kind:`static`,text:NOT_EDITABLE_TEXT}}function tierSectionView(e,t){return e.settingsEditable?e.externalRouting?{kind:`static`,text:`Disabled for a direct external provider`}:e.serviceTier.kind===`custom`?{kind:`static`,text:`Custom (${e.serviceTier.value}) — authored in agent.ts`}:t!==void 0&&!t.fastMode?{kind:`hidden`}:{kind:`interactive`}:{kind:`static`,text:NOT_EDITABLE_TEXT}}function reasoningPositions(t,n){let r=[...t===void 0?ALL_REASONING_LEVELS:t.reasoningLevels];if(n!=="default"&&!r.includes(n)){let t=ALL_REASONING_LEVELS.indexOf(n),i=r.findIndex(n=>ALL_REASONING_LEVELS.indexOf(n)>t);i===-1?r.push(n):r.splice(i,0,n)}return r}function snapReasoningToCapabilities(t,n){if(t==="default"||n===void 0)return t;let r=n.reasoningLevels;if(!n.reasoning||r.length===0)return`default`;if(r.includes(t))return t;let i=ALL_REASONING_LEVELS.indexOf(t),a=r[0];for(let t of r)Math.abs(ALL_REASONING_LEVELS.indexOf(t)-i)<Math.abs(ALL_REASONING_LEVELS.indexOf(a)-i)&&(a=t);return a}function modelEditorMenuRows(e,t,n){let r=[];e.model.kind===`pick`?r.push({value:`model`,label:`Model`}):r.push({value:`model`,label:`Model`,disabled:!0,description:e.model.reason});let i=reasoningSectionView(e,t,n);i.kind===`static`?r.push({value:`reasoning`,label:`Reasoning effort`,disabled:!0,description:i.text}):r.push({value:`reasoning`,label:`Reasoning effort`});let a=tierSectionView(e,n);return a.kind===`interactive`?r.push({value:`tier`,label:`Service tier`}):a.kind===`static`&&r.push({value:`tier`,label:`Service tier`,disabled:!0,description:a.text}),r.push({value:`done`,label:`Done`}),r}function initialModelEditorState(e){let t={modelId:e.model.current,reasoning:e.reasoning??`default`,tier:e.serviceTier.kind===`priority`?`priority`:`standard`},n=e.capabilitiesFor(t.modelId);return{screen:{kind:`menu`,cursor:modelEditorMenuRows(e,t,n).find(e=>e.disabled!==!0)?.value??`done`},draft:t,capabilities:n}}function expandedModelSelect(e,t){let r={options:e.model.kind===`pick`?e.model.options:[]};return t!==null&&(r.defaultValue=t),initialSelectState(r)}function ignore(e){return{kind:`ignore`,state:e}}function toMenu(e,t){return{kind:`render`,state:{...e,screen:{kind:`menu`,cursor:t}}}}function settleResult(e,t){let n={};if(e.model.kind===`pick`&&t.modelId!==null&&t.modelId!==e.model.current&&(n.model=t.modelId),!e.settingsEditable)return n;t.reasoning!==(e.reasoning??`default`)&&(n.reasoning=t.reasoning);let r=!e.externalRouting&&e.serviceTier.kind!==`custom`,i=e.serviceTier.kind===`priority`?`priority`:`standard`;return r&&t.tier!==i&&(n.serviceTier=t.tier),n}function adjustMenuValue(e,t,n,r){let i=r===`left`?-1:1;if(n===`reasoning`){if(reasoningSectionView(t,e.draft,e.capabilities).kind!==`interactive`)return ignore(e);let n=reasoningPositions(e.capabilities,e.draft.reasoning);if(n.length===0)return ignore(e);let r=e.draft.reasoning==="default"?-1:n.indexOf(e.draft.reasoning),a=r===-1?n[i===1?0:n.length-1]:n[(r+i+n.length)%n.length];return a===e.draft.reasoning?ignore(e):{kind:`render`,state:{...e,draft:{...e.draft,reasoning:a}}}}if(n===`tier`){if(tierSectionView(t,e.capabilities).kind!==`interactive`)return ignore(e);let n=e.draft.tier===`priority`?`standard`:`priority`;return{kind:`render`,state:{...e,draft:{...e.draft,tier:n}}}}return ignore(e)}function transitionMenu(e,t,n,i){let a=modelEditorMenuRows(n,e.draft,e.capabilities);switch(t.type){case`cancel`:return{kind:`cancel`};case`move`:{let n=a[reduceSelect({filter:``,cursor:Math.max(0,a.findIndex(e=>e.value===i)),selected:new Set},{type:t.direction},{options:a}).cursor]?.value;return n===void 0||n===i?ignore(e):toMenu(e,n)}case`adjust`:return adjustMenuValue(e,n,i,t.direction);case`submit`:{let t=a.find(e=>e.value===i);return t===void 0||t.disabled===!0?ignore(e):i===`model`?{kind:`render`,state:{...e,screen:{kind:`model`,select:expandedModelSelect(n,e.draft.modelId)}}}:i===`done`?{kind:`settle`,result:settleResult(n,e.draft)}:transitionMenu(e,{type:`move`,direction:`down`},n,i)}case`char`:case`backspace`:return ignore(e)}}function transitionModelScreen(e,n,a,o){let s=a.model.kind===`pick`?a.model.options:[],renderSelect=t=>t===o?ignore(e):{kind:`render`,state:{...e,screen:{kind:`model`,select:t}}};switch(n.type){case`cancel`:return o.filter.length>0?renderSelect(reduceSelect(o,{type:`clear`},{options:s})):toMenu(e,`model`);case`move`:return renderSelect(reduceSelect(o,{type:n.direction},{options:s}));case`char`:return renderSelect(reduceSelect(o,{type:`char`,char:n.char},{options:s}));case`backspace`:return renderSelect(reduceSelect(o,{type:`backspace`},{options:s}));case`submit`:{let n=selectValueAtCursor(filterOptions(s,o.filter),o.cursor);if(n===void 0)return ignore(e);let r=a.capabilitiesFor(n);return{kind:`render`,state:{screen:{kind:`menu`,cursor:`model`},draft:{...e.draft,modelId:n,reasoning:snapReasoningToCapabilities(e.draft.reasoning,r),tier:r!==void 0&&!r.fastMode?`standard`:e.draft.tier},capabilities:r}}}case`adjust`:return ignore(e)}}function transitionModelEditor(e,t,n){switch(e.screen.kind){case`menu`:return transitionMenu(e,t,n,e.screen.cursor);case`model`:return transitionModelScreen(e,t,n,e.screen.select)}}export{initialModelEditorState,modelEditorMenuRows,reasoningPositions,reasoningSectionView,tierSectionView,transitionModelEditor};