@assistant-ui/react 0.7.76 → 0.7.78
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/dist/runtimes/edge/converters/toLanguageModelMessages.d.ts.map +1 -1
 - package/dist/runtimes/edge/converters/toLanguageModelMessages.js +2 -2
 - package/dist/runtimes/edge/converters/toLanguageModelMessages.js.map +1 -1
 - package/dist/runtimes/edge/converters/toLanguageModelMessages.mjs +2 -2
 - package/dist/runtimes/edge/converters/toLanguageModelMessages.mjs.map +1 -1
 - package/dist/runtimes/edge/streams/toolResultStream.js +1 -1
 - package/dist/runtimes/edge/streams/toolResultStream.js.map +1 -1
 - package/dist/runtimes/edge/streams/toolResultStream.mjs +1 -1
 - package/dist/runtimes/edge/streams/toolResultStream.mjs.map +1 -1
 - package/dist/runtimes/local/LocalRuntimeOptions.d.ts +4 -5
 - package/dist/runtimes/local/LocalRuntimeOptions.d.ts.map +1 -1
 - package/dist/runtimes/local/LocalRuntimeOptions.js +2 -2
 - package/dist/runtimes/local/LocalRuntimeOptions.js.map +1 -1
 - package/dist/runtimes/local/LocalRuntimeOptions.mjs +2 -2
 - package/dist/runtimes/local/LocalRuntimeOptions.mjs.map +1 -1
 - package/dist/runtimes/local/LocalThreadRuntimeCore.d.ts.map +1 -1
 - package/dist/runtimes/local/LocalThreadRuntimeCore.js +2 -8
 - package/dist/runtimes/local/LocalThreadRuntimeCore.js.map +1 -1
 - package/dist/runtimes/local/LocalThreadRuntimeCore.mjs +2 -8
 - package/dist/runtimes/local/LocalThreadRuntimeCore.mjs.map +1 -1
 - package/dist/runtimes/local/shouldContinue.d.ts +1 -1
 - package/dist/runtimes/local/shouldContinue.d.ts.map +1 -1
 - package/dist/runtimes/local/shouldContinue.js +8 -3
 - package/dist/runtimes/local/shouldContinue.js.map +1 -1
 - package/dist/runtimes/local/shouldContinue.mjs +8 -3
 - package/dist/runtimes/local/shouldContinue.mjs.map +1 -1
 - package/package.json +1 -1
 - package/src/runtimes/edge/converters/toLanguageModelMessages.ts +5 -2
 - package/src/runtimes/edge/streams/toolResultStream.ts +1 -1
 - package/src/runtimes/local/LocalRuntimeOptions.tsx +4 -5
 - package/src/runtimes/local/LocalThreadRuntimeCore.tsx +2 -10
 - package/src/runtimes/local/shouldContinue.tsx +21 -9
 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"file":"toLanguageModelMessages.d.ts","sourceRoot":"","sources":["../../../../src/runtimes/edge/converters/toLanguageModelMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,sBAAsB,EAIvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,WAAW,EACX,aAAa,EAGd,MAAM,+BAA+B,CAAC; 
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"file":"toLanguageModelMessages.d.ts","sourceRoot":"","sources":["../../../../src/runtimes/edge/converters/toLanguageModelMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,sBAAsB,EAIvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,WAAW,EACX,aAAa,EAGd,MAAM,+BAA+B,CAAC;AAgEvC,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,aAAa,EAAE,EAC1D,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAO,GACzD,sBAAsB,EAAE,CAmG1B"}
         
     | 
| 
         @@ -60,8 +60,8 @@ var assistantMessageSplitter = () => { 
     | 
|
| 
       60 
60 
     | 
    
         
             
                    type: "tool-result",
         
     | 
| 
       61 
61 
     | 
    
         
             
                    toolCallId: part.toolCallId,
         
     | 
| 
       62 
62 
     | 
    
         
             
                    toolName: part.toolName,
         
     | 
| 
       63 
     | 
    
         
            -
                    result: part.result  
     | 
| 
       64 
     | 
    
         
            -
                    isError: part.isError ??  
     | 
| 
      
 63 
     | 
    
         
            +
                    result: part.result === void 0 ? "Error: tool is has no configured code to run" : part.result,
         
     | 
| 
      
 64 
     | 
    
         
            +
                    isError: part.isError ?? part.result === void 0
         
     | 
| 
       65 
65 
     | 
    
         
             
                  });
         
     | 
| 
       66 
66 
     | 
    
         
             
                },
         
     | 
| 
       67 
67 
     | 
    
         
             
                getMessages: () => {
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"sources":["../../../../src/runtimes/edge/converters/toLanguageModelMessages.ts"],"sourcesContent":["import {\n  LanguageModelV1FilePart,\n  LanguageModelV1ImagePart,\n  LanguageModelV1Message,\n  LanguageModelV1TextPart,\n  LanguageModelV1ToolCallPart,\n  LanguageModelV1ToolResultPart,\n} from \"@ai-sdk/provider\";\nimport {\n  CoreMessage,\n  ThreadMessage,\n  TextContentPart,\n  CoreToolCallContentPart,\n} from \"../../../types/AssistantTypes\";\n\nconst assistantMessageSplitter = () => {\n  const stash: LanguageModelV1Message[] = [];\n  let assistantMessage = {\n    role: \"assistant\" as const,\n    content: [] as (LanguageModelV1TextPart | LanguageModelV1ToolCallPart)[],\n  };\n  let toolMessage = {\n    role: \"tool\" as const,\n    content: [] as LanguageModelV1ToolResultPart[],\n  };\n\n  return {\n    addTextContentPart: (part: TextContentPart) => {\n      if (toolMessage.content.length > 0) {\n        stash.push(assistantMessage);\n        stash.push(toolMessage);\n\n        assistantMessage = {\n          role: \"assistant\" as const,\n          content: [] as (\n            | LanguageModelV1TextPart\n            | LanguageModelV1ToolCallPart\n          )[],\n        };\n\n        toolMessage = {\n          role: \"tool\" as const,\n          content: [] as LanguageModelV1ToolResultPart[],\n        };\n      }\n\n      assistantMessage.content.push(part);\n    },\n    addToolCallPart: (part: CoreToolCallContentPart) => {\n      assistantMessage.content.push({\n        type: \"tool-call\",\n        toolCallId: part.toolCallId,\n        toolName: part.toolName,\n        args: part.args,\n      });\n\n      toolMessage.content.push({\n        type: \"tool-result\",\n        toolCallId: part.toolCallId,\n        toolName: part.toolName,\n        result 
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"sources":["../../../../src/runtimes/edge/converters/toLanguageModelMessages.ts"],"sourcesContent":["import {\n  LanguageModelV1FilePart,\n  LanguageModelV1ImagePart,\n  LanguageModelV1Message,\n  LanguageModelV1TextPart,\n  LanguageModelV1ToolCallPart,\n  LanguageModelV1ToolResultPart,\n} from \"@ai-sdk/provider\";\nimport {\n  CoreMessage,\n  ThreadMessage,\n  TextContentPart,\n  CoreToolCallContentPart,\n} from \"../../../types/AssistantTypes\";\n\nconst assistantMessageSplitter = () => {\n  const stash: LanguageModelV1Message[] = [];\n  let assistantMessage = {\n    role: \"assistant\" as const,\n    content: [] as (LanguageModelV1TextPart | LanguageModelV1ToolCallPart)[],\n  };\n  let toolMessage = {\n    role: \"tool\" as const,\n    content: [] as LanguageModelV1ToolResultPart[],\n  };\n\n  return {\n    addTextContentPart: (part: TextContentPart) => {\n      if (toolMessage.content.length > 0) {\n        stash.push(assistantMessage);\n        stash.push(toolMessage);\n\n        assistantMessage = {\n          role: \"assistant\" as const,\n          content: [] as (\n            | LanguageModelV1TextPart\n            | LanguageModelV1ToolCallPart\n          )[],\n        };\n\n        toolMessage = {\n          role: \"tool\" as const,\n          content: [] as LanguageModelV1ToolResultPart[],\n        };\n      }\n\n      assistantMessage.content.push(part);\n    },\n    addToolCallPart: (part: CoreToolCallContentPart) => {\n      assistantMessage.content.push({\n        type: \"tool-call\",\n        toolCallId: part.toolCallId,\n        toolName: part.toolName,\n        args: part.args,\n      });\n\n      toolMessage.content.push({\n        type: \"tool-result\",\n        toolCallId: part.toolCallId,\n        toolName: part.toolName,\n        result:\n          part.result === undefined\n            ? \"Error: tool is has no configured code to run\"\n            : part.result,\n        isError: part.isError ?? part.result === undefined,\n      });\n    },\n    getMessages: () => {\n      if (toolMessage.content.length > 0) {\n        return [...stash, assistantMessage, toolMessage];\n      }\n\n      return [...stash, assistantMessage];\n    },\n  };\n};\n\nexport function toLanguageModelMessages(\n  message: readonly CoreMessage[] | readonly ThreadMessage[],\n  options: { unstable_includeId?: boolean | undefined } = {},\n): LanguageModelV1Message[] {\n  const includeId = options.unstable_includeId ?? false;\n  return message.flatMap((message) => {\n    const role = message.role;\n    switch (role) {\n      case \"system\": {\n        return [\n          {\n            ...(includeId\n              ? { unstable_id: (message as ThreadMessage).id }\n              : {}),\n            role: \"system\",\n            content: message.content[0].text,\n          },\n        ];\n      }\n\n      case \"user\": {\n        const attachments = \"attachments\" in message ? message.attachments : [];\n        const content = [\n          ...message.content,\n          ...attachments.map((a) => a.content).flat(),\n        ];\n        const msg: LanguageModelV1Message = {\n          ...(includeId ? { unstable_id: (message as ThreadMessage).id } : {}),\n          role: \"user\",\n          content: content.map(\n            (\n              part,\n            ):\n              | LanguageModelV1TextPart\n              | LanguageModelV1ImagePart\n              | LanguageModelV1FilePart => {\n              const type = part.type;\n              switch (type) {\n                case \"text\": {\n                  return part;\n                }\n\n                case \"image\": {\n                  return {\n                    type: \"image\",\n                    image: new URL(part.image),\n                  };\n                }\n\n                case \"file\": {\n                  return {\n                    type: \"file\",\n                    data: new URL(part.data),\n                    mimeType: part.mimeType,\n                  };\n                }\n\n                default: {\n                  const unhandledType: \"ui\" | \"audio\" = type;\n                  throw new Error(\n                    `Unspported content part type: ${unhandledType}`,\n                  );\n                }\n              }\n            },\n          ),\n        };\n        return [msg];\n      }\n\n      case \"assistant\": {\n        const splitter = assistantMessageSplitter();\n        for (const part of message.content) {\n          const type = part.type;\n          switch (type) {\n            case \"reasoning\": {\n              break; // reasoning parts are omitted\n            }\n\n            case \"text\": {\n              splitter.addTextContentPart(part);\n              break;\n            }\n            case \"tool-call\": {\n              splitter.addToolCallPart(part);\n              break;\n            }\n            default: {\n              const unhandledType: \"ui\" = type;\n              throw new Error(`Unhandled content part type: ${unhandledType}`);\n            }\n          }\n        }\n        return splitter.getMessages();\n      }\n\n      default: {\n        const unhandledRole: never = role;\n        throw new Error(`Unknown message role: ${unhandledRole}`);\n      }\n    }\n  });\n}\n"],"mappings":"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","names":["message"]}
         
     | 
| 
         @@ -36,8 +36,8 @@ var assistantMessageSplitter = () => { 
     | 
|
| 
       36 
36 
     | 
    
         
             
                    type: "tool-result",
         
     | 
| 
       37 
37 
     | 
    
         
             
                    toolCallId: part.toolCallId,
         
     | 
| 
       38 
38 
     | 
    
         
             
                    toolName: part.toolName,
         
     | 
| 
       39 
     | 
    
         
            -
                    result: part.result  
     | 
| 
       40 
     | 
    
         
            -
                    isError: part.isError ??  
     | 
| 
      
 39 
     | 
    
         
            +
                    result: part.result === void 0 ? "Error: tool is has no configured code to run" : part.result,
         
     | 
| 
      
 40 
     | 
    
         
            +
                    isError: part.isError ?? part.result === void 0
         
     | 
| 
       41 
41 
     | 
    
         
             
                  });
         
     | 
| 
       42 
42 
     | 
    
         
             
                },
         
     | 
| 
       43 
43 
     | 
    
         
             
                getMessages: () => {
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"sources":["../../../../src/runtimes/edge/converters/toLanguageModelMessages.ts"],"sourcesContent":["import {\n  LanguageModelV1FilePart,\n  LanguageModelV1ImagePart,\n  LanguageModelV1Message,\n  LanguageModelV1TextPart,\n  LanguageModelV1ToolCallPart,\n  LanguageModelV1ToolResultPart,\n} from \"@ai-sdk/provider\";\nimport {\n  CoreMessage,\n  ThreadMessage,\n  TextContentPart,\n  CoreToolCallContentPart,\n} from \"../../../types/AssistantTypes\";\n\nconst assistantMessageSplitter = () => {\n  const stash: LanguageModelV1Message[] = [];\n  let assistantMessage = {\n    role: \"assistant\" as const,\n    content: [] as (LanguageModelV1TextPart | LanguageModelV1ToolCallPart)[],\n  };\n  let toolMessage = {\n    role: \"tool\" as const,\n    content: [] as LanguageModelV1ToolResultPart[],\n  };\n\n  return {\n    addTextContentPart: (part: TextContentPart) => {\n      if (toolMessage.content.length > 0) {\n        stash.push(assistantMessage);\n        stash.push(toolMessage);\n\n        assistantMessage = {\n          role: \"assistant\" as const,\n          content: [] as (\n            | LanguageModelV1TextPart\n            | LanguageModelV1ToolCallPart\n          )[],\n        };\n\n        toolMessage = {\n          role: \"tool\" as const,\n          content: [] as LanguageModelV1ToolResultPart[],\n        };\n      }\n\n      assistantMessage.content.push(part);\n    },\n    addToolCallPart: (part: CoreToolCallContentPart) => {\n      assistantMessage.content.push({\n        type: \"tool-call\",\n        toolCallId: part.toolCallId,\n        toolName: part.toolName,\n        args: part.args,\n      });\n\n      toolMessage.content.push({\n        type: \"tool-result\",\n        toolCallId: part.toolCallId,\n        toolName: part.toolName,\n        result 
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"sources":["../../../../src/runtimes/edge/converters/toLanguageModelMessages.ts"],"sourcesContent":["import {\n  LanguageModelV1FilePart,\n  LanguageModelV1ImagePart,\n  LanguageModelV1Message,\n  LanguageModelV1TextPart,\n  LanguageModelV1ToolCallPart,\n  LanguageModelV1ToolResultPart,\n} from \"@ai-sdk/provider\";\nimport {\n  CoreMessage,\n  ThreadMessage,\n  TextContentPart,\n  CoreToolCallContentPart,\n} from \"../../../types/AssistantTypes\";\n\nconst assistantMessageSplitter = () => {\n  const stash: LanguageModelV1Message[] = [];\n  let assistantMessage = {\n    role: \"assistant\" as const,\n    content: [] as (LanguageModelV1TextPart | LanguageModelV1ToolCallPart)[],\n  };\n  let toolMessage = {\n    role: \"tool\" as const,\n    content: [] as LanguageModelV1ToolResultPart[],\n  };\n\n  return {\n    addTextContentPart: (part: TextContentPart) => {\n      if (toolMessage.content.length > 0) {\n        stash.push(assistantMessage);\n        stash.push(toolMessage);\n\n        assistantMessage = {\n          role: \"assistant\" as const,\n          content: [] as (\n            | LanguageModelV1TextPart\n            | LanguageModelV1ToolCallPart\n          )[],\n        };\n\n        toolMessage = {\n          role: \"tool\" as const,\n          content: [] as LanguageModelV1ToolResultPart[],\n        };\n      }\n\n      assistantMessage.content.push(part);\n    },\n    addToolCallPart: (part: CoreToolCallContentPart) => {\n      assistantMessage.content.push({\n        type: \"tool-call\",\n        toolCallId: part.toolCallId,\n        toolName: part.toolName,\n        args: part.args,\n      });\n\n      toolMessage.content.push({\n        type: \"tool-result\",\n        toolCallId: part.toolCallId,\n        toolName: part.toolName,\n        result:\n          part.result === undefined\n            ? \"Error: tool is has no configured code to run\"\n            : part.result,\n        isError: part.isError ?? part.result === undefined,\n      });\n    },\n    getMessages: () => {\n      if (toolMessage.content.length > 0) {\n        return [...stash, assistantMessage, toolMessage];\n      }\n\n      return [...stash, assistantMessage];\n    },\n  };\n};\n\nexport function toLanguageModelMessages(\n  message: readonly CoreMessage[] | readonly ThreadMessage[],\n  options: { unstable_includeId?: boolean | undefined } = {},\n): LanguageModelV1Message[] {\n  const includeId = options.unstable_includeId ?? false;\n  return message.flatMap((message) => {\n    const role = message.role;\n    switch (role) {\n      case \"system\": {\n        return [\n          {\n            ...(includeId\n              ? { unstable_id: (message as ThreadMessage).id }\n              : {}),\n            role: \"system\",\n            content: message.content[0].text,\n          },\n        ];\n      }\n\n      case \"user\": {\n        const attachments = \"attachments\" in message ? message.attachments : [];\n        const content = [\n          ...message.content,\n          ...attachments.map((a) => a.content).flat(),\n        ];\n        const msg: LanguageModelV1Message = {\n          ...(includeId ? { unstable_id: (message as ThreadMessage).id } : {}),\n          role: \"user\",\n          content: content.map(\n            (\n              part,\n            ):\n              | LanguageModelV1TextPart\n              | LanguageModelV1ImagePart\n              | LanguageModelV1FilePart => {\n              const type = part.type;\n              switch (type) {\n                case \"text\": {\n                  return part;\n                }\n\n                case \"image\": {\n                  return {\n                    type: \"image\",\n                    image: new URL(part.image),\n                  };\n                }\n\n                case \"file\": {\n                  return {\n                    type: \"file\",\n                    data: new URL(part.data),\n                    mimeType: part.mimeType,\n                  };\n                }\n\n                default: {\n                  const unhandledType: \"ui\" | \"audio\" = type;\n                  throw new Error(\n                    `Unspported content part type: ${unhandledType}`,\n                  );\n                }\n              }\n            },\n          ),\n        };\n        return [msg];\n      }\n\n      case \"assistant\": {\n        const splitter = assistantMessageSplitter();\n        for (const part of message.content) {\n          const type = part.type;\n          switch (type) {\n            case \"reasoning\": {\n              break; // reasoning parts are omitted\n            }\n\n            case \"text\": {\n              splitter.addTextContentPart(part);\n              break;\n            }\n            case \"tool-call\": {\n              splitter.addToolCallPart(part);\n              break;\n            }\n            default: {\n              const unhandledType: \"ui\" = type;\n              throw new Error(`Unhandled content part type: ${unhandledType}`);\n            }\n          }\n        }\n        return splitter.getMessages();\n      }\n\n      default: {\n        const unhandledRole: never = role;\n        throw new Error(`Unknown message role: ${unhandledRole}`);\n      }\n    }\n  });\n}\n"],"mappings":";AAeA,IAAM,2BAA2B,MAAM;AACrC,QAAM,QAAkC,CAAC;AACzC,MAAI,mBAAmB;AAAA,IACrB,MAAM;AAAA,IACN,SAAS,CAAC;AAAA,EACZ;AACA,MAAI,cAAc;AAAA,IAChB,MAAM;AAAA,IACN,SAAS,CAAC;AAAA,EACZ;AAEA,SAAO;AAAA,IACL,oBAAoB,CAAC,SAA0B;AAC7C,UAAI,YAAY,QAAQ,SAAS,GAAG;AAClC,cAAM,KAAK,gBAAgB;AAC3B,cAAM,KAAK,WAAW;AAEtB,2BAAmB;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,CAAC;AAAA,QAIZ;AAEA,sBAAc;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,CAAC;AAAA,QACZ;AAAA,MACF;AAEA,uBAAiB,QAAQ,KAAK,IAAI;AAAA,IACpC;AAAA,IACA,iBAAiB,CAAC,SAAkC;AAClD,uBAAiB,QAAQ,KAAK;AAAA,QAC5B,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,MACb,CAAC;AAED,kBAAY,QAAQ,KAAK;AAAA,QACvB,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,UAAU,KAAK;AAAA,QACf,QACE,KAAK,WAAW,SACZ,iDACA,KAAK;AAAA,QACX,SAAS,KAAK,WAAW,KAAK,WAAW;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,IACA,aAAa,MAAM;AACjB,UAAI,YAAY,QAAQ,SAAS,GAAG;AAClC,eAAO,CAAC,GAAG,OAAO,kBAAkB,WAAW;AAAA,MACjD;AAEA,aAAO,CAAC,GAAG,OAAO,gBAAgB;AAAA,IACpC;AAAA,EACF;AACF;AAEO,SAAS,wBACd,SACA,UAAwD,CAAC,GAC/B;AAC1B,QAAM,YAAY,QAAQ,sBAAsB;AAChD,SAAO,QAAQ,QAAQ,CAACA,aAAY;AAClC,UAAM,OAAOA,SAAQ;AACrB,YAAQ,MAAM;AAAA,MACZ,KAAK,UAAU;AACb,eAAO;AAAA,UACL;AAAA,YACE,GAAI,YACA,EAAE,aAAcA,SAA0B,GAAG,IAC7C,CAAC;AAAA,YACL,MAAM;AAAA,YACN,SAASA,SAAQ,QAAQ,CAAC,EAAE;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,cAAM,cAAc,iBAAiBA,WAAUA,SAAQ,cAAc,CAAC;AACtE,cAAM,UAAU;AAAA,UACd,GAAGA,SAAQ;AAAA,UACX,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK;AAAA,QAC5C;AACA,cAAM,MAA8B;AAAA,UAClC,GAAI,YAAY,EAAE,aAAcA,SAA0B,GAAG,IAAI,CAAC;AAAA,UAClE,MAAM;AAAA,UACN,SAAS,QAAQ;AAAA,YACf,CACE,SAI6B;AAC7B,oBAAM,OAAO,KAAK;AAClB,sBAAQ,MAAM;AAAA,gBACZ,KAAK,QAAQ;AACX,yBAAO;AAAA,gBACT;AAAA,gBAEA,KAAK,SAAS;AACZ,yBAAO;AAAA,oBACL,MAAM;AAAA,oBACN,OAAO,IAAI,IAAI,KAAK,KAAK;AAAA,kBAC3B;AAAA,gBACF;AAAA,gBAEA,KAAK,QAAQ;AACX,yBAAO;AAAA,oBACL,MAAM;AAAA,oBACN,MAAM,IAAI,IAAI,KAAK,IAAI;AAAA,oBACvB,UAAU,KAAK;AAAA,kBACjB;AAAA,gBACF;AAAA,gBAEA,SAAS;AACP,wBAAM,gBAAgC;AACtC,wBAAM,IAAI;AAAA,oBACR,iCAAiC,aAAa;AAAA,kBAChD;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,eAAO,CAAC,GAAG;AAAA,MACb;AAAA,MAEA,KAAK,aAAa;AAChB,cAAM,WAAW,yBAAyB;AAC1C,mBAAW,QAAQA,SAAQ,SAAS;AAClC,gBAAM,OAAO,KAAK;AAClB,kBAAQ,MAAM;AAAA,YACZ,KAAK,aAAa;AAChB;AAAA,YACF;AAAA,YAEA,KAAK,QAAQ;AACX,uBAAS,mBAAmB,IAAI;AAChC;AAAA,YACF;AAAA,YACA,KAAK,aAAa;AAChB,uBAAS,gBAAgB,IAAI;AAC7B;AAAA,YACF;AAAA,YACA,SAAS;AACP,oBAAM,gBAAsB;AAC5B,oBAAM,IAAI,MAAM,gCAAgC,aAAa,EAAE;AAAA,YACjE;AAAA,UACF;AAAA,QACF;AACA,eAAO,SAAS,YAAY;AAAA,MAC9B;AAAA,MAEA,SAAS;AACP,cAAM,gBAAuB;AAC7B,cAAM,IAAI,MAAM,yBAAyB,aAAa,EAAE;AAAA,MAC1D;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":["message"]}
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"sources":["../../../../src/runtimes/edge/streams/toolResultStream.ts"],"sourcesContent":["import { Tool } from \"../../../model-context/ModelContextTypes\";\nimport { LanguageModelV1StreamPart } from \"@ai-sdk/provider\";\nimport { z } from \"zod\";\nimport sjson from \"secure-json-parse\";\nimport { ReadonlyJSONValue } from \"../../../utils/json/json-value\";\n\nexport type ToolResultStreamPart =\n  | LanguageModelV1StreamPart\n  | {\n      type: \"annotations\";\n      annotations: ReadonlyJSONValue[];\n    }\n  | {\n      type: \"data\";\n      data: ReadonlyJSONValue[];\n    }\n  | {\n      type: \"tool-result\";\n      toolCallType: \"function\";\n      toolCallId: string;\n      toolName: string;\n      result: unknown;\n      isError?: boolean;\n    }\n  | {\n      type: \"step-finish\";\n      finishReason:\n        | \"stop\"\n        | \"length\"\n        | \"content-filter\"\n        | \"tool-calls\"\n        | \"error\"\n        | \"other\"\n        | \"unknown\";\n      usage: {\n        promptTokens: number;\n        completionTokens: number;\n      };\n      isContinued: boolean;\n    };\n\nexport function toolResultStream(\n  tools: Record<string, Tool> | undefined,\n  abortSignal: AbortSignal,\n) {\n  const toolCallExecutions = new Map<string, Promise<any>>();\n\n  return new TransformStream<ToolResultStreamPart, ToolResultStreamPart>({\n    transform(chunk, controller) {\n      // forward everything\n      controller.enqueue(chunk);\n\n      // handle tool calls\n      const chunkType = chunk.type;\n      switch (chunkType) {\n        case \"tool-call\": {\n          const { toolCallId, toolCallType, toolName, args: argsText } = chunk;\n          const tool = tools?.[toolName];\n          if (!tool || !tool.execute) return;\n\n          let args;\n          try {\n            args = sjson.parse(argsText);\n          } catch (e) {\n            controller.enqueue({\n              type: \"tool-result\",\n              toolCallType,\n              toolCallId,\n              toolName,\n              result:\n                \"Function parameter parsing failed. \" +\n                JSON.stringify((e as Error).message),\n              isError: true,\n            });\n            return;\n          }\n\n          toolCallExecutions.set(\n            toolCallId,\n            (async () => {\n              if (!tool.execute) return;\n\n              let executeFn = tool.execute;\n\n              if (tool.parameters instanceof z.ZodType) {\n                const result = tool.parameters.safeParse(args);\n                if (!result.success) {\n                  executeFn =\n                    tool.experimental_onSchemaValidationError ??\n                    (() => {\n                      throw (\n                        \"Function parameter validation failed. \" +\n                        JSON.stringify(result.error.issues)\n                      );\n                    });\n                }\n              }\n\n              try {\n                const result = await executeFn(args, {\n                  toolCallId,\n                  abortSignal,\n                });\n\n                controller.enqueue({\n                  type: \"tool-result\",\n                  toolCallType,\n                  toolCallId,\n                  toolName,\n                  result,\n                });\n              } catch (error) {\n                controller.enqueue({\n                  type: \"tool-result\",\n                  toolCallType,\n                  toolCallId,\n                  toolName,\n                  result: \"Error: \" + error,\n                  isError: true,\n                });\n              } finally {\n                toolCallExecutions.delete(toolCallId);\n              }\n            })(),\n          );\n          break;\n        }\n\n        // ignore other parts\n        case \"text-delta\":\n        case \"reasoning\":\n        case \"tool-call-delta\":\n        case \"tool-result\":\n        case \"step-finish\":\n        case \"finish\":\n        case \"error\":\n        case \"response-metadata\":\n        case \"annotations\":\n        case \"data\":\n          break;\n\n        default: {\n          const unhandledType: never = chunkType;\n          throw new Error(`Unhandled chunk type: ${unhandledType}`);\n        }\n      }\n    },\n\n    async flush() {\n      await Promise.all(toolCallExecutions.values());\n    },\n  });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,iBAAkB;AAClB,+BAAkB;AAsCX,SAAS,iBACd,OACA,aACA;AACA,QAAM,qBAAqB,oBAAI,IAA0B;AAEzD,SAAO,IAAI,gBAA4D;AAAA,IACrE,UAAU,OAAO,YAAY;AAE3B,iBAAW,QAAQ,KAAK;AAGxB,YAAM,YAAY,MAAM;AACxB,cAAQ,WAAW;AAAA,QACjB,KAAK,aAAa;AAChB,gBAAM,EAAE,YAAY,cAAc,UAAU,MAAM,SAAS,IAAI;AAC/D,gBAAM,OAAO,QAAQ,QAAQ;AAC7B,cAAI,CAAC,QAAQ,CAAC,KAAK,QAAS;AAE5B,cAAI;AACJ,cAAI;AACF,mBAAO,yBAAAA,QAAM,MAAM,QAAQ;AAAA,UAC7B,SAAS,GAAG;AACV,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA,QACE,wCACA,KAAK,UAAW,EAAY,OAAO;AAAA,cACrC,SAAS;AAAA,YACX,CAAC;AACD;AAAA,UACF;AAEA,6BAAmB;AAAA,YACjB;AAAA,aACC,YAAY;AACX,kBAAI,CAAC,KAAK,QAAS;AAEnB,kBAAI,YAAY,KAAK;AAErB,kBAAI,KAAK,sBAAsB,aAAE,SAAS;AACxC,sBAAM,SAAS,KAAK,WAAW,UAAU,IAAI;AAC7C,oBAAI,CAAC,OAAO,SAAS;AACnB,8BACE,KAAK,yCACJ,MAAM;AACL,0BACE,2CACA,KAAK,UAAU,OAAO,MAAM,MAAM;AAAA,kBAEtC;AAAA,gBACJ;AAAA,cACF;AAEA,kBAAI;AACF,sBAAM,SAAS,MAAM,UAAU,MAAM;AAAA,kBACnC;AAAA,kBACA;AAAA,gBACF,CAAC;AAED,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA, 
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"sources":["../../../../src/runtimes/edge/streams/toolResultStream.ts"],"sourcesContent":["import { Tool } from \"../../../model-context/ModelContextTypes\";\nimport { LanguageModelV1StreamPart } from \"@ai-sdk/provider\";\nimport { z } from \"zod\";\nimport sjson from \"secure-json-parse\";\nimport { ReadonlyJSONValue } from \"../../../utils/json/json-value\";\n\nexport type ToolResultStreamPart =\n  | LanguageModelV1StreamPart\n  | {\n      type: \"annotations\";\n      annotations: ReadonlyJSONValue[];\n    }\n  | {\n      type: \"data\";\n      data: ReadonlyJSONValue[];\n    }\n  | {\n      type: \"tool-result\";\n      toolCallType: \"function\";\n      toolCallId: string;\n      toolName: string;\n      result: unknown;\n      isError?: boolean;\n    }\n  | {\n      type: \"step-finish\";\n      finishReason:\n        | \"stop\"\n        | \"length\"\n        | \"content-filter\"\n        | \"tool-calls\"\n        | \"error\"\n        | \"other\"\n        | \"unknown\";\n      usage: {\n        promptTokens: number;\n        completionTokens: number;\n      };\n      isContinued: boolean;\n    };\n\nexport function toolResultStream(\n  tools: Record<string, Tool> | undefined,\n  abortSignal: AbortSignal,\n) {\n  const toolCallExecutions = new Map<string, Promise<any>>();\n\n  return new TransformStream<ToolResultStreamPart, ToolResultStreamPart>({\n    transform(chunk, controller) {\n      // forward everything\n      controller.enqueue(chunk);\n\n      // handle tool calls\n      const chunkType = chunk.type;\n      switch (chunkType) {\n        case \"tool-call\": {\n          const { toolCallId, toolCallType, toolName, args: argsText } = chunk;\n          const tool = tools?.[toolName];\n          if (!tool || !tool.execute) return;\n\n          let args;\n          try {\n            args = sjson.parse(argsText);\n          } catch (e) {\n            controller.enqueue({\n              type: \"tool-result\",\n              toolCallType,\n              toolCallId,\n              toolName,\n              result:\n                \"Function parameter parsing failed. \" +\n                JSON.stringify((e as Error).message),\n              isError: true,\n            });\n            return;\n          }\n\n          toolCallExecutions.set(\n            toolCallId,\n            (async () => {\n              if (!tool.execute) return;\n\n              let executeFn = tool.execute;\n\n              if (tool.parameters instanceof z.ZodType) {\n                const result = tool.parameters.safeParse(args);\n                if (!result.success) {\n                  executeFn =\n                    tool.experimental_onSchemaValidationError ??\n                    (() => {\n                      throw (\n                        \"Function parameter validation failed. \" +\n                        JSON.stringify(result.error.issues)\n                      );\n                    });\n                }\n              }\n\n              try {\n                const result = await executeFn(args, {\n                  toolCallId,\n                  abortSignal,\n                });\n\n                controller.enqueue({\n                  type: \"tool-result\",\n                  toolCallType,\n                  toolCallId,\n                  toolName,\n                  result: result === undefined ? \"<no result>\" : result,\n                });\n              } catch (error) {\n                controller.enqueue({\n                  type: \"tool-result\",\n                  toolCallType,\n                  toolCallId,\n                  toolName,\n                  result: \"Error: \" + error,\n                  isError: true,\n                });\n              } finally {\n                toolCallExecutions.delete(toolCallId);\n              }\n            })(),\n          );\n          break;\n        }\n\n        // ignore other parts\n        case \"text-delta\":\n        case \"reasoning\":\n        case \"tool-call-delta\":\n        case \"tool-result\":\n        case \"step-finish\":\n        case \"finish\":\n        case \"error\":\n        case \"response-metadata\":\n        case \"annotations\":\n        case \"data\":\n          break;\n\n        default: {\n          const unhandledType: never = chunkType;\n          throw new Error(`Unhandled chunk type: ${unhandledType}`);\n        }\n      }\n    },\n\n    async flush() {\n      await Promise.all(toolCallExecutions.values());\n    },\n  });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,iBAAkB;AAClB,+BAAkB;AAsCX,SAAS,iBACd,OACA,aACA;AACA,QAAM,qBAAqB,oBAAI,IAA0B;AAEzD,SAAO,IAAI,gBAA4D;AAAA,IACrE,UAAU,OAAO,YAAY;AAE3B,iBAAW,QAAQ,KAAK;AAGxB,YAAM,YAAY,MAAM;AACxB,cAAQ,WAAW;AAAA,QACjB,KAAK,aAAa;AAChB,gBAAM,EAAE,YAAY,cAAc,UAAU,MAAM,SAAS,IAAI;AAC/D,gBAAM,OAAO,QAAQ,QAAQ;AAC7B,cAAI,CAAC,QAAQ,CAAC,KAAK,QAAS;AAE5B,cAAI;AACJ,cAAI;AACF,mBAAO,yBAAAA,QAAM,MAAM,QAAQ;AAAA,UAC7B,SAAS,GAAG;AACV,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA,QACE,wCACA,KAAK,UAAW,EAAY,OAAO;AAAA,cACrC,SAAS;AAAA,YACX,CAAC;AACD;AAAA,UACF;AAEA,6BAAmB;AAAA,YACjB;AAAA,aACC,YAAY;AACX,kBAAI,CAAC,KAAK,QAAS;AAEnB,kBAAI,YAAY,KAAK;AAErB,kBAAI,KAAK,sBAAsB,aAAE,SAAS;AACxC,sBAAM,SAAS,KAAK,WAAW,UAAU,IAAI;AAC7C,oBAAI,CAAC,OAAO,SAAS;AACnB,8BACE,KAAK,yCACJ,MAAM;AACL,0BACE,2CACA,KAAK,UAAU,OAAO,MAAM,MAAM;AAAA,kBAEtC;AAAA,gBACJ;AAAA,cACF;AAEA,kBAAI;AACF,sBAAM,SAAS,MAAM,UAAU,MAAM;AAAA,kBACnC;AAAA,kBACA;AAAA,gBACF,CAAC;AAED,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,QAAQ,WAAW,SAAY,gBAAgB;AAAA,gBACjD,CAAC;AAAA,cACH,SAAS,OAAO;AACd,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,QAAQ,YAAY;AAAA,kBACpB,SAAS;AAAA,gBACX,CAAC;AAAA,cACH,UAAE;AACA,mCAAmB,OAAO,UAAU;AAAA,cACtC;AAAA,YACF,GAAG;AAAA,UACL;AACA;AAAA,QACF;AAAA;AAAA,QAGA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH;AAAA,QAEF,SAAS;AACP,gBAAM,gBAAuB;AAC7B,gBAAM,IAAI,MAAM,yBAAyB,aAAa,EAAE;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,QAAQ;AACZ,YAAM,QAAQ,IAAI,mBAAmB,OAAO,CAAC;AAAA,IAC/C;AAAA,EACF,CAAC;AACH;","names":["sjson"]}
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"sources":["../../../../src/runtimes/edge/streams/toolResultStream.ts"],"sourcesContent":["import { Tool } from \"../../../model-context/ModelContextTypes\";\nimport { LanguageModelV1StreamPart } from \"@ai-sdk/provider\";\nimport { z } from \"zod\";\nimport sjson from \"secure-json-parse\";\nimport { ReadonlyJSONValue } from \"../../../utils/json/json-value\";\n\nexport type ToolResultStreamPart =\n  | LanguageModelV1StreamPart\n  | {\n      type: \"annotations\";\n      annotations: ReadonlyJSONValue[];\n    }\n  | {\n      type: \"data\";\n      data: ReadonlyJSONValue[];\n    }\n  | {\n      type: \"tool-result\";\n      toolCallType: \"function\";\n      toolCallId: string;\n      toolName: string;\n      result: unknown;\n      isError?: boolean;\n    }\n  | {\n      type: \"step-finish\";\n      finishReason:\n        | \"stop\"\n        | \"length\"\n        | \"content-filter\"\n        | \"tool-calls\"\n        | \"error\"\n        | \"other\"\n        | \"unknown\";\n      usage: {\n        promptTokens: number;\n        completionTokens: number;\n      };\n      isContinued: boolean;\n    };\n\nexport function toolResultStream(\n  tools: Record<string, Tool> | undefined,\n  abortSignal: AbortSignal,\n) {\n  const toolCallExecutions = new Map<string, Promise<any>>();\n\n  return new TransformStream<ToolResultStreamPart, ToolResultStreamPart>({\n    transform(chunk, controller) {\n      // forward everything\n      controller.enqueue(chunk);\n\n      // handle tool calls\n      const chunkType = chunk.type;\n      switch (chunkType) {\n        case \"tool-call\": {\n          const { toolCallId, toolCallType, toolName, args: argsText } = chunk;\n          const tool = tools?.[toolName];\n          if (!tool || !tool.execute) return;\n\n          let args;\n          try {\n            args = sjson.parse(argsText);\n          } catch (e) {\n            controller.enqueue({\n              type: \"tool-result\",\n              toolCallType,\n              toolCallId,\n              toolName,\n              result:\n                \"Function parameter parsing failed. \" +\n                JSON.stringify((e as Error).message),\n              isError: true,\n            });\n            return;\n          }\n\n          toolCallExecutions.set(\n            toolCallId,\n            (async () => {\n              if (!tool.execute) return;\n\n              let executeFn = tool.execute;\n\n              if (tool.parameters instanceof z.ZodType) {\n                const result = tool.parameters.safeParse(args);\n                if (!result.success) {\n                  executeFn =\n                    tool.experimental_onSchemaValidationError ??\n                    (() => {\n                      throw (\n                        \"Function parameter validation failed. \" +\n                        JSON.stringify(result.error.issues)\n                      );\n                    });\n                }\n              }\n\n              try {\n                const result = await executeFn(args, {\n                  toolCallId,\n                  abortSignal,\n                });\n\n                controller.enqueue({\n                  type: \"tool-result\",\n                  toolCallType,\n                  toolCallId,\n                  toolName,\n                  result,\n                });\n              } catch (error) {\n                controller.enqueue({\n                  type: \"tool-result\",\n                  toolCallType,\n                  toolCallId,\n                  toolName,\n                  result: \"Error: \" + error,\n                  isError: true,\n                });\n              } finally {\n                toolCallExecutions.delete(toolCallId);\n              }\n            })(),\n          );\n          break;\n        }\n\n        // ignore other parts\n        case \"text-delta\":\n        case \"reasoning\":\n        case \"tool-call-delta\":\n        case \"tool-result\":\n        case \"step-finish\":\n        case \"finish\":\n        case \"error\":\n        case \"response-metadata\":\n        case \"annotations\":\n        case \"data\":\n          break;\n\n        default: {\n          const unhandledType: never = chunkType;\n          throw new Error(`Unhandled chunk type: ${unhandledType}`);\n        }\n      }\n    },\n\n    async flush() {\n      await Promise.all(toolCallExecutions.values());\n    },\n  });\n}\n"],"mappings":";AAEA,SAAS,SAAS;AAClB,OAAO,WAAW;AAsCX,SAAS,iBACd,OACA,aACA;AACA,QAAM,qBAAqB,oBAAI,IAA0B;AAEzD,SAAO,IAAI,gBAA4D;AAAA,IACrE,UAAU,OAAO,YAAY;AAE3B,iBAAW,QAAQ,KAAK;AAGxB,YAAM,YAAY,MAAM;AACxB,cAAQ,WAAW;AAAA,QACjB,KAAK,aAAa;AAChB,gBAAM,EAAE,YAAY,cAAc,UAAU,MAAM,SAAS,IAAI;AAC/D,gBAAM,OAAO,QAAQ,QAAQ;AAC7B,cAAI,CAAC,QAAQ,CAAC,KAAK,QAAS;AAE5B,cAAI;AACJ,cAAI;AACF,mBAAO,MAAM,MAAM,QAAQ;AAAA,UAC7B,SAAS,GAAG;AACV,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA,QACE,wCACA,KAAK,UAAW,EAAY,OAAO;AAAA,cACrC,SAAS;AAAA,YACX,CAAC;AACD;AAAA,UACF;AAEA,6BAAmB;AAAA,YACjB;AAAA,aACC,YAAY;AACX,kBAAI,CAAC,KAAK,QAAS;AAEnB,kBAAI,YAAY,KAAK;AAErB,kBAAI,KAAK,sBAAsB,EAAE,SAAS;AACxC,sBAAM,SAAS,KAAK,WAAW,UAAU,IAAI;AAC7C,oBAAI,CAAC,OAAO,SAAS;AACnB,8BACE,KAAK,yCACJ,MAAM;AACL,0BACE,2CACA,KAAK,UAAU,OAAO,MAAM,MAAM;AAAA,kBAEtC;AAAA,gBACJ;AAAA,cACF;AAEA,kBAAI;AACF,sBAAM,SAAS,MAAM,UAAU,MAAM;AAAA,kBACnC;AAAA,kBACA;AAAA,gBACF,CAAC;AAED,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA, 
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"sources":["../../../../src/runtimes/edge/streams/toolResultStream.ts"],"sourcesContent":["import { Tool } from \"../../../model-context/ModelContextTypes\";\nimport { LanguageModelV1StreamPart } from \"@ai-sdk/provider\";\nimport { z } from \"zod\";\nimport sjson from \"secure-json-parse\";\nimport { ReadonlyJSONValue } from \"../../../utils/json/json-value\";\n\nexport type ToolResultStreamPart =\n  | LanguageModelV1StreamPart\n  | {\n      type: \"annotations\";\n      annotations: ReadonlyJSONValue[];\n    }\n  | {\n      type: \"data\";\n      data: ReadonlyJSONValue[];\n    }\n  | {\n      type: \"tool-result\";\n      toolCallType: \"function\";\n      toolCallId: string;\n      toolName: string;\n      result: unknown;\n      isError?: boolean;\n    }\n  | {\n      type: \"step-finish\";\n      finishReason:\n        | \"stop\"\n        | \"length\"\n        | \"content-filter\"\n        | \"tool-calls\"\n        | \"error\"\n        | \"other\"\n        | \"unknown\";\n      usage: {\n        promptTokens: number;\n        completionTokens: number;\n      };\n      isContinued: boolean;\n    };\n\nexport function toolResultStream(\n  tools: Record<string, Tool> | undefined,\n  abortSignal: AbortSignal,\n) {\n  const toolCallExecutions = new Map<string, Promise<any>>();\n\n  return new TransformStream<ToolResultStreamPart, ToolResultStreamPart>({\n    transform(chunk, controller) {\n      // forward everything\n      controller.enqueue(chunk);\n\n      // handle tool calls\n      const chunkType = chunk.type;\n      switch (chunkType) {\n        case \"tool-call\": {\n          const { toolCallId, toolCallType, toolName, args: argsText } = chunk;\n          const tool = tools?.[toolName];\n          if (!tool || !tool.execute) return;\n\n          let args;\n          try {\n            args = sjson.parse(argsText);\n          } catch (e) {\n            controller.enqueue({\n              type: \"tool-result\",\n              toolCallType,\n              toolCallId,\n              toolName,\n              result:\n                \"Function parameter parsing failed. \" +\n                JSON.stringify((e as Error).message),\n              isError: true,\n            });\n            return;\n          }\n\n          toolCallExecutions.set(\n            toolCallId,\n            (async () => {\n              if (!tool.execute) return;\n\n              let executeFn = tool.execute;\n\n              if (tool.parameters instanceof z.ZodType) {\n                const result = tool.parameters.safeParse(args);\n                if (!result.success) {\n                  executeFn =\n                    tool.experimental_onSchemaValidationError ??\n                    (() => {\n                      throw (\n                        \"Function parameter validation failed. \" +\n                        JSON.stringify(result.error.issues)\n                      );\n                    });\n                }\n              }\n\n              try {\n                const result = await executeFn(args, {\n                  toolCallId,\n                  abortSignal,\n                });\n\n                controller.enqueue({\n                  type: \"tool-result\",\n                  toolCallType,\n                  toolCallId,\n                  toolName,\n                  result: result === undefined ? \"<no result>\" : result,\n                });\n              } catch (error) {\n                controller.enqueue({\n                  type: \"tool-result\",\n                  toolCallType,\n                  toolCallId,\n                  toolName,\n                  result: \"Error: \" + error,\n                  isError: true,\n                });\n              } finally {\n                toolCallExecutions.delete(toolCallId);\n              }\n            })(),\n          );\n          break;\n        }\n\n        // ignore other parts\n        case \"text-delta\":\n        case \"reasoning\":\n        case \"tool-call-delta\":\n        case \"tool-result\":\n        case \"step-finish\":\n        case \"finish\":\n        case \"error\":\n        case \"response-metadata\":\n        case \"annotations\":\n        case \"data\":\n          break;\n\n        default: {\n          const unhandledType: never = chunkType;\n          throw new Error(`Unhandled chunk type: ${unhandledType}`);\n        }\n      }\n    },\n\n    async flush() {\n      await Promise.all(toolCallExecutions.values());\n    },\n  });\n}\n"],"mappings":";AAEA,SAAS,SAAS;AAClB,OAAO,WAAW;AAsCX,SAAS,iBACd,OACA,aACA;AACA,QAAM,qBAAqB,oBAAI,IAA0B;AAEzD,SAAO,IAAI,gBAA4D;AAAA,IACrE,UAAU,OAAO,YAAY;AAE3B,iBAAW,QAAQ,KAAK;AAGxB,YAAM,YAAY,MAAM;AACxB,cAAQ,WAAW;AAAA,QACjB,KAAK,aAAa;AAChB,gBAAM,EAAE,YAAY,cAAc,UAAU,MAAM,SAAS,IAAI;AAC/D,gBAAM,OAAO,QAAQ,QAAQ;AAC7B,cAAI,CAAC,QAAQ,CAAC,KAAK,QAAS;AAE5B,cAAI;AACJ,cAAI;AACF,mBAAO,MAAM,MAAM,QAAQ;AAAA,UAC7B,SAAS,GAAG;AACV,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA,QACE,wCACA,KAAK,UAAW,EAAY,OAAO;AAAA,cACrC,SAAS;AAAA,YACX,CAAC;AACD;AAAA,UACF;AAEA,6BAAmB;AAAA,YACjB;AAAA,aACC,YAAY;AACX,kBAAI,CAAC,KAAK,QAAS;AAEnB,kBAAI,YAAY,KAAK;AAErB,kBAAI,KAAK,sBAAsB,EAAE,SAAS;AACxC,sBAAM,SAAS,KAAK,WAAW,UAAU,IAAI;AAC7C,oBAAI,CAAC,OAAO,SAAS;AACnB,8BACE,KAAK,yCACJ,MAAM;AACL,0BACE,2CACA,KAAK,UAAU,OAAO,MAAM,MAAM;AAAA,kBAEtC;AAAA,gBACJ;AAAA,cACF;AAEA,kBAAI;AACF,sBAAM,SAAS,MAAM,UAAU,MAAM;AAAA,kBACnC;AAAA,kBACA;AAAA,gBACF,CAAC;AAED,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,QAAQ,WAAW,SAAY,gBAAgB;AAAA,gBACjD,CAAC;AAAA,cACH,SAAS,OAAO;AACd,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,QAAQ,YAAY;AAAA,kBACpB,SAAS;AAAA,gBACX,CAAC;AAAA,cACH,UAAE;AACA,mCAAmB,OAAO,UAAU;AAAA,cACtC;AAAA,YACF,GAAG;AAAA,UACL;AACA;AAAA,QACF;AAAA;AAAA,QAGA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH;AAAA,QAEF,SAAS;AACP,gBAAM,gBAAuB;AAC7B,gBAAM,IAAI,MAAM,yBAAyB,aAAa,EAAE;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,QAAQ;AACZ,YAAM,QAAQ,IAAI,mBAAmB,OAAO,CAAC;AAAA,IAC/C;AAAA,EACF,CAAC;AACH;","names":[]}
         
     | 
| 
         @@ -15,10 +15,9 @@ export type LocalRuntimeOptionsBase = { 
     | 
|
| 
       15 
15 
     | 
    
         
             
                    feedback?: FeedbackAdapter | undefined;
         
     | 
| 
       16 
16 
     | 
    
         
             
                };
         
     | 
| 
       17 
17 
     | 
    
         
             
                /**
         
     | 
| 
       18 
     | 
    
         
            -
                 *  
     | 
| 
       19 
     | 
    
         
            -
                 * This feature will be removed in a future version without notice. DO NOT USE.
         
     | 
| 
      
 18 
     | 
    
         
            +
                 * Names of tools that are allowed to interrupt the run in order to wait for human/external approval.
         
     | 
| 
       20 
19 
     | 
    
         
             
                 */
         
     | 
| 
       21 
     | 
    
         
            -
                 
     | 
| 
      
 20 
     | 
    
         
            +
                unstable_humanToolNames?: string[] | undefined;
         
     | 
| 
       22 
21 
     | 
    
         
             
            };
         
     | 
| 
       23 
22 
     | 
    
         
             
            export type LocalRuntimeOptions = Omit<LocalRuntimeOptionsBase, "adapters"> & {
         
     | 
| 
       24 
23 
     | 
    
         
             
                cloud?: AssistantCloud | undefined;
         
     | 
| 
         @@ -37,8 +36,8 @@ export declare const splitLocalRuntimeOptions: <T extends LocalRuntimeOptions>(o 
     | 
|
| 
       37 
36 
     | 
    
         
             
                        speech?: SpeechSynthesisAdapter | undefined;
         
     | 
| 
       38 
37 
     | 
    
         
             
                        feedback?: FeedbackAdapter | undefined;
         
     | 
| 
       39 
38 
     | 
    
         
             
                    }, "chatModel"> | undefined;
         
     | 
| 
       40 
     | 
    
         
            -
                     
     | 
| 
      
 39 
     | 
    
         
            +
                    unstable_humanToolNames: string[] | undefined;
         
     | 
| 
       41 
40 
     | 
    
         
             
                };
         
     | 
| 
       42 
     | 
    
         
            -
                otherOptions: Omit<T, "adapters" | "maxSteps" | " 
     | 
| 
      
 41 
     | 
    
         
            +
                otherOptions: Omit<T, "adapters" | "maxSteps" | "unstable_humanToolNames" | "cloud" | "initialMessages">;
         
     | 
| 
       43 
42 
     | 
    
         
             
            };
         
     | 
| 
       44 
43 
     | 
    
         
             
            //# sourceMappingURL=LocalRuntimeOptions.d.ts.map
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"file":"LocalRuntimeOptions.d.ts","sourceRoot":"","sources":["../../../src/runtimes/local/LocalRuntimeOptions.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE;QACR,SAAS,EAAE,gBAAgB,CAAC;QAC5B,OAAO,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;QAC3C,WAAW,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;QAC5C,MAAM,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;QAC5C,QAAQ,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;KACxC,CAAC;IAEF 
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"file":"LocalRuntimeOptions.d.ts","sourceRoot":"","sources":["../../../src/runtimes/local/LocalRuntimeOptions.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iDAAiD,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE;QACR,SAAS,EAAE,gBAAgB,CAAC;QAC5B,OAAO,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;QAC3C,WAAW,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;QAC5C,MAAM,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;QAC5C,QAAQ,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;KACxC,CAAC;IAEF;;OAEG;IACH,uBAAuB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAChD,CAAC;AAGF,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,GAAG;IAC5E,KAAK,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC,eAAe,CAAC,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,EAAE,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC;CAC/E,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,mBAAmB,WAC3D,CAAC;;;;;;uBArBG,gBAAgB;sBACjB,oBAAoB,GAAG,SAAS;0BAC5B,iBAAiB,GAAG,SAAS;qBAClC,sBAAsB,GAAG,SAAS;uBAChC,eAAe,GAAG,SAAS;;;;;CAsCzC,CAAC"}
         
     | 
| 
         @@ -29,7 +29,7 @@ var splitLocalRuntimeOptions = (options) => { 
     | 
|
| 
       29 
29 
     | 
    
         
             
                initialMessages,
         
     | 
| 
       30 
30 
     | 
    
         
             
                maxSteps,
         
     | 
| 
       31 
31 
     | 
    
         
             
                adapters,
         
     | 
| 
       32 
     | 
    
         
            -
                 
     | 
| 
      
 32 
     | 
    
         
            +
                unstable_humanToolNames,
         
     | 
| 
       33 
33 
     | 
    
         
             
                ...rest
         
     | 
| 
       34 
34 
     | 
    
         
             
              } = options;
         
     | 
| 
       35 
35 
     | 
    
         
             
              return {
         
     | 
| 
         @@ -38,7 +38,7 @@ var splitLocalRuntimeOptions = (options) => { 
     | 
|
| 
       38 
38 
     | 
    
         
             
                  initialMessages,
         
     | 
| 
       39 
39 
     | 
    
         
             
                  maxSteps,
         
     | 
| 
       40 
40 
     | 
    
         
             
                  adapters,
         
     | 
| 
       41 
     | 
    
         
            -
                   
     | 
| 
      
 41 
     | 
    
         
            +
                  unstable_humanToolNames
         
     | 
| 
       42 
42 
     | 
    
         
             
                },
         
     | 
| 
       43 
43 
     | 
    
         
             
                otherOptions: rest
         
     | 
| 
       44 
44 
     | 
    
         
             
              };
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"sources":["../../../src/runtimes/local/LocalRuntimeOptions.tsx"],"sourcesContent":["import { ThreadHistoryAdapter } from \"../adapters/thread-history/ThreadHistoryAdapter\";\nimport { AttachmentAdapter } from \"../adapters/attachment/AttachmentAdapter\";\nimport { ThreadMessageLike } from \"../external-store\";\nimport { FeedbackAdapter } from \"../adapters/feedback/FeedbackAdapter\";\nimport { SpeechSynthesisAdapter } from \"../adapters/speech/SpeechAdapterTypes\";\nimport { ChatModelAdapter } from \"./ChatModelAdapter\";\nimport { AssistantCloud } from \"../../cloud\";\n\nexport type LocalRuntimeOptionsBase = {\n  maxSteps?: number | undefined;\n  adapters: {\n    chatModel: ChatModelAdapter;\n    history?: ThreadHistoryAdapter | undefined;\n    attachments?: AttachmentAdapter | undefined;\n    speech?: SpeechSynthesisAdapter | undefined;\n    feedback?: FeedbackAdapter | undefined;\n  };\n\n  /**\n   *  
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"sources":["../../../src/runtimes/local/LocalRuntimeOptions.tsx"],"sourcesContent":["import { ThreadHistoryAdapter } from \"../adapters/thread-history/ThreadHistoryAdapter\";\nimport { AttachmentAdapter } from \"../adapters/attachment/AttachmentAdapter\";\nimport { ThreadMessageLike } from \"../external-store\";\nimport { FeedbackAdapter } from \"../adapters/feedback/FeedbackAdapter\";\nimport { SpeechSynthesisAdapter } from \"../adapters/speech/SpeechAdapterTypes\";\nimport { ChatModelAdapter } from \"./ChatModelAdapter\";\nimport { AssistantCloud } from \"../../cloud\";\n\nexport type LocalRuntimeOptionsBase = {\n  maxSteps?: number | undefined;\n  adapters: {\n    chatModel: ChatModelAdapter;\n    history?: ThreadHistoryAdapter | undefined;\n    attachments?: AttachmentAdapter | undefined;\n    speech?: SpeechSynthesisAdapter | undefined;\n    feedback?: FeedbackAdapter | undefined;\n  };\n\n  /**\n   * Names of tools that are allowed to interrupt the run in order to wait for human/external approval.\n   */\n  unstable_humanToolNames?: string[] | undefined;\n};\n\n// TODO align LocalRuntimeOptions with LocalRuntimeOptionsBase\nexport type LocalRuntimeOptions = Omit<LocalRuntimeOptionsBase, \"adapters\"> & {\n  cloud?: AssistantCloud | undefined;\n  initialMessages?: readonly ThreadMessageLike[] | undefined;\n  adapters?: Omit<LocalRuntimeOptionsBase[\"adapters\"], \"chatModel\"> | undefined;\n};\n\nexport const splitLocalRuntimeOptions = <T extends LocalRuntimeOptions>(\n  options: T,\n) => {\n  const {\n    cloud,\n    initialMessages,\n    maxSteps,\n    adapters,\n    unstable_humanToolNames,\n    ...rest\n  } = options;\n\n  return {\n    localRuntimeOptions: {\n      cloud,\n      initialMessages,\n      maxSteps,\n      adapters,\n      unstable_humanToolNames,\n    },\n    otherOptions: rest,\n  };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BO,IAAM,2BAA2B,CACtC,YACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,SAAO;AAAA,IACL,qBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,cAAc;AAAA,EAChB;AACF;","names":[]}
         
     | 
| 
         @@ -5,7 +5,7 @@ var splitLocalRuntimeOptions = (options) => { 
     | 
|
| 
       5 
5 
     | 
    
         
             
                initialMessages,
         
     | 
| 
       6 
6 
     | 
    
         
             
                maxSteps,
         
     | 
| 
       7 
7 
     | 
    
         
             
                adapters,
         
     | 
| 
       8 
     | 
    
         
            -
                 
     | 
| 
      
 8 
     | 
    
         
            +
                unstable_humanToolNames,
         
     | 
| 
       9 
9 
     | 
    
         
             
                ...rest
         
     | 
| 
       10 
10 
     | 
    
         
             
              } = options;
         
     | 
| 
       11 
11 
     | 
    
         
             
              return {
         
     | 
| 
         @@ -14,7 +14,7 @@ var splitLocalRuntimeOptions = (options) => { 
     | 
|
| 
       14 
14 
     | 
    
         
             
                  initialMessages,
         
     | 
| 
       15 
15 
     | 
    
         
             
                  maxSteps,
         
     | 
| 
       16 
16 
     | 
    
         
             
                  adapters,
         
     | 
| 
       17 
     | 
    
         
            -
                   
     | 
| 
      
 17 
     | 
    
         
            +
                  unstable_humanToolNames
         
     | 
| 
       18 
18 
     | 
    
         
             
                },
         
     | 
| 
       19 
19 
     | 
    
         
             
                otherOptions: rest
         
     | 
| 
       20 
20 
     | 
    
         
             
              };
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"sources":["../../../src/runtimes/local/LocalRuntimeOptions.tsx"],"sourcesContent":["import { ThreadHistoryAdapter } from \"../adapters/thread-history/ThreadHistoryAdapter\";\nimport { AttachmentAdapter } from \"../adapters/attachment/AttachmentAdapter\";\nimport { ThreadMessageLike } from \"../external-store\";\nimport { FeedbackAdapter } from \"../adapters/feedback/FeedbackAdapter\";\nimport { SpeechSynthesisAdapter } from \"../adapters/speech/SpeechAdapterTypes\";\nimport { ChatModelAdapter } from \"./ChatModelAdapter\";\nimport { AssistantCloud } from \"../../cloud\";\n\nexport type LocalRuntimeOptionsBase = {\n  maxSteps?: number | undefined;\n  adapters: {\n    chatModel: ChatModelAdapter;\n    history?: ThreadHistoryAdapter | undefined;\n    attachments?: AttachmentAdapter | undefined;\n    speech?: SpeechSynthesisAdapter | undefined;\n    feedback?: FeedbackAdapter | undefined;\n  };\n\n  /**\n   *  
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"sources":["../../../src/runtimes/local/LocalRuntimeOptions.tsx"],"sourcesContent":["import { ThreadHistoryAdapter } from \"../adapters/thread-history/ThreadHistoryAdapter\";\nimport { AttachmentAdapter } from \"../adapters/attachment/AttachmentAdapter\";\nimport { ThreadMessageLike } from \"../external-store\";\nimport { FeedbackAdapter } from \"../adapters/feedback/FeedbackAdapter\";\nimport { SpeechSynthesisAdapter } from \"../adapters/speech/SpeechAdapterTypes\";\nimport { ChatModelAdapter } from \"./ChatModelAdapter\";\nimport { AssistantCloud } from \"../../cloud\";\n\nexport type LocalRuntimeOptionsBase = {\n  maxSteps?: number | undefined;\n  adapters: {\n    chatModel: ChatModelAdapter;\n    history?: ThreadHistoryAdapter | undefined;\n    attachments?: AttachmentAdapter | undefined;\n    speech?: SpeechSynthesisAdapter | undefined;\n    feedback?: FeedbackAdapter | undefined;\n  };\n\n  /**\n   * Names of tools that are allowed to interrupt the run in order to wait for human/external approval.\n   */\n  unstable_humanToolNames?: string[] | undefined;\n};\n\n// TODO align LocalRuntimeOptions with LocalRuntimeOptionsBase\nexport type LocalRuntimeOptions = Omit<LocalRuntimeOptionsBase, \"adapters\"> & {\n  cloud?: AssistantCloud | undefined;\n  initialMessages?: readonly ThreadMessageLike[] | undefined;\n  adapters?: Omit<LocalRuntimeOptionsBase[\"adapters\"], \"chatModel\"> | undefined;\n};\n\nexport const splitLocalRuntimeOptions = <T extends LocalRuntimeOptions>(\n  options: T,\n) => {\n  const {\n    cloud,\n    initialMessages,\n    maxSteps,\n    adapters,\n    unstable_humanToolNames,\n    ...rest\n  } = options;\n\n  return {\n    localRuntimeOptions: {\n      cloud,\n      initialMessages,\n      maxSteps,\n      adapters,\n      unstable_humanToolNames,\n    },\n    otherOptions: rest,\n  };\n};\n"],"mappings":";AA+BO,IAAM,2BAA2B,CACtC,YACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,SAAO;AAAA,IACL,qBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,cAAc;AAAA,EAChB;AACF;","names":[]}
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"file":"LocalThreadRuntimeCore.d.ts","sourceRoot":"","sources":["../../../src/runtimes/local/LocalThreadRuntimeCore.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAA0B,MAAM,aAAa,CAAC;AAIzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,qBAAa,sBACX,SAAQ,qBACR,YAAW,iBAAiB;IAE5B,SAAgB,YAAY;;;;;;;;;MAS1B;IAEF,OAAO,CAAC,eAAe,CAAgC;IAEvD,SAAgB,UAAU,SAAS;IACnC,SAAgB,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAM;IAE9D,IAAW,QAAQ;;;;;;MAElB;gBAGC,eAAe,EAAE,oBAAoB,EACrC,OAAO,EAAE,uBAAuB;IAMlC,OAAO,CAAC,QAAQ,CAA2B;IAE3C,OAAO,CAAC,cAAc,CAAiB;IAEvC,IAAW,MAAM,cAEhB;IAEM,qBAAqB,CAAC,OAAO,EAAE,uBAAuB;IA4B7D,OAAO,CAAC,YAAY,CAA4B;IACzC,eAAe;IAcT,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB7C,QAAQ,CAAC,EACpB,QAAQ,EACR,SAAS,GACV,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC; 
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"file":"LocalThreadRuntimeCore.d.ts","sourceRoot":"","sources":["../../../src/runtimes/local/LocalThreadRuntimeCore.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAA0B,MAAM,aAAa,CAAC;AAIzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,qBAAa,sBACX,SAAQ,qBACR,YAAW,iBAAiB;IAE5B,SAAgB,YAAY;;;;;;;;;MAS1B;IAEF,OAAO,CAAC,eAAe,CAAgC;IAEvD,SAAgB,UAAU,SAAS;IACnC,SAAgB,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAM;IAE9D,IAAW,QAAQ;;;;;;MAElB;gBAGC,eAAe,EAAE,oBAAoB,EACrC,OAAO,EAAE,uBAAuB;IAMlC,OAAO,CAAC,QAAQ,CAA2B;IAE3C,OAAO,CAAC,cAAc,CAAiB;IAEvC,IAAW,MAAM,cAEhB;IAEM,qBAAqB,CAAC,OAAO,EAAE,uBAAuB;IA4B7D,OAAO,CAAC,YAAY,CAA4B;IACzC,eAAe;IAcT,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB7C,QAAQ,CAAC,EACpB,QAAQ,EACR,SAAS,GACV,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAgCnB,gBAAgB;IAgJvB,SAAS;IAKT,aAAa,CAAC,EACnB,SAAS,EACT,UAAU,EACV,MAAM,GACP,EAAE,oBAAoB;CAqCxB"}
         
     | 
| 
         @@ -131,10 +131,7 @@ var LocalThreadRuntimeCore = class extends import_BaseThreadRuntimeCore.BaseThre 
     | 
|
| 
       131 
131 
     | 
    
         
             
                try {
         
     | 
| 
       132 
132 
     | 
    
         
             
                  do {
         
     | 
| 
       133 
133 
     | 
    
         
             
                    message = await this.performRoundtrip(parentId, message, runConfig);
         
     | 
| 
       134 
     | 
    
         
            -
                  } while ((0, import_shouldContinue.shouldContinue)(
         
     | 
| 
       135 
     | 
    
         
            -
                    message,
         
     | 
| 
       136 
     | 
    
         
            -
                    this._options.unstable_shouldContinueIgnoreToolNames ?? []
         
     | 
| 
       137 
     | 
    
         
            -
                  ));
         
     | 
| 
      
 134 
     | 
    
         
            +
                  } while ((0, import_shouldContinue.shouldContinue)(message, this._options.unstable_humanToolNames));
         
     | 
| 
       138 
135 
     | 
    
         
             
                } finally {
         
     | 
| 
       139 
136 
     | 
    
         
             
                  this._notifyEventSubscribers("run-end");
         
     | 
| 
       140 
137 
     | 
    
         
             
                }
         
     | 
| 
         @@ -277,10 +274,7 @@ var LocalThreadRuntimeCore = class extends import_BaseThreadRuntimeCore.BaseThre 
     | 
|
| 
       277 
274 
     | 
    
         
             
                  content: newContent
         
     | 
| 
       278 
275 
     | 
    
         
             
                };
         
     | 
| 
       279 
276 
     | 
    
         
             
                this.repository.addOrUpdateMessage(parentId, message);
         
     | 
| 
       280 
     | 
    
         
            -
                if (added && (0, import_shouldContinue.shouldContinue)(
         
     | 
| 
       281 
     | 
    
         
            -
                  message,
         
     | 
| 
       282 
     | 
    
         
            -
                  this._options.unstable_shouldContinueIgnoreToolNames ?? []
         
     | 
| 
       283 
     | 
    
         
            -
                )) {
         
     | 
| 
      
 277 
     | 
    
         
            +
                if (added && (0, import_shouldContinue.shouldContinue)(message, this._options.unstable_humanToolNames)) {
         
     | 
| 
       284 
278 
     | 
    
         
             
                  this.performRoundtrip(parentId, message, this._lastRunConfig);
         
     | 
| 
       285 
279 
     | 
    
         
             
                }
         
     | 
| 
       286 
280 
     | 
    
         
             
              }
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"sources":["../../../src/runtimes/local/LocalThreadRuntimeCore.tsx"],"sourcesContent":["import { generateId } from \"../../internal\";\nimport type { AppendMessage, ThreadAssistantMessage } from \"../../types\";\nimport { fromCoreMessage } from \"../edge\";\nimport type { ChatModelRunResult } from \"./ChatModelAdapter\";\nimport { shouldContinue } from \"./shouldContinue\";\nimport { LocalRuntimeOptionsBase } from \"./LocalRuntimeOptions\";\nimport {\n  AddToolResultOptions,\n  ThreadSuggestion,\n  ThreadRuntimeCore,\n  StartRunConfig,\n} from \"../core/ThreadRuntimeCore\";\nimport { BaseThreadRuntimeCore } from \"../core/BaseThreadRuntimeCore\";\nimport { RunConfig } from \"../../types/AssistantTypes\";\nimport { ModelContextProvider } from \"../../model-context\";\n\nexport class LocalThreadRuntimeCore\n  extends BaseThreadRuntimeCore\n  implements ThreadRuntimeCore\n{\n  public readonly capabilities = {\n    switchToBranch: true,\n    edit: true,\n    reload: true,\n    cancel: true,\n    unstable_copy: true,\n    speech: false,\n    attachments: false,\n    feedback: false,\n  };\n\n  private abortController: AbortController | null = null;\n\n  public readonly isDisabled = false;\n  public readonly suggestions: readonly ThreadSuggestion[] = [];\n\n  public get adapters() {\n    return this._options.adapters;\n  }\n\n  constructor(\n    contextProvider: ModelContextProvider,\n    options: LocalRuntimeOptionsBase,\n  ) {\n    super(contextProvider);\n    this.__internal_setOptions(options);\n  }\n\n  private _options!: LocalRuntimeOptionsBase;\n\n  private _lastRunConfig: RunConfig = {};\n\n  public get extras() {\n    return undefined;\n  }\n\n  public __internal_setOptions(options: LocalRuntimeOptionsBase) {\n    if (this._options === options) return;\n\n    this._options = options;\n\n    let hasUpdates = false;\n\n    const canSpeak = options.adapters?.speech !== undefined;\n    if (this.capabilities.speech !== canSpeak) {\n      this.capabilities.speech = canSpeak;\n      hasUpdates = true;\n    }\n\n    const canAttach = options.adapters?.attachments !== undefined;\n    if (this.capabilities.attachments !== canAttach) {\n      this.capabilities.attachments = canAttach;\n      hasUpdates = true;\n    }\n\n    const canFeedback = options.adapters?.feedback !== undefined;\n    if (this.capabilities.feedback !== canFeedback) {\n      this.capabilities.feedback = canFeedback;\n      hasUpdates = true;\n    }\n\n    if (hasUpdates) this._notifySubscribers();\n  }\n\n  private _loadPromise: Promise<void> | undefined;\n  public __internal_load() {\n    if (this._loadPromise) return this._loadPromise;\n\n    const promise = this.adapters.history?.load() ?? Promise.resolve(null);\n\n    this._loadPromise = promise.then((repo) => {\n      if (!repo) return;\n      this.repository.import(repo);\n      this._notifySubscribers();\n    });\n\n    return this._loadPromise;\n  }\n\n  public async append(message: AppendMessage): Promise<void> {\n    this.ensureInitialized();\n\n    const newMessage = fromCoreMessage(message, {\n      attachments: message.attachments,\n    });\n    this.repository.addOrUpdateMessage(message.parentId, newMessage);\n    this._options.adapters.history?.append({\n      parentId: message.parentId,\n      message: newMessage,\n    });\n\n    const startRun = message.startRun ?? message.role === \"user\";\n    if (startRun) {\n      await this.startRun({\n        parentId: newMessage.id,\n        sourceId: message.sourceId,\n        runConfig: message.runConfig ?? {},\n      });\n    } else {\n      this.repository.resetHead(newMessage.id);\n      this._notifySubscribers();\n    }\n  }\n\n  public async startRun({\n    parentId,\n    runConfig,\n  }: StartRunConfig): Promise<void> {\n    this.ensureInitialized();\n\n    this.repository.resetHead(parentId);\n\n    // add assistant message\n    const id = generateId();\n    let message: ThreadAssistantMessage = {\n      id,\n      role: \"assistant\",\n      status: { type: \"running\" },\n      content: [],\n      metadata: {\n        unstable_annotations: [],\n        unstable_data: [],\n        steps: [],\n        custom: {},\n      },\n      createdAt: new Date(),\n    };\n\n    this._notifyEventSubscribers(\"run-start\");\n\n    try {\n      do {\n        message = await this.performRoundtrip(parentId, message, runConfig);\n      } while (\n        shouldContinue(\n          message,\n          this._options.unstable_shouldContinueIgnoreToolNames ?? [],\n        )\n      );\n    } finally {\n      this._notifyEventSubscribers(\"run-end\");\n    }\n  }\n\n  private async performRoundtrip(\n    parentId: string | null,\n    message: ThreadAssistantMessage,\n    runConfig: RunConfig | undefined,\n  ) {\n    const messages = this.repository.getMessages();\n\n    // abort existing run\n    this.abortController?.abort();\n    this.abortController = new AbortController();\n\n    const initialContent = message.content;\n    const initialAnnotations = message.metadata?.unstable_annotations;\n    const initialData = message.metadata?.unstable_data;\n    const initialSteps = message.metadata?.steps;\n    const initalCustom = message.metadata?.custom;\n    const updateMessage = (m: Partial<ChatModelRunResult>) => {\n      const newSteps = m.metadata?.steps;\n      const steps = newSteps\n        ? [...(initialSteps ?? []), ...newSteps]\n        : undefined;\n\n      const newAnnotations = m.metadata?.unstable_annotations;\n      const newData = m.metadata?.unstable_data;\n      const annotations = newAnnotations\n        ? [...(initialAnnotations ?? []), ...newAnnotations]\n        : undefined;\n      const data = newData ? [...(initialData ?? []), ...newData] : undefined;\n\n      message = {\n        ...message,\n        ...(m.content\n          ? { content: [...initialContent, ...(m.content ?? [])] }\n          : undefined),\n        status: m.status ?? message.status,\n        ...(m.metadata\n          ? {\n              metadata: {\n                ...message.metadata,\n                ...(annotations\n                  ? { unstable_annotations: annotations }\n                  : undefined),\n                ...(data ? { unstable_data: data } : undefined),\n                ...(steps ? { steps } : undefined),\n                ...(m.metadata?.custom\n                  ? {\n                      custom: { ...(initalCustom ?? {}), ...m.metadata.custom },\n                    }\n                  : undefined),\n              },\n            }\n          : undefined),\n      };\n      this.repository.addOrUpdateMessage(parentId, message);\n      this._notifySubscribers();\n    };\n\n    const maxSteps = this._options.maxSteps ?? 2;\n\n    const steps = message.metadata?.steps?.length ?? 0;\n    if (steps >= maxSteps) {\n      // reached max tool steps\n      updateMessage({\n        status: {\n          type: \"incomplete\",\n          reason: \"tool-calls\",\n        },\n      });\n      return message;\n    } else {\n      updateMessage({\n        status: {\n          type: \"running\",\n        },\n      });\n    }\n\n    try {\n      this._lastRunConfig = runConfig ?? {};\n      const context = this.getModelContext();\n      const promiseOrGenerator = this.adapters.chatModel.run({\n        messages,\n        runConfig: this._lastRunConfig,\n        abortSignal: this.abortController.signal,\n        context,\n        config: context,\n        unstable_assistantMessageId: message.id,\n        unstable_getMessage() {\n          return message;\n        },\n      });\n\n      // handle async iterator for streaming results\n      if (Symbol.asyncIterator in promiseOrGenerator) {\n        for await (const r of promiseOrGenerator) {\n          updateMessage(r);\n        }\n      } else {\n        updateMessage(await promiseOrGenerator);\n      }\n\n      this.abortController = null;\n\n      if (message.status.type === \"running\") {\n        updateMessage({\n          status: { type: \"complete\", reason: \"unknown\" },\n        });\n      }\n    } catch (e) {\n      this.abortController = null;\n\n      // TODO this should be handled by the run result stream\n      if (e instanceof Error && e.name === \"AbortError\") {\n        updateMessage({\n          status: { type: \"incomplete\", reason: \"cancelled\" },\n        });\n      } else {\n        updateMessage({\n          status: {\n            type: \"incomplete\",\n            reason: \"error\",\n            error:\n              e instanceof Error\n                ? e.message\n                : `[${typeof e}] ${new String(e).toString()}`,\n          },\n        });\n\n        throw e;\n      }\n    } finally {\n      if (\n        message.status.type === \"complete\" ||\n        message.status.type === \"incomplete\"\n      ) {\n        await this._options.adapters.history?.append({\n          parentId,\n          message: message,\n        });\n      }\n    }\n    return message;\n  }\n\n  public cancelRun() {\n    this.abortController?.abort();\n    this.abortController = null;\n  }\n\n  public addToolResult({\n    messageId,\n    toolCallId,\n    result,\n  }: AddToolResultOptions) {\n    const messageData = this.repository.getMessage(messageId);\n    const { parentId } = messageData;\n    let { message } = messageData;\n\n    if (message.role !== \"assistant\")\n      throw new Error(\"Tried to add tool result to non-assistant message\");\n\n    let added = false;\n    let found = false;\n    const newContent = message.content.map((c) => {\n      if (c.type !== \"tool-call\") return c;\n      if (c.toolCallId !== toolCallId) return c;\n      found = true;\n      if (!c.result) added = true;\n      return {\n        ...c,\n        result,\n      };\n    });\n\n    if (!found)\n      throw new Error(\"Tried to add tool result to non-existing tool call\");\n\n    message = {\n      ...message,\n      content: newContent,\n    };\n    this.repository.addOrUpdateMessage(parentId, message);\n\n    if (\n      added &&\n      shouldContinue(\n        message,\n        this._options.unstable_shouldContinueIgnoreToolNames ?? [],\n      )\n    ) {\n      this.performRoundtrip(parentId, message, this._lastRunConfig);\n    }\n  }\n}\n"],"mappings":"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","names":["steps"]}
         
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"sources":["../../../src/runtimes/local/LocalThreadRuntimeCore.tsx"],"sourcesContent":["import { generateId } from \"../../internal\";\nimport type { AppendMessage, ThreadAssistantMessage } from \"../../types\";\nimport { fromCoreMessage } from \"../edge\";\nimport type { ChatModelRunResult } from \"./ChatModelAdapter\";\nimport { shouldContinue } from \"./shouldContinue\";\nimport { LocalRuntimeOptionsBase } from \"./LocalRuntimeOptions\";\nimport {\n  AddToolResultOptions,\n  ThreadSuggestion,\n  ThreadRuntimeCore,\n  StartRunConfig,\n} from \"../core/ThreadRuntimeCore\";\nimport { BaseThreadRuntimeCore } from \"../core/BaseThreadRuntimeCore\";\nimport { RunConfig } from \"../../types/AssistantTypes\";\nimport { ModelContextProvider } from \"../../model-context\";\n\nexport class LocalThreadRuntimeCore\n  extends BaseThreadRuntimeCore\n  implements ThreadRuntimeCore\n{\n  public readonly capabilities = {\n    switchToBranch: true,\n    edit: true,\n    reload: true,\n    cancel: true,\n    unstable_copy: true,\n    speech: false,\n    attachments: false,\n    feedback: false,\n  };\n\n  private abortController: AbortController | null = null;\n\n  public readonly isDisabled = false;\n  public readonly suggestions: readonly ThreadSuggestion[] = [];\n\n  public get adapters() {\n    return this._options.adapters;\n  }\n\n  constructor(\n    contextProvider: ModelContextProvider,\n    options: LocalRuntimeOptionsBase,\n  ) {\n    super(contextProvider);\n    this.__internal_setOptions(options);\n  }\n\n  private _options!: LocalRuntimeOptionsBase;\n\n  private _lastRunConfig: RunConfig = {};\n\n  public get extras() {\n    return undefined;\n  }\n\n  public __internal_setOptions(options: LocalRuntimeOptionsBase) {\n    if (this._options === options) return;\n\n    this._options = options;\n\n    let hasUpdates = false;\n\n    const canSpeak = options.adapters?.speech !== undefined;\n    if (this.capabilities.speech !== canSpeak) {\n      this.capabilities.speech = canSpeak;\n      hasUpdates = true;\n    }\n\n    const canAttach = options.adapters?.attachments !== undefined;\n    if (this.capabilities.attachments !== canAttach) {\n      this.capabilities.attachments = canAttach;\n      hasUpdates = true;\n    }\n\n    const canFeedback = options.adapters?.feedback !== undefined;\n    if (this.capabilities.feedback !== canFeedback) {\n      this.capabilities.feedback = canFeedback;\n      hasUpdates = true;\n    }\n\n    if (hasUpdates) this._notifySubscribers();\n  }\n\n  private _loadPromise: Promise<void> | undefined;\n  public __internal_load() {\n    if (this._loadPromise) return this._loadPromise;\n\n    const promise = this.adapters.history?.load() ?? Promise.resolve(null);\n\n    this._loadPromise = promise.then((repo) => {\n      if (!repo) return;\n      this.repository.import(repo);\n      this._notifySubscribers();\n    });\n\n    return this._loadPromise;\n  }\n\n  public async append(message: AppendMessage): Promise<void> {\n    this.ensureInitialized();\n\n    const newMessage = fromCoreMessage(message, {\n      attachments: message.attachments,\n    });\n    this.repository.addOrUpdateMessage(message.parentId, newMessage);\n    this._options.adapters.history?.append({\n      parentId: message.parentId,\n      message: newMessage,\n    });\n\n    const startRun = message.startRun ?? message.role === \"user\";\n    if (startRun) {\n      await this.startRun({\n        parentId: newMessage.id,\n        sourceId: message.sourceId,\n        runConfig: message.runConfig ?? {},\n      });\n    } else {\n      this.repository.resetHead(newMessage.id);\n      this._notifySubscribers();\n    }\n  }\n\n  public async startRun({\n    parentId,\n    runConfig,\n  }: StartRunConfig): Promise<void> {\n    this.ensureInitialized();\n\n    this.repository.resetHead(parentId);\n\n    // add assistant message\n    const id = generateId();\n    let message: ThreadAssistantMessage = {\n      id,\n      role: \"assistant\",\n      status: { type: \"running\" },\n      content: [],\n      metadata: {\n        unstable_annotations: [],\n        unstable_data: [],\n        steps: [],\n        custom: {},\n      },\n      createdAt: new Date(),\n    };\n\n    this._notifyEventSubscribers(\"run-start\");\n\n    try {\n      do {\n        message = await this.performRoundtrip(parentId, message, runConfig);\n      } while (shouldContinue(message, this._options.unstable_humanToolNames));\n    } finally {\n      this._notifyEventSubscribers(\"run-end\");\n    }\n  }\n\n  private async performRoundtrip(\n    parentId: string | null,\n    message: ThreadAssistantMessage,\n    runConfig: RunConfig | undefined,\n  ) {\n    const messages = this.repository.getMessages();\n\n    // abort existing run\n    this.abortController?.abort();\n    this.abortController = new AbortController();\n\n    const initialContent = message.content;\n    const initialAnnotations = message.metadata?.unstable_annotations;\n    const initialData = message.metadata?.unstable_data;\n    const initialSteps = message.metadata?.steps;\n    const initalCustom = message.metadata?.custom;\n    const updateMessage = (m: Partial<ChatModelRunResult>) => {\n      const newSteps = m.metadata?.steps;\n      const steps = newSteps\n        ? [...(initialSteps ?? []), ...newSteps]\n        : undefined;\n\n      const newAnnotations = m.metadata?.unstable_annotations;\n      const newData = m.metadata?.unstable_data;\n      const annotations = newAnnotations\n        ? [...(initialAnnotations ?? []), ...newAnnotations]\n        : undefined;\n      const data = newData ? [...(initialData ?? []), ...newData] : undefined;\n\n      message = {\n        ...message,\n        ...(m.content\n          ? { content: [...initialContent, ...(m.content ?? [])] }\n          : undefined),\n        status: m.status ?? message.status,\n        ...(m.metadata\n          ? {\n              metadata: {\n                ...message.metadata,\n                ...(annotations\n                  ? { unstable_annotations: annotations }\n                  : undefined),\n                ...(data ? { unstable_data: data } : undefined),\n                ...(steps ? { steps } : undefined),\n                ...(m.metadata?.custom\n                  ? {\n                      custom: { ...(initalCustom ?? {}), ...m.metadata.custom },\n                    }\n                  : undefined),\n              },\n            }\n          : undefined),\n      };\n      this.repository.addOrUpdateMessage(parentId, message);\n      this._notifySubscribers();\n    };\n\n    const maxSteps = this._options.maxSteps ?? 2;\n\n    const steps = message.metadata?.steps?.length ?? 0;\n    if (steps >= maxSteps) {\n      // reached max tool steps\n      updateMessage({\n        status: {\n          type: \"incomplete\",\n          reason: \"tool-calls\",\n        },\n      });\n      return message;\n    } else {\n      updateMessage({\n        status: {\n          type: \"running\",\n        },\n      });\n    }\n\n    try {\n      this._lastRunConfig = runConfig ?? {};\n      const context = this.getModelContext();\n      const promiseOrGenerator = this.adapters.chatModel.run({\n        messages,\n        runConfig: this._lastRunConfig,\n        abortSignal: this.abortController.signal,\n        context,\n        config: context,\n        unstable_assistantMessageId: message.id,\n        unstable_getMessage() {\n          return message;\n        },\n      });\n\n      // handle async iterator for streaming results\n      if (Symbol.asyncIterator in promiseOrGenerator) {\n        for await (const r of promiseOrGenerator) {\n          updateMessage(r);\n        }\n      } else {\n        updateMessage(await promiseOrGenerator);\n      }\n\n      this.abortController = null;\n\n      if (message.status.type === \"running\") {\n        updateMessage({\n          status: { type: \"complete\", reason: \"unknown\" },\n        });\n      }\n    } catch (e) {\n      this.abortController = null;\n\n      // TODO this should be handled by the run result stream\n      if (e instanceof Error && e.name === \"AbortError\") {\n        updateMessage({\n          status: { type: \"incomplete\", reason: \"cancelled\" },\n        });\n      } else {\n        updateMessage({\n          status: {\n            type: \"incomplete\",\n            reason: \"error\",\n            error:\n              e instanceof Error\n                ? e.message\n                : `[${typeof e}] ${new String(e).toString()}`,\n          },\n        });\n\n        throw e;\n      }\n    } finally {\n      if (\n        message.status.type === \"complete\" ||\n        message.status.type === \"incomplete\"\n      ) {\n        await this._options.adapters.history?.append({\n          parentId,\n          message: message,\n        });\n      }\n    }\n    return message;\n  }\n\n  public cancelRun() {\n    this.abortController?.abort();\n    this.abortController = null;\n  }\n\n  public addToolResult({\n    messageId,\n    toolCallId,\n    result,\n  }: AddToolResultOptions) {\n    const messageData = this.repository.getMessage(messageId);\n    const { parentId } = messageData;\n    let { message } = messageData;\n\n    if (message.role !== \"assistant\")\n      throw new Error(\"Tried to add tool result to non-assistant message\");\n\n    let added = false;\n    let found = false;\n    const newContent = message.content.map((c) => {\n      if (c.type !== \"tool-call\") return c;\n      if (c.toolCallId !== toolCallId) return c;\n      found = true;\n      if (!c.result) added = true;\n      return {\n        ...c,\n        result,\n      };\n    });\n\n    if (!found)\n      throw new Error(\"Tried to add tool result to non-existing tool call\");\n\n    message = {\n      ...message,\n      content: newContent,\n    };\n    this.repository.addOrUpdateMessage(parentId, message);\n\n    if (\n      added &&\n      shouldContinue(message, this._options.unstable_humanToolNames)\n    ) {\n      this.performRoundtrip(parentId, message, this._lastRunConfig);\n    }\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA2B;AAE3B,kBAAgC;AAEhC,4BAA+B;AAQ/B,mCAAsC;AAI/B,IAAM,yBAAN,cACG,mDAEV;AAAA,EACkB,eAAe;AAAA,IAC7B,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EAEQ,kBAA0C;AAAA,EAElC,aAAa;AAAA,EACb,cAA2C,CAAC;AAAA,EAE5D,IAAW,WAAW;AACpB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,YACE,iBACA,SACA;AACA,UAAM,eAAe;AACrB,SAAK,sBAAsB,OAAO;AAAA,EACpC;AAAA,EAEQ;AAAA,EAEA,iBAA4B,CAAC;AAAA,EAErC,IAAW,SAAS;AAClB,WAAO;AAAA,EACT;AAAA,EAEO,sBAAsB,SAAkC;AAC7D,QAAI,KAAK,aAAa,QAAS;AAE/B,SAAK,WAAW;AAEhB,QAAI,aAAa;AAEjB,UAAM,WAAW,QAAQ,UAAU,WAAW;AAC9C,QAAI,KAAK,aAAa,WAAW,UAAU;AACzC,WAAK,aAAa,SAAS;AAC3B,mBAAa;AAAA,IACf;AAEA,UAAM,YAAY,QAAQ,UAAU,gBAAgB;AACpD,QAAI,KAAK,aAAa,gBAAgB,WAAW;AAC/C,WAAK,aAAa,cAAc;AAChC,mBAAa;AAAA,IACf;AAEA,UAAM,cAAc,QAAQ,UAAU,aAAa;AACnD,QAAI,KAAK,aAAa,aAAa,aAAa;AAC9C,WAAK,aAAa,WAAW;AAC7B,mBAAa;AAAA,IACf;AAEA,QAAI,WAAY,MAAK,mBAAmB;AAAA,EAC1C;AAAA,EAEQ;AAAA,EACD,kBAAkB;AACvB,QAAI,KAAK,aAAc,QAAO,KAAK;AAEnC,UAAM,UAAU,KAAK,SAAS,SAAS,KAAK,KAAK,QAAQ,QAAQ,IAAI;AAErE,SAAK,eAAe,QAAQ,KAAK,CAAC,SAAS;AACzC,UAAI,CAAC,KAAM;AACX,WAAK,WAAW,OAAO,IAAI;AAC3B,WAAK,mBAAmB;AAAA,IAC1B,CAAC;AAED,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,OAAO,SAAuC;AACzD,SAAK,kBAAkB;AAEvB,UAAM,iBAAa,6BAAgB,SAAS;AAAA,MAC1C,aAAa,QAAQ;AAAA,IACvB,CAAC;AACD,SAAK,WAAW,mBAAmB,QAAQ,UAAU,UAAU;AAC/D,SAAK,SAAS,SAAS,SAAS,OAAO;AAAA,MACrC,UAAU,QAAQ;AAAA,MAClB,SAAS;AAAA,IACX,CAAC;AAED,UAAM,WAAW,QAAQ,YAAY,QAAQ,SAAS;AACtD,QAAI,UAAU;AACZ,YAAM,KAAK,SAAS;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,UAAU,QAAQ;AAAA,QAClB,WAAW,QAAQ,aAAa,CAAC;AAAA,MACnC,CAAC;AAAA,IACH,OAAO;AACL,WAAK,WAAW,UAAU,WAAW,EAAE;AACvC,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAa,SAAS;AAAA,IACpB;AAAA,IACA;AAAA,EACF,GAAkC;AAChC,SAAK,kBAAkB;AAEvB,SAAK,WAAW,UAAU,QAAQ;AAGlC,UAAM,SAAK,4BAAW;AACtB,QAAI,UAAkC;AAAA,MACpC;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,UAAU;AAAA,MAC1B,SAAS,CAAC;AAAA,MACV,UAAU;AAAA,QACR,sBAAsB,CAAC;AAAA,QACvB,eAAe,CAAC;AAAA,QAChB,OAAO,CAAC;AAAA,QACR,QAAQ,CAAC;AAAA,MACX;AAAA,MACA,WAAW,oBAAI,KAAK;AAAA,IACtB;AAEA,SAAK,wBAAwB,WAAW;AAExC,QAAI;AACF,SAAG;AACD,kBAAU,MAAM,KAAK,iBAAiB,UAAU,SAAS,SAAS;AAAA,MACpE,aAAS,sCAAe,SAAS,KAAK,SAAS,uBAAuB;AAAA,IACxE,UAAE;AACA,WAAK,wBAAwB,SAAS;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,UACA,SACA,WACA;AACA,UAAM,WAAW,KAAK,WAAW,YAAY;AAG7C,SAAK,iBAAiB,MAAM;AAC5B,SAAK,kBAAkB,IAAI,gBAAgB;AAE3C,UAAM,iBAAiB,QAAQ;AAC/B,UAAM,qBAAqB,QAAQ,UAAU;AAC7C,UAAM,cAAc,QAAQ,UAAU;AACtC,UAAM,eAAe,QAAQ,UAAU;AACvC,UAAM,eAAe,QAAQ,UAAU;AACvC,UAAM,gBAAgB,CAAC,MAAmC;AACxD,YAAM,WAAW,EAAE,UAAU;AAC7B,YAAMA,SAAQ,WACV,CAAC,GAAI,gBAAgB,CAAC,GAAI,GAAG,QAAQ,IACrC;AAEJ,YAAM,iBAAiB,EAAE,UAAU;AACnC,YAAM,UAAU,EAAE,UAAU;AAC5B,YAAM,cAAc,iBAChB,CAAC,GAAI,sBAAsB,CAAC,GAAI,GAAG,cAAc,IACjD;AACJ,YAAM,OAAO,UAAU,CAAC,GAAI,eAAe,CAAC,GAAI,GAAG,OAAO,IAAI;AAE9D,gBAAU;AAAA,QACR,GAAG;AAAA,QACH,GAAI,EAAE,UACF,EAAE,SAAS,CAAC,GAAG,gBAAgB,GAAI,EAAE,WAAW,CAAC,CAAE,EAAE,IACrD;AAAA,QACJ,QAAQ,EAAE,UAAU,QAAQ;AAAA,QAC5B,GAAI,EAAE,WACF;AAAA,UACE,UAAU;AAAA,YACR,GAAG,QAAQ;AAAA,YACX,GAAI,cACA,EAAE,sBAAsB,YAAY,IACpC;AAAA,YACJ,GAAI,OAAO,EAAE,eAAe,KAAK,IAAI;AAAA,YACrC,GAAIA,SAAQ,EAAE,OAAAA,OAAM,IAAI;AAAA,YACxB,GAAI,EAAE,UAAU,SACZ;AAAA,cACE,QAAQ,EAAE,GAAI,gBAAgB,CAAC,GAAI,GAAG,EAAE,SAAS,OAAO;AAAA,YAC1D,IACA;AAAA,UACN;AAAA,QACF,IACA;AAAA,MACN;AACA,WAAK,WAAW,mBAAmB,UAAU,OAAO;AACpD,WAAK,mBAAmB;AAAA,IAC1B;AAEA,UAAM,WAAW,KAAK,SAAS,YAAY;AAE3C,UAAM,QAAQ,QAAQ,UAAU,OAAO,UAAU;AACjD,QAAI,SAAS,UAAU;AAErB,oBAAc;AAAA,QACZ,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,QAAQ;AAAA,QACV;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT,OAAO;AACL,oBAAc;AAAA,QACZ,QAAQ;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI;AACF,WAAK,iBAAiB,aAAa,CAAC;AACpC,YAAM,UAAU,KAAK,gBAAgB;AACrC,YAAM,qBAAqB,KAAK,SAAS,UAAU,IAAI;AAAA,QACrD;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,aAAa,KAAK,gBAAgB;AAAA,QAClC;AAAA,QACA,QAAQ;AAAA,QACR,6BAA6B,QAAQ;AAAA,QACrC,sBAAsB;AACpB,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAGD,UAAI,OAAO,iBAAiB,oBAAoB;AAC9C,yBAAiB,KAAK,oBAAoB;AACxC,wBAAc,CAAC;AAAA,QACjB;AAAA,MACF,OAAO;AACL,sBAAc,MAAM,kBAAkB;AAAA,MACxC;AAEA,WAAK,kBAAkB;AAEvB,UAAI,QAAQ,OAAO,SAAS,WAAW;AACrC,sBAAc;AAAA,UACZ,QAAQ,EAAE,MAAM,YAAY,QAAQ,UAAU;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF,SAAS,GAAG;AACV,WAAK,kBAAkB;AAGvB,UAAI,aAAa,SAAS,EAAE,SAAS,cAAc;AACjD,sBAAc;AAAA,UACZ,QAAQ,EAAE,MAAM,cAAc,QAAQ,YAAY;AAAA,QACpD,CAAC;AAAA,MACH,OAAO;AACL,sBAAc;AAAA,UACZ,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,OACE,aAAa,QACT,EAAE,UACF,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,EAAE,SAAS,CAAC;AAAA,UACjD;AAAA,QACF,CAAC;AAED,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AACA,UACE,QAAQ,OAAO,SAAS,cACxB,QAAQ,OAAO,SAAS,cACxB;AACA,cAAM,KAAK,SAAS,SAAS,SAAS,OAAO;AAAA,UAC3C;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEO,YAAY;AACjB,SAAK,iBAAiB,MAAM;AAC5B,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEO,cAAc;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAyB;AACvB,UAAM,cAAc,KAAK,WAAW,WAAW,SAAS;AACxD,UAAM,EAAE,SAAS,IAAI;AACrB,QAAI,EAAE,QAAQ,IAAI;AAElB,QAAI,QAAQ,SAAS;AACnB,YAAM,IAAI,MAAM,mDAAmD;AAErE,QAAI,QAAQ;AACZ,QAAI,QAAQ;AACZ,UAAM,aAAa,QAAQ,QAAQ,IAAI,CAAC,MAAM;AAC5C,UAAI,EAAE,SAAS,YAAa,QAAO;AACnC,UAAI,EAAE,eAAe,WAAY,QAAO;AACxC,cAAQ;AACR,UAAI,CAAC,EAAE,OAAQ,SAAQ;AACvB,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,oDAAoD;AAEtE,cAAU;AAAA,MACR,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AACA,SAAK,WAAW,mBAAmB,UAAU,OAAO;AAEpD,QACE,aACA,sCAAe,SAAS,KAAK,SAAS,uBAAuB,GAC7D;AACA,WAAK,iBAAiB,UAAU,SAAS,KAAK,cAAc;AAAA,IAC9D;AAAA,EACF;AACF;","names":["steps"]}
         
     | 
| 
         @@ -107,10 +107,7 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore { 
     | 
|
| 
       107 
107 
     | 
    
         
             
                try {
         
     | 
| 
       108 
108 
     | 
    
         
             
                  do {
         
     | 
| 
       109 
109 
     | 
    
         
             
                    message = await this.performRoundtrip(parentId, message, runConfig);
         
     | 
| 
       110 
     | 
    
         
            -
                  } while (shouldContinue(
         
     | 
| 
       111 
     | 
    
         
            -
                    message,
         
     | 
| 
       112 
     | 
    
         
            -
                    this._options.unstable_shouldContinueIgnoreToolNames ?? []
         
     | 
| 
       113 
     | 
    
         
            -
                  ));
         
     | 
| 
      
 110 
     | 
    
         
            +
                  } while (shouldContinue(message, this._options.unstable_humanToolNames));
         
     | 
| 
       114 
111 
     | 
    
         
             
                } finally {
         
     | 
| 
       115 
112 
     | 
    
         
             
                  this._notifyEventSubscribers("run-end");
         
     | 
| 
       116 
113 
     | 
    
         
             
                }
         
     | 
| 
         @@ -253,10 +250,7 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore { 
     | 
|
| 
       253 
250 
     | 
    
         
             
                  content: newContent
         
     | 
| 
       254 
251 
     | 
    
         
             
                };
         
     | 
| 
       255 
252 
     | 
    
         
             
                this.repository.addOrUpdateMessage(parentId, message);
         
     | 
| 
       256 
     | 
    
         
            -
                if (added && shouldContinue(
         
     | 
| 
       257 
     | 
    
         
            -
                  message,
         
     | 
| 
       258 
     | 
    
         
            -
                  this._options.unstable_shouldContinueIgnoreToolNames ?? []
         
     | 
| 
       259 
     | 
    
         
            -
                )) {
         
     | 
| 
      
 253 
     | 
    
         
            +
                if (added && shouldContinue(message, this._options.unstable_humanToolNames)) {
         
     | 
| 
       260 
254 
     | 
    
         
             
                  this.performRoundtrip(parentId, message, this._lastRunConfig);
         
     | 
| 
       261 
255 
     | 
    
         
             
                }
         
     | 
| 
       262 
256 
     | 
    
         
             
              }
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"sources":["../../../src/runtimes/local/LocalThreadRuntimeCore.tsx"],"sourcesContent":["import { generateId } from \"../../internal\";\nimport type { AppendMessage, ThreadAssistantMessage } from \"../../types\";\nimport { fromCoreMessage } from \"../edge\";\nimport type { ChatModelRunResult } from \"./ChatModelAdapter\";\nimport { shouldContinue } from \"./shouldContinue\";\nimport { LocalRuntimeOptionsBase } from \"./LocalRuntimeOptions\";\nimport {\n  AddToolResultOptions,\n  ThreadSuggestion,\n  ThreadRuntimeCore,\n  StartRunConfig,\n} from \"../core/ThreadRuntimeCore\";\nimport { BaseThreadRuntimeCore } from \"../core/BaseThreadRuntimeCore\";\nimport { RunConfig } from \"../../types/AssistantTypes\";\nimport { ModelContextProvider } from \"../../model-context\";\n\nexport class LocalThreadRuntimeCore\n  extends BaseThreadRuntimeCore\n  implements ThreadRuntimeCore\n{\n  public readonly capabilities = {\n    switchToBranch: true,\n    edit: true,\n    reload: true,\n    cancel: true,\n    unstable_copy: true,\n    speech: false,\n    attachments: false,\n    feedback: false,\n  };\n\n  private abortController: AbortController | null = null;\n\n  public readonly isDisabled = false;\n  public readonly suggestions: readonly ThreadSuggestion[] = [];\n\n  public get adapters() {\n    return this._options.adapters;\n  }\n\n  constructor(\n    contextProvider: ModelContextProvider,\n    options: LocalRuntimeOptionsBase,\n  ) {\n    super(contextProvider);\n    this.__internal_setOptions(options);\n  }\n\n  private _options!: LocalRuntimeOptionsBase;\n\n  private _lastRunConfig: RunConfig = {};\n\n  public get extras() {\n    return undefined;\n  }\n\n  public __internal_setOptions(options: LocalRuntimeOptionsBase) {\n    if (this._options === options) return;\n\n    this._options = options;\n\n    let hasUpdates = false;\n\n    const canSpeak = options.adapters?.speech !== undefined;\n    if (this.capabilities.speech !== canSpeak) {\n      this.capabilities.speech = canSpeak;\n      hasUpdates = true;\n    }\n\n    const canAttach = options.adapters?.attachments !== undefined;\n    if (this.capabilities.attachments !== canAttach) {\n      this.capabilities.attachments = canAttach;\n      hasUpdates = true;\n    }\n\n    const canFeedback = options.adapters?.feedback !== undefined;\n    if (this.capabilities.feedback !== canFeedback) {\n      this.capabilities.feedback = canFeedback;\n      hasUpdates = true;\n    }\n\n    if (hasUpdates) this._notifySubscribers();\n  }\n\n  private _loadPromise: Promise<void> | undefined;\n  public __internal_load() {\n    if (this._loadPromise) return this._loadPromise;\n\n    const promise = this.adapters.history?.load() ?? Promise.resolve(null);\n\n    this._loadPromise = promise.then((repo) => {\n      if (!repo) return;\n      this.repository.import(repo);\n      this._notifySubscribers();\n    });\n\n    return this._loadPromise;\n  }\n\n  public async append(message: AppendMessage): Promise<void> {\n    this.ensureInitialized();\n\n    const newMessage = fromCoreMessage(message, {\n      attachments: message.attachments,\n    });\n    this.repository.addOrUpdateMessage(message.parentId, newMessage);\n    this._options.adapters.history?.append({\n      parentId: message.parentId,\n      message: newMessage,\n    });\n\n    const startRun = message.startRun ?? message.role === \"user\";\n    if (startRun) {\n      await this.startRun({\n        parentId: newMessage.id,\n        sourceId: message.sourceId,\n        runConfig: message.runConfig ?? {},\n      });\n    } else {\n      this.repository.resetHead(newMessage.id);\n      this._notifySubscribers();\n    }\n  }\n\n  public async startRun({\n    parentId,\n    runConfig,\n  }: StartRunConfig): Promise<void> {\n    this.ensureInitialized();\n\n    this.repository.resetHead(parentId);\n\n    // add assistant message\n    const id = generateId();\n    let message: ThreadAssistantMessage = {\n      id,\n      role: \"assistant\",\n      status: { type: \"running\" },\n      content: [],\n      metadata: {\n        unstable_annotations: [],\n        unstable_data: [],\n        steps: [],\n        custom: {},\n      },\n      createdAt: new Date(),\n    };\n\n    this._notifyEventSubscribers(\"run-start\");\n\n    try {\n      do {\n        message = await this.performRoundtrip(parentId, message, runConfig);\n      } while (\n        shouldContinue(\n          message,\n          this._options.unstable_shouldContinueIgnoreToolNames ?? [],\n        )\n      );\n    } finally {\n      this._notifyEventSubscribers(\"run-end\");\n    }\n  }\n\n  private async performRoundtrip(\n    parentId: string | null,\n    message: ThreadAssistantMessage,\n    runConfig: RunConfig | undefined,\n  ) {\n    const messages = this.repository.getMessages();\n\n    // abort existing run\n    this.abortController?.abort();\n    this.abortController = new AbortController();\n\n    const initialContent = message.content;\n    const initialAnnotations = message.metadata?.unstable_annotations;\n    const initialData = message.metadata?.unstable_data;\n    const initialSteps = message.metadata?.steps;\n    const initalCustom = message.metadata?.custom;\n    const updateMessage = (m: Partial<ChatModelRunResult>) => {\n      const newSteps = m.metadata?.steps;\n      const steps = newSteps\n        ? [...(initialSteps ?? []), ...newSteps]\n        : undefined;\n\n      const newAnnotations = m.metadata?.unstable_annotations;\n      const newData = m.metadata?.unstable_data;\n      const annotations = newAnnotations\n        ? [...(initialAnnotations ?? []), ...newAnnotations]\n        : undefined;\n      const data = newData ? [...(initialData ?? []), ...newData] : undefined;\n\n      message = {\n        ...message,\n        ...(m.content\n          ? { content: [...initialContent, ...(m.content ?? [])] }\n          : undefined),\n        status: m.status ?? message.status,\n        ...(m.metadata\n          ? {\n              metadata: {\n                ...message.metadata,\n                ...(annotations\n                  ? { unstable_annotations: annotations }\n                  : undefined),\n                ...(data ? { unstable_data: data } : undefined),\n                ...(steps ? { steps } : undefined),\n                ...(m.metadata?.custom\n                  ? {\n                      custom: { ...(initalCustom ?? {}), ...m.metadata.custom },\n                    }\n                  : undefined),\n              },\n            }\n          : undefined),\n      };\n      this.repository.addOrUpdateMessage(parentId, message);\n      this._notifySubscribers();\n    };\n\n    const maxSteps = this._options.maxSteps ?? 2;\n\n    const steps = message.metadata?.steps?.length ?? 0;\n    if (steps >= maxSteps) {\n      // reached max tool steps\n      updateMessage({\n        status: {\n          type: \"incomplete\",\n          reason: \"tool-calls\",\n        },\n      });\n      return message;\n    } else {\n      updateMessage({\n        status: {\n          type: \"running\",\n        },\n      });\n    }\n\n    try {\n      this._lastRunConfig = runConfig ?? {};\n      const context = this.getModelContext();\n      const promiseOrGenerator = this.adapters.chatModel.run({\n        messages,\n        runConfig: this._lastRunConfig,\n        abortSignal: this.abortController.signal,\n        context,\n        config: context,\n        unstable_assistantMessageId: message.id,\n        unstable_getMessage() {\n          return message;\n        },\n      });\n\n      // handle async iterator for streaming results\n      if (Symbol.asyncIterator in promiseOrGenerator) {\n        for await (const r of promiseOrGenerator) {\n          updateMessage(r);\n        }\n      } else {\n        updateMessage(await promiseOrGenerator);\n      }\n\n      this.abortController = null;\n\n      if (message.status.type === \"running\") {\n        updateMessage({\n          status: { type: \"complete\", reason: \"unknown\" },\n        });\n      }\n    } catch (e) {\n      this.abortController = null;\n\n      // TODO this should be handled by the run result stream\n      if (e instanceof Error && e.name === \"AbortError\") {\n        updateMessage({\n          status: { type: \"incomplete\", reason: \"cancelled\" },\n        });\n      } else {\n        updateMessage({\n          status: {\n            type: \"incomplete\",\n            reason: \"error\",\n            error:\n              e instanceof Error\n                ? e.message\n                : `[${typeof e}] ${new String(e).toString()}`,\n          },\n        });\n\n        throw e;\n      }\n    } finally {\n      if (\n        message.status.type === \"complete\" ||\n        message.status.type === \"incomplete\"\n      ) {\n        await this._options.adapters.history?.append({\n          parentId,\n          message: message,\n        });\n      }\n    }\n    return message;\n  }\n\n  public cancelRun() {\n    this.abortController?.abort();\n    this.abortController = null;\n  }\n\n  public addToolResult({\n    messageId,\n    toolCallId,\n    result,\n  }: AddToolResultOptions) {\n    const messageData = this.repository.getMessage(messageId);\n    const { parentId } = messageData;\n    let { message } = messageData;\n\n    if (message.role !== \"assistant\")\n      throw new Error(\"Tried to add tool result to non-assistant message\");\n\n    let added = false;\n    let found = false;\n    const newContent = message.content.map((c) => {\n      if (c.type !== \"tool-call\") return c;\n      if (c.toolCallId !== toolCallId) return c;\n      found = true;\n      if (!c.result) added = true;\n      return {\n        ...c,\n        result,\n      };\n    });\n\n    if (!found)\n      throw new Error(\"Tried to add tool result to non-existing tool call\");\n\n    message = {\n      ...message,\n      content: newContent,\n    };\n    this.repository.addOrUpdateMessage(parentId, message);\n\n    if (\n      added &&\n      shouldContinue(\n        message,\n        this._options.unstable_shouldContinueIgnoreToolNames ?? [],\n      )\n    ) {\n      this.performRoundtrip(parentId, message, this._lastRunConfig);\n    }\n  }\n}\n"],"mappings":"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","names":["steps"]}
         
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"sources":["../../../src/runtimes/local/LocalThreadRuntimeCore.tsx"],"sourcesContent":["import { generateId } from \"../../internal\";\nimport type { AppendMessage, ThreadAssistantMessage } from \"../../types\";\nimport { fromCoreMessage } from \"../edge\";\nimport type { ChatModelRunResult } from \"./ChatModelAdapter\";\nimport { shouldContinue } from \"./shouldContinue\";\nimport { LocalRuntimeOptionsBase } from \"./LocalRuntimeOptions\";\nimport {\n  AddToolResultOptions,\n  ThreadSuggestion,\n  ThreadRuntimeCore,\n  StartRunConfig,\n} from \"../core/ThreadRuntimeCore\";\nimport { BaseThreadRuntimeCore } from \"../core/BaseThreadRuntimeCore\";\nimport { RunConfig } from \"../../types/AssistantTypes\";\nimport { ModelContextProvider } from \"../../model-context\";\n\nexport class LocalThreadRuntimeCore\n  extends BaseThreadRuntimeCore\n  implements ThreadRuntimeCore\n{\n  public readonly capabilities = {\n    switchToBranch: true,\n    edit: true,\n    reload: true,\n    cancel: true,\n    unstable_copy: true,\n    speech: false,\n    attachments: false,\n    feedback: false,\n  };\n\n  private abortController: AbortController | null = null;\n\n  public readonly isDisabled = false;\n  public readonly suggestions: readonly ThreadSuggestion[] = [];\n\n  public get adapters() {\n    return this._options.adapters;\n  }\n\n  constructor(\n    contextProvider: ModelContextProvider,\n    options: LocalRuntimeOptionsBase,\n  ) {\n    super(contextProvider);\n    this.__internal_setOptions(options);\n  }\n\n  private _options!: LocalRuntimeOptionsBase;\n\n  private _lastRunConfig: RunConfig = {};\n\n  public get extras() {\n    return undefined;\n  }\n\n  public __internal_setOptions(options: LocalRuntimeOptionsBase) {\n    if (this._options === options) return;\n\n    this._options = options;\n\n    let hasUpdates = false;\n\n    const canSpeak = options.adapters?.speech !== undefined;\n    if (this.capabilities.speech !== canSpeak) {\n      this.capabilities.speech = canSpeak;\n      hasUpdates = true;\n    }\n\n    const canAttach = options.adapters?.attachments !== undefined;\n    if (this.capabilities.attachments !== canAttach) {\n      this.capabilities.attachments = canAttach;\n      hasUpdates = true;\n    }\n\n    const canFeedback = options.adapters?.feedback !== undefined;\n    if (this.capabilities.feedback !== canFeedback) {\n      this.capabilities.feedback = canFeedback;\n      hasUpdates = true;\n    }\n\n    if (hasUpdates) this._notifySubscribers();\n  }\n\n  private _loadPromise: Promise<void> | undefined;\n  public __internal_load() {\n    if (this._loadPromise) return this._loadPromise;\n\n    const promise = this.adapters.history?.load() ?? Promise.resolve(null);\n\n    this._loadPromise = promise.then((repo) => {\n      if (!repo) return;\n      this.repository.import(repo);\n      this._notifySubscribers();\n    });\n\n    return this._loadPromise;\n  }\n\n  public async append(message: AppendMessage): Promise<void> {\n    this.ensureInitialized();\n\n    const newMessage = fromCoreMessage(message, {\n      attachments: message.attachments,\n    });\n    this.repository.addOrUpdateMessage(message.parentId, newMessage);\n    this._options.adapters.history?.append({\n      parentId: message.parentId,\n      message: newMessage,\n    });\n\n    const startRun = message.startRun ?? message.role === \"user\";\n    if (startRun) {\n      await this.startRun({\n        parentId: newMessage.id,\n        sourceId: message.sourceId,\n        runConfig: message.runConfig ?? {},\n      });\n    } else {\n      this.repository.resetHead(newMessage.id);\n      this._notifySubscribers();\n    }\n  }\n\n  public async startRun({\n    parentId,\n    runConfig,\n  }: StartRunConfig): Promise<void> {\n    this.ensureInitialized();\n\n    this.repository.resetHead(parentId);\n\n    // add assistant message\n    const id = generateId();\n    let message: ThreadAssistantMessage = {\n      id,\n      role: \"assistant\",\n      status: { type: \"running\" },\n      content: [],\n      metadata: {\n        unstable_annotations: [],\n        unstable_data: [],\n        steps: [],\n        custom: {},\n      },\n      createdAt: new Date(),\n    };\n\n    this._notifyEventSubscribers(\"run-start\");\n\n    try {\n      do {\n        message = await this.performRoundtrip(parentId, message, runConfig);\n      } while (shouldContinue(message, this._options.unstable_humanToolNames));\n    } finally {\n      this._notifyEventSubscribers(\"run-end\");\n    }\n  }\n\n  private async performRoundtrip(\n    parentId: string | null,\n    message: ThreadAssistantMessage,\n    runConfig: RunConfig | undefined,\n  ) {\n    const messages = this.repository.getMessages();\n\n    // abort existing run\n    this.abortController?.abort();\n    this.abortController = new AbortController();\n\n    const initialContent = message.content;\n    const initialAnnotations = message.metadata?.unstable_annotations;\n    const initialData = message.metadata?.unstable_data;\n    const initialSteps = message.metadata?.steps;\n    const initalCustom = message.metadata?.custom;\n    const updateMessage = (m: Partial<ChatModelRunResult>) => {\n      const newSteps = m.metadata?.steps;\n      const steps = newSteps\n        ? [...(initialSteps ?? []), ...newSteps]\n        : undefined;\n\n      const newAnnotations = m.metadata?.unstable_annotations;\n      const newData = m.metadata?.unstable_data;\n      const annotations = newAnnotations\n        ? [...(initialAnnotations ?? []), ...newAnnotations]\n        : undefined;\n      const data = newData ? [...(initialData ?? []), ...newData] : undefined;\n\n      message = {\n        ...message,\n        ...(m.content\n          ? { content: [...initialContent, ...(m.content ?? [])] }\n          : undefined),\n        status: m.status ?? message.status,\n        ...(m.metadata\n          ? {\n              metadata: {\n                ...message.metadata,\n                ...(annotations\n                  ? { unstable_annotations: annotations }\n                  : undefined),\n                ...(data ? { unstable_data: data } : undefined),\n                ...(steps ? { steps } : undefined),\n                ...(m.metadata?.custom\n                  ? {\n                      custom: { ...(initalCustom ?? {}), ...m.metadata.custom },\n                    }\n                  : undefined),\n              },\n            }\n          : undefined),\n      };\n      this.repository.addOrUpdateMessage(parentId, message);\n      this._notifySubscribers();\n    };\n\n    const maxSteps = this._options.maxSteps ?? 2;\n\n    const steps = message.metadata?.steps?.length ?? 0;\n    if (steps >= maxSteps) {\n      // reached max tool steps\n      updateMessage({\n        status: {\n          type: \"incomplete\",\n          reason: \"tool-calls\",\n        },\n      });\n      return message;\n    } else {\n      updateMessage({\n        status: {\n          type: \"running\",\n        },\n      });\n    }\n\n    try {\n      this._lastRunConfig = runConfig ?? {};\n      const context = this.getModelContext();\n      const promiseOrGenerator = this.adapters.chatModel.run({\n        messages,\n        runConfig: this._lastRunConfig,\n        abortSignal: this.abortController.signal,\n        context,\n        config: context,\n        unstable_assistantMessageId: message.id,\n        unstable_getMessage() {\n          return message;\n        },\n      });\n\n      // handle async iterator for streaming results\n      if (Symbol.asyncIterator in promiseOrGenerator) {\n        for await (const r of promiseOrGenerator) {\n          updateMessage(r);\n        }\n      } else {\n        updateMessage(await promiseOrGenerator);\n      }\n\n      this.abortController = null;\n\n      if (message.status.type === \"running\") {\n        updateMessage({\n          status: { type: \"complete\", reason: \"unknown\" },\n        });\n      }\n    } catch (e) {\n      this.abortController = null;\n\n      // TODO this should be handled by the run result stream\n      if (e instanceof Error && e.name === \"AbortError\") {\n        updateMessage({\n          status: { type: \"incomplete\", reason: \"cancelled\" },\n        });\n      } else {\n        updateMessage({\n          status: {\n            type: \"incomplete\",\n            reason: \"error\",\n            error:\n              e instanceof Error\n                ? e.message\n                : `[${typeof e}] ${new String(e).toString()}`,\n          },\n        });\n\n        throw e;\n      }\n    } finally {\n      if (\n        message.status.type === \"complete\" ||\n        message.status.type === \"incomplete\"\n      ) {\n        await this._options.adapters.history?.append({\n          parentId,\n          message: message,\n        });\n      }\n    }\n    return message;\n  }\n\n  public cancelRun() {\n    this.abortController?.abort();\n    this.abortController = null;\n  }\n\n  public addToolResult({\n    messageId,\n    toolCallId,\n    result,\n  }: AddToolResultOptions) {\n    const messageData = this.repository.getMessage(messageId);\n    const { parentId } = messageData;\n    let { message } = messageData;\n\n    if (message.role !== \"assistant\")\n      throw new Error(\"Tried to add tool result to non-assistant message\");\n\n    let added = false;\n    let found = false;\n    const newContent = message.content.map((c) => {\n      if (c.type !== \"tool-call\") return c;\n      if (c.toolCallId !== toolCallId) return c;\n      found = true;\n      if (!c.result) added = true;\n      return {\n        ...c,\n        result,\n      };\n    });\n\n    if (!found)\n      throw new Error(\"Tried to add tool result to non-existing tool call\");\n\n    message = {\n      ...message,\n      content: newContent,\n    };\n    this.repository.addOrUpdateMessage(parentId, message);\n\n    if (\n      added &&\n      shouldContinue(message, this._options.unstable_humanToolNames)\n    ) {\n      this.performRoundtrip(parentId, message, this._lastRunConfig);\n    }\n  }\n}\n"],"mappings":"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","names":["steps"]}
         
     | 
| 
         @@ -1,3 +1,3 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            import type { ThreadAssistantMessage } from "../../types";
         
     | 
| 
       2 
     | 
    
         
            -
            export declare const shouldContinue: (result: ThreadAssistantMessage,  
     | 
| 
      
 2 
     | 
    
         
            +
            export declare const shouldContinue: (result: ThreadAssistantMessage, humanToolNames: string[] | undefined) => boolean;
         
     | 
| 
       3 
3 
     | 
    
         
             
            //# sourceMappingURL=shouldContinue.d.ts.map
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"file":"shouldContinue.d.ts","sourceRoot":"","sources":["../../../src/runtimes/local/shouldContinue.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,eAAO,MAAM,cAAc,WACjB,sBAAsB, 
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"file":"shouldContinue.d.ts","sourceRoot":"","sources":["../../../src/runtimes/local/shouldContinue.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,eAAO,MAAM,cAAc,WACjB,sBAAsB,kBACd,MAAM,EAAE,GAAG,SAAS,YAqBrC,CAAC"}
         
     | 
| 
         @@ -23,9 +23,14 @@ __export(shouldContinue_exports, { 
     | 
|
| 
       23 
23 
     | 
    
         
             
              shouldContinue: () => shouldContinue
         
     | 
| 
       24 
24 
     | 
    
         
             
            });
         
     | 
| 
       25 
25 
     | 
    
         
             
            module.exports = __toCommonJS(shouldContinue_exports);
         
     | 
| 
       26 
     | 
    
         
            -
            var shouldContinue = (result,  
     | 
| 
       27 
     | 
    
         
            -
              ( 
     | 
| 
       28 
     | 
    
         
            -
            );
         
     | 
| 
      
 26 
     | 
    
         
            +
            var shouldContinue = (result, humanToolNames) => {
         
     | 
| 
      
 27 
     | 
    
         
            +
              if (humanToolNames === void 0) {
         
     | 
| 
      
 28 
     | 
    
         
            +
                return result.status?.type === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
         
     | 
| 
      
 29 
     | 
    
         
            +
              }
         
     | 
| 
      
 30 
     | 
    
         
            +
              return result.status?.type === "requires-action" && result.status.reason === "tool-calls" && result.content.every(
         
     | 
| 
      
 31 
     | 
    
         
            +
                (c) => c.type !== "tool-call" || !!c.result || !humanToolNames.includes(c.toolName)
         
     | 
| 
      
 32 
     | 
    
         
            +
              );
         
     | 
| 
      
 33 
     | 
    
         
            +
            };
         
     | 
| 
       29 
34 
     | 
    
         
             
            // Annotate the CommonJS export names for ESM import in node:
         
     | 
| 
       30 
35 
     | 
    
         
             
            0 && (module.exports = {
         
     | 
| 
       31 
36 
     | 
    
         
             
              shouldContinue
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"sources":["../../../src/runtimes/local/shouldContinue.tsx"],"sourcesContent":["import type { ThreadAssistantMessage } from \"../../types\";\n\nexport const shouldContinue = (\n  result: ThreadAssistantMessage,\n   
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"sources":["../../../src/runtimes/local/shouldContinue.tsx"],"sourcesContent":["import type { ThreadAssistantMessage } from \"../../types\";\n\nexport const shouldContinue = (\n  result: ThreadAssistantMessage,\n  humanToolNames: string[] | undefined,\n) => {\n  // TODO legacy behavior -- make specifying human tool names required\n  if (humanToolNames === undefined) {\n    return (\n      result.status?.type === \"requires-action\" &&\n      result.status.reason === \"tool-calls\" &&\n      result.content.every((c) => c.type !== \"tool-call\" || !!c.result)\n    );\n  }\n\n  return (\n    result.status?.type === \"requires-action\" &&\n    result.status.reason === \"tool-calls\" &&\n    result.content.every(\n      (c) =>\n        c.type !== \"tool-call\" ||\n        !!c.result ||\n        !humanToolNames.includes(c.toolName),\n    )\n  );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,iBAAiB,CAC5B,QACA,mBACG;AAEH,MAAI,mBAAmB,QAAW;AAChC,WACE,OAAO,QAAQ,SAAS,qBACxB,OAAO,OAAO,WAAW,gBACzB,OAAO,QAAQ,MAAM,CAAC,MAAM,EAAE,SAAS,eAAe,CAAC,CAAC,EAAE,MAAM;AAAA,EAEpE;AAEA,SACE,OAAO,QAAQ,SAAS,qBACxB,OAAO,OAAO,WAAW,gBACzB,OAAO,QAAQ;AAAA,IACb,CAAC,MACC,EAAE,SAAS,eACX,CAAC,CAAC,EAAE,UACJ,CAAC,eAAe,SAAS,EAAE,QAAQ;AAAA,EACvC;AAEJ;","names":[]}
         
     | 
| 
         @@ -1,7 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            // src/runtimes/local/shouldContinue.tsx
         
     | 
| 
       2 
     | 
    
         
            -
            var shouldContinue = (result,  
     | 
| 
       3 
     | 
    
         
            -
              ( 
     | 
| 
       4 
     | 
    
         
            -
            );
         
     | 
| 
      
 2 
     | 
    
         
            +
            var shouldContinue = (result, humanToolNames) => {
         
     | 
| 
      
 3 
     | 
    
         
            +
              if (humanToolNames === void 0) {
         
     | 
| 
      
 4 
     | 
    
         
            +
                return result.status?.type === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
         
     | 
| 
      
 5 
     | 
    
         
            +
              }
         
     | 
| 
      
 6 
     | 
    
         
            +
              return result.status?.type === "requires-action" && result.status.reason === "tool-calls" && result.content.every(
         
     | 
| 
      
 7 
     | 
    
         
            +
                (c) => c.type !== "tool-call" || !!c.result || !humanToolNames.includes(c.toolName)
         
     | 
| 
      
 8 
     | 
    
         
            +
              );
         
     | 
| 
      
 9 
     | 
    
         
            +
            };
         
     | 
| 
       5 
10 
     | 
    
         
             
            export {
         
     | 
| 
       6 
11 
     | 
    
         
             
              shouldContinue
         
     | 
| 
       7 
12 
     | 
    
         
             
            };
         
     | 
| 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            {"version":3,"sources":["../../../src/runtimes/local/shouldContinue.tsx"],"sourcesContent":["import type { ThreadAssistantMessage } from \"../../types\";\n\nexport const shouldContinue = (\n  result: ThreadAssistantMessage,\n   
     | 
| 
      
 1 
     | 
    
         
            +
            {"version":3,"sources":["../../../src/runtimes/local/shouldContinue.tsx"],"sourcesContent":["import type { ThreadAssistantMessage } from \"../../types\";\n\nexport const shouldContinue = (\n  result: ThreadAssistantMessage,\n  humanToolNames: string[] | undefined,\n) => {\n  // TODO legacy behavior -- make specifying human tool names required\n  if (humanToolNames === undefined) {\n    return (\n      result.status?.type === \"requires-action\" &&\n      result.status.reason === \"tool-calls\" &&\n      result.content.every((c) => c.type !== \"tool-call\" || !!c.result)\n    );\n  }\n\n  return (\n    result.status?.type === \"requires-action\" &&\n    result.status.reason === \"tool-calls\" &&\n    result.content.every(\n      (c) =>\n        c.type !== \"tool-call\" ||\n        !!c.result ||\n        !humanToolNames.includes(c.toolName),\n    )\n  );\n};\n"],"mappings":";AAEO,IAAM,iBAAiB,CAC5B,QACA,mBACG;AAEH,MAAI,mBAAmB,QAAW;AAChC,WACE,OAAO,QAAQ,SAAS,qBACxB,OAAO,OAAO,WAAW,gBACzB,OAAO,QAAQ,MAAM,CAAC,MAAM,EAAE,SAAS,eAAe,CAAC,CAAC,EAAE,MAAM;AAAA,EAEpE;AAEA,SACE,OAAO,QAAQ,SAAS,qBACxB,OAAO,OAAO,WAAW,gBACzB,OAAO,QAAQ;AAAA,IACb,CAAC,MACC,EAAE,SAAS,eACX,CAAC,CAAC,EAAE,UACJ,CAAC,eAAe,SAAS,EAAE,QAAQ;AAAA,EACvC;AAEJ;","names":[]}
         
     | 
    
        package/package.json
    CHANGED
    
    
| 
         @@ -58,8 +58,11 @@ const assistantMessageSplitter = () => { 
     | 
|
| 
       58 
58 
     | 
    
         
             
                    type: "tool-result",
         
     | 
| 
       59 
59 
     | 
    
         
             
                    toolCallId: part.toolCallId,
         
     | 
| 
       60 
60 
     | 
    
         
             
                    toolName: part.toolName,
         
     | 
| 
       61 
     | 
    
         
            -
                    result: 
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
      
 61 
     | 
    
         
            +
                    result:
         
     | 
| 
      
 62 
     | 
    
         
            +
                      part.result === undefined
         
     | 
| 
      
 63 
     | 
    
         
            +
                        ? "Error: tool is has no configured code to run"
         
     | 
| 
      
 64 
     | 
    
         
            +
                        : part.result,
         
     | 
| 
      
 65 
     | 
    
         
            +
                    isError: part.isError ?? part.result === undefined,
         
     | 
| 
       63 
66 
     | 
    
         
             
                  });
         
     | 
| 
       64 
67 
     | 
    
         
             
                },
         
     | 
| 
       65 
68 
     | 
    
         
             
                getMessages: () => {
         
     | 
| 
         @@ -17,10 +17,9 @@ export type LocalRuntimeOptionsBase = { 
     | 
|
| 
       17 
17 
     | 
    
         
             
              };
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
              /**
         
     | 
| 
       20 
     | 
    
         
            -
               *  
     | 
| 
       21 
     | 
    
         
            -
               * This feature will be removed in a future version without notice. DO NOT USE.
         
     | 
| 
      
 20 
     | 
    
         
            +
               * Names of tools that are allowed to interrupt the run in order to wait for human/external approval.
         
     | 
| 
       22 
21 
     | 
    
         
             
               */
         
     | 
| 
       23 
     | 
    
         
            -
               
     | 
| 
      
 22 
     | 
    
         
            +
              unstable_humanToolNames?: string[] | undefined;
         
     | 
| 
       24 
23 
     | 
    
         
             
            };
         
     | 
| 
       25 
24 
     | 
    
         | 
| 
       26 
25 
     | 
    
         
             
            // TODO align LocalRuntimeOptions with LocalRuntimeOptionsBase
         
     | 
| 
         @@ -38,7 +37,7 @@ export const splitLocalRuntimeOptions = <T extends LocalRuntimeOptions>( 
     | 
|
| 
       38 
37 
     | 
    
         
             
                initialMessages,
         
     | 
| 
       39 
38 
     | 
    
         
             
                maxSteps,
         
     | 
| 
       40 
39 
     | 
    
         
             
                adapters,
         
     | 
| 
       41 
     | 
    
         
            -
                 
     | 
| 
      
 40 
     | 
    
         
            +
                unstable_humanToolNames,
         
     | 
| 
       42 
41 
     | 
    
         
             
                ...rest
         
     | 
| 
       43 
42 
     | 
    
         
             
              } = options;
         
     | 
| 
       44 
43 
     | 
    
         | 
| 
         @@ -48,7 +47,7 @@ export const splitLocalRuntimeOptions = <T extends LocalRuntimeOptions>( 
     | 
|
| 
       48 
47 
     | 
    
         
             
                  initialMessages,
         
     | 
| 
       49 
48 
     | 
    
         
             
                  maxSteps,
         
     | 
| 
       50 
49 
     | 
    
         
             
                  adapters,
         
     | 
| 
       51 
     | 
    
         
            -
                   
     | 
| 
      
 50 
     | 
    
         
            +
                  unstable_humanToolNames,
         
     | 
| 
       52 
51 
     | 
    
         
             
                },
         
     | 
| 
       53 
52 
     | 
    
         
             
                otherOptions: rest,
         
     | 
| 
       54 
53 
     | 
    
         
             
              };
         
     | 
| 
         @@ -151,12 +151,7 @@ export class LocalThreadRuntimeCore 
     | 
|
| 
       151 
151 
     | 
    
         
             
                try {
         
     | 
| 
       152 
152 
     | 
    
         
             
                  do {
         
     | 
| 
       153 
153 
     | 
    
         
             
                    message = await this.performRoundtrip(parentId, message, runConfig);
         
     | 
| 
       154 
     | 
    
         
            -
                  } while (
         
     | 
| 
       155 
     | 
    
         
            -
                    shouldContinue(
         
     | 
| 
       156 
     | 
    
         
            -
                      message,
         
     | 
| 
       157 
     | 
    
         
            -
                      this._options.unstable_shouldContinueIgnoreToolNames ?? [],
         
     | 
| 
       158 
     | 
    
         
            -
                    )
         
     | 
| 
       159 
     | 
    
         
            -
                  );
         
     | 
| 
      
 154 
     | 
    
         
            +
                  } while (shouldContinue(message, this._options.unstable_humanToolNames));
         
     | 
| 
       160 
155 
     | 
    
         
             
                } finally {
         
     | 
| 
       161 
156 
     | 
    
         
             
                  this._notifyEventSubscribers("run-end");
         
     | 
| 
       162 
157 
     | 
    
         
             
                }
         
     | 
| 
         @@ -347,10 +342,7 @@ export class LocalThreadRuntimeCore 
     | 
|
| 
       347 
342 
     | 
    
         | 
| 
       348 
343 
     | 
    
         
             
                if (
         
     | 
| 
       349 
344 
     | 
    
         
             
                  added &&
         
     | 
| 
       350 
     | 
    
         
            -
                  shouldContinue(
         
     | 
| 
       351 
     | 
    
         
            -
                    message,
         
     | 
| 
       352 
     | 
    
         
            -
                    this._options.unstable_shouldContinueIgnoreToolNames ?? [],
         
     | 
| 
       353 
     | 
    
         
            -
                  )
         
     | 
| 
      
 345 
     | 
    
         
            +
                  shouldContinue(message, this._options.unstable_humanToolNames)
         
     | 
| 
       354 
346 
     | 
    
         
             
                ) {
         
     | 
| 
       355 
347 
     | 
    
         
             
                  this.performRoundtrip(parentId, message, this._lastRunConfig);
         
     | 
| 
       356 
348 
     | 
    
         
             
                }
         
     | 
| 
         @@ -2,13 +2,25 @@ import type { ThreadAssistantMessage } from "../../types"; 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            export const shouldContinue = (
         
     | 
| 
       4 
4 
     | 
    
         
             
              result: ThreadAssistantMessage,
         
     | 
| 
       5 
     | 
    
         
            -
               
     | 
| 
       6 
     | 
    
         
            -
            ) =>
         
     | 
| 
       7 
     | 
    
         
            -
               
     | 
| 
       8 
     | 
    
         
            -
               
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                   
     | 
| 
       12 
     | 
    
         
            -
                  !!c.result 
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
      
 5 
     | 
    
         
            +
              humanToolNames: string[] | undefined,
         
     | 
| 
      
 6 
     | 
    
         
            +
            ) => {
         
     | 
| 
      
 7 
     | 
    
         
            +
              // TODO legacy behavior -- make specifying human tool names required
         
     | 
| 
      
 8 
     | 
    
         
            +
              if (humanToolNames === undefined) {
         
     | 
| 
      
 9 
     | 
    
         
            +
                return (
         
     | 
| 
      
 10 
     | 
    
         
            +
                  result.status?.type === "requires-action" &&
         
     | 
| 
      
 11 
     | 
    
         
            +
                  result.status.reason === "tool-calls" &&
         
     | 
| 
      
 12 
     | 
    
         
            +
                  result.content.every((c) => c.type !== "tool-call" || !!c.result)
         
     | 
| 
      
 13 
     | 
    
         
            +
                );
         
     | 
| 
      
 14 
     | 
    
         
            +
              }
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              return (
         
     | 
| 
      
 17 
     | 
    
         
            +
                result.status?.type === "requires-action" &&
         
     | 
| 
      
 18 
     | 
    
         
            +
                result.status.reason === "tool-calls" &&
         
     | 
| 
      
 19 
     | 
    
         
            +
                result.content.every(
         
     | 
| 
      
 20 
     | 
    
         
            +
                  (c) =>
         
     | 
| 
      
 21 
     | 
    
         
            +
                    c.type !== "tool-call" ||
         
     | 
| 
      
 22 
     | 
    
         
            +
                    !!c.result ||
         
     | 
| 
      
 23 
     | 
    
         
            +
                    !humanToolNames.includes(c.toolName),
         
     | 
| 
      
 24 
     | 
    
         
            +
                )
         
     | 
| 
       14 
25 
     | 
    
         
             
              );
         
     | 
| 
      
 26 
     | 
    
         
            +
            };
         
     |