UNPKG

eve

Version:

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

1 lines 3.2 kB
import{loadContext}from"#context/container.js";import{TurnMemoryLocksKey}from"#context/keys.js";import{parseJsonObject}from"#shared/json.js";import{defineDynamic}from"#dynamic/definition.js";import{stampDurableDynamicToolCallbacks}from"#tools/durable-callbacks.js";import{TOOL_SLUG_PATTERN}from"#discover/grammar.js";import{isBrandedToolEntry}from"#tools/dynamic.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{markDynamicCallbackRebind}from"#internal/dynamic-tool-rebind.js";function createMemoryToolDynamicDefinition(e,t){return markDynamicCallbackRebind(defineDynamic({events:{"turn.started":async(n,r)=>{let i=loadContext().get(TurnMemoryLocksKey)?.[t];if(i===void 0||e.provider.tools===void 0)return null;let a={...r,memory:{scope:i.scope,slot:t},turn:i.turn},o=await e.provider.tools(a);if(o===null)return null;if(typeof o!=`object`||Array.isArray(o))throw Error(`Memory slot "${t}" provider.tools() must return a tool map or null.`);return Object.fromEntries(Object.entries(o).map(([n,r])=>{let i=`${t}__${n}`;if(!TOOL_SLUG_PATTERN.test(i))throw Error(`Memory provider tool name "${i}" must start with an ASCII letter, contain only letters, digits, underscores, or dashes, and be at most 64 characters.`);if(!isBrandedToolEntry(r))throw Error(`Memory provider tool "${i}" must be created with defineTool().`);let o=e.description===void 0?r.description:`${e.description}\n\n${r.description}`,s={...r,description:o};return stampDurableDynamicToolCallbacks(s,createProviderToolCallbacks({context:a,definition:e,key:n,tool:r})),[i,s]}))}}}))}function createProviderToolCallbacks(e){let t=parseJsonObject({context:e.context,key:e.key}),loadTool=async t=>{let n=t.key,r=t.context;if(typeof n!=`string`||typeof r!=`object`||!r)throw Error(`Memory provider tool callback has an invalid durable closure.`);let i=(await e.definition.provider.tools?.(readMemoryToolsContext(r)))?.[n];if(i===void 0||!isBrandedToolEntry(i))throw Error(`Memory provider tool "${n}" was removed or renamed.`);return i},n={execute:{callback:async(e,t,n)=>await(await loadTool(e)).execute(t,n),closure:t}};return e.tool.approval!==void 0&&(n.approvalRequest={callback:async(e,t)=>await resolveApprovalPolicy((await loadTool(e)).approval)(t),closure:t},typeof e.tool.approval!=`function`&&e.tool.approval.response!==void 0&&(n.approvalResponse={callback:async(t,n)=>{let r=(await loadTool(t)).approval;if(r===void 0||typeof r==`function`||r.response===void 0)throw Error(`Memory provider tool "${e.key}" approval response was removed.`);return await r.response(n)},closure:t})),e.tool.toModelOutput!==void 0&&(n.toModelOutput={callback:async(e,t)=>await(await loadTool(e)).toModelOutput(t),closure:t}),n}function readMemoryToolsContext(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Memory provider tool callback has an invalid durable context.`);let t=e;if(typeof t.channel!=`object`||t.channel===null||typeof t.memory!=`object`||t.memory===null||!Array.isArray(t.messages)||typeof t.session!=`object`||t.session===null||typeof t.turn!=`object`||t.turn===null)throw Error(`Memory provider tool callback has an invalid durable context.`);return t}export{createMemoryToolDynamicDefinition};