@dudko.dev/agent-web 0.0.20 → 0.0.21

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/agent-web.js CHANGED
@@ -221,7 +221,7 @@ ${t}
221
221
  Continue THIS step using the results above. Reply with a single JSON object, nothing else:
222
222
  { "reply": string, "actions": [ { "tool": string, "args": object } ] }
223
223
  - If the step is now complete: "actions": [] and a short outcome in "reply".
224
- - Otherwise emit ONLY the remaining or corrective calls \u2014 never repeat a successful call.`,SB=async(e,t)=>{let n=Math.max(1,t.maxSteps??4),o=()=>{let d=Pw(t);return d?Object.fromEntries(Object.entries(t.tools).filter(([m])=>d.includes(m))):t.tools},r=hi(t.abortSignal,t.timeoutMs),i=t.messages?[...t.messages]:[{role:"user",content:t.prompt??""}],a=[],s=new Set,c=Wn(),l="",u=!1;for(let d=1;d<=n&&!r?.aborted;d+=1){if(t.shouldStop?.(c)){u=!0;break}let m=new Set(Object.keys(o())),f=await Oo({model:e,...KO(t),messages:t.caching?dc(i,t.caching):i,abortSignal:r});c=wi(c,rr(f.usage));let h=Tw(f.text);if(l=h.reply,h.reply.includes(Bl)||h.actions.length===0)break;let y=Ow(h.actions);if(s.has(y))break;s.add(y);let b=[];for(let v of h.actions){if(r?.aborted)break;t.callbacks?.onToolCall?.(v.tool,v.args);let x=await bw(v,o(),{abortSignal:r});a.push(x),b.push(x),t.callbacks?.onToolResult?.(x.name,x.output,x.ok)}if(d===n||r?.aborted)break;let w=Object.keys(o()).filter(v=>!m.has(v));i.push({role:"assistant",content:f.text}),i.push({role:"user",content:$B(b,w.length&&t.describeTools?t.describeTools(w):"")})}return l&&t.callbacks?.onTextDelta?.(l),{text:l,toolCalls:a,usage:c,stoppedByBudget:u}};var IB=e=>{if(!(e===void 0||e===!1))return e===!0?{level:"medium"}:typeof e=="string"?{level:e}:e},Rw=e=>{let t=IB(e);if(!t)return{};let n=t.level??"medium";if(n==="none")return{reasoning:"none"};let o=t.includeThoughts!==!1,r=t.budgetTokens;return typeof r=="number"&&r>0?{reasoning:n,providerOptions:{anthropic:{thinking:{type:"enabled",budgetTokens:r}},google:{thinkingConfig:{thinkingBudget:r,includeThoughts:o}}}}:o?{reasoning:n,providerOptions:{google:{thinkingConfig:{includeThoughts:!0}},openai:{reasoningSummary:"auto"}}}:{reasoning:n}},jw=(e,t,n)=>n&&e in n?n[e]:t,HO=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),YO=(e,t)=>{let n={...e};for(let[o,r]of Object.entries(t))n[o]=HO(n[o])&&HO(r)?YO(n[o],r):r;return n},Nw=(...e)=>{let t;for(let n of e)!n||Object.keys(n).length===0||(t=t?YO(t,n):{...n});return t};var XO=/^data:([^;,]+)?;base64,(.*)$/s,QO=/^https?:\/\//i,Dw=e=>{if(e.mediaType)return e.mediaType;if(typeof e.data=="string"){let n=XO.exec(e.data);if(n?.[1])return n[1]}let t=e.data instanceof URL?e.data.href:typeof e.data=="string"?e.data:"";if(QO.test(t)||e.name){let n=(e.name??new URL(t,"http://x").pathname).split(".").pop()?.toLowerCase();if(n==="pdf")return"application/pdf";if(n&&["png","jpg","jpeg","gif","webp"].includes(n))return`image/${n==="jpg"?"jpeg":n}`}},xi=e=>{let t=Dw(e)??"";return t.startsWith("image/")?"image":t==="application/pdf"?"pdf":"file"},_B={image:"images",pdf:"PDF files",file:"file attachments"},kB={image:"Remove the image, or switch to a vision-capable model such as Gemini, Claude or GPT-4o/GPT-5.",pdf:"Convert the PDF to text first (e.g. PDF \u2192 Markdown), or switch to a model that reads PDFs such as Gemini, Claude or GPT-4o/GPT-5.",file:"Paste its text instead, or switch to a model that accepts this file type."},xn=class extends Error{kind;constructor(t,n,o){super(`The model "${t}" can't take ${_B[n]}${o?` (${o})`:""}. ${kB[n]}`),this.name="AttachmentsNotSupportedError",this.kind=n}toJSON(){return this.message}},vp=class extends xn{constructor(t,n){super(t,"image",n),this.name="ImagesNotSupportedError"}},bp=(e,t,n)=>t==="image"?new vp(e,n):new xn(e,t,n),TB=e=>{if(typeof e.data=="string"){let t=XO.exec(e.data);if(t)return t[2];if(QO.test(e.data))return new URL(e.data)}return e.data},wp=e=>{let t=xi(e),n=Dw(e)??(t==="image"?"image":"application/octet-stream");return{type:"file",data:TB(e),mediaType:n,...e.name?{filename:e.name}:{}}},EB=wp,xp=e=>{if(typeof e=="string")return e;let t=e;return t?.modelId?`${t.modelId}${t.provider?` (${t.provider})`:""}`:"this model"},MB=/image|vision|multimodal|multi-modal|media type|mediatype|pdf|document|unsupported (file|content|part|mime)|does not support (file|content)|invalid content type|image_url|inline_?data|file_?data/i,$p=e=>MB.test(e instanceof Error?`${e.name} ${e.message}`:String(e)),CB=$p;var Za=(e,t)=>e.images?.length?{messages:[{role:"user",content:[{type:"text",text:t},...e.images.map(wp)]}]}:{prompt:t},$i=(e,t,n)=>{if(!e.images?.length||t instanceof xn||!$p(t))return;let o=new Set(e.images.map(xi)),r=o.size===1?[...o][0]:"file",i=t instanceof Error?t.message.slice(0,160):void 0;return bp(xp(n),r,i&&`the provider said: ${i}`)},PB=(e,t)=>gw(t,e.raw.systemPrompt);var No=(e,t,n)=>{let o=PB(e,n),r=Rw(jw(t,e.raw.thinking,e.raw.stageThinking)),i=e.caching??{enabled:!1},a=Nw(gx(i,e.config.clientName,t),r.providerOptions);return{system:fx(o,i),...r.reasoning?{reasoning:r.reasoning}:{},...a?{providerOptions:a}:{}}};var tA=e=>e.includes(Bl)?{summary:e.split(Bl).join("").trim(),blocked:!0}:{summary:e.trim(),blocked:!1},OB=(e,t)=>{let n=e.strategy??e.config.toolSelectionStrategy,o=[...e.builtinTools??[]].filter(a=>e.tools[a]),r=t.suggestedTools??[],i=r.filter(a=>e.tools[a]);if(n==="search"){let a=(e.discovered?.()??[]).slice(-16);return[...new Set([...o,...i,...a])]}if(n==="plan-narrowed")return i.length===0&&r.length>0?Object.keys(e.tools):[...new Set([...i,...o])]},AB=(e,t)=>e.length>0?e:t>0?`Executed ${t} tool call(s).`:"Step produced no output.",eA=(e,t)=>Vl(Object.fromEntries(t.filter(n=>e.tools[n]).map(n=>[n,e.tools[n]])),e.toolHint),Uw=async(e,t,n,o,r,i)=>{let a=await e.state();e.setCurrentStep?.(n);let s=OB(e,n),c=(e.strategy??e.config.toolSelectionStrategy)==="search",l=eA(e,s??Object.keys(e.tools)),u=e.activeSkills?.()??[],d=e.prompts.executor({goal:t,state:a,step:n.description,index:o,total:r,toolCatalog:l,done:i,mode:e.executorMode,skills:e.skills?.length?Ll(e.skills):void 0,activeSkills:u.length?yi(u):void 0,searchMode:c&&!!e.tools[bi]}),m=await Aw(e.executorModel,{mode:e.executorMode,...No(e,"executor",d.system),...Za(e,d.prompt),tools:e.tools,activeTools:c?()=>[...new Set([...s??[],...e.discovered?.()??[]])]:s,describeTools:y=>eA(e,y),maxSteps:e.config.maxStepsPerTask,shouldStop:e.overBudget,maxOutputTokens:e.config.budgets.executor,temperature:e.config.temperature,abortSignal:e.signal,timeoutMs:e.config.chatTimeoutMs,caching:e.caching,...e.config.compaction.clearToolResultsAfterTokens>0?{clearToolResults:{triggerTokens:e.config.compaction.clearToolResultsAfterTokens,keep:e.config.compaction.keepToolResults}}:{},callbacks:{onToolResultsCleared:y=>{e.log.info(`cleared ${y.cleared} stale tool result(s) from the step's context`),e.emit({type:"context.compacted",scope:"tool-results",beforeTokens:y.beforeTokens,afterTokens:y.afterTokens})},onTextDelta:y=>e.emit({type:"step.text-delta",step:n,delta:y}),onReasoningDelta:y=>e.emit({type:"step.reasoning-delta",step:n,delta:y}),onToolCall:(y,b)=>{e.log.info(`tool call: ${y}`,b),e.emit({type:"step.tool-call",step:n,name:y,input:b})},onToolResult:(y,b,w)=>{e.log.debug(`tool result: ${y} ${w?"ok":"FAILED"}`,b),e.emit({type:"step.tool-result",step:n,name:y,output:b,ok:w})}}}).catch(y=>{throw $i(e,y,e.executorModel)??y});e.log.debug("executor text:",m.text);let{summary:f,blocked:h}=tA(m.text);return{result:{step:n,summary:AB(f,m.toolCalls.length),toolCalls:m.toolCalls,blocked:h},usage:m.usage,stoppedByBudget:m.stoppedByBudget}},zw=e=>{if(e.blocked)return!0;let{toolCalls:t}=e;return t.some((n,o)=>!n.ok&&!t.slice(o+1).some(r=>r.ok&&r.name===n.name))},Lw=async(e,t,n={})=>{if(e==="always")return!0;if(typeof e!="function")return zw(t);let o=()=>zw(t),r=(async()=>{try{return!!await e(t)}catch(a){return n.onError?.(a),o()}})(),i=hi(n.signal,n.timeoutMs);return i?Promise.race([r,new Promise(a=>{i.aborted?a(o()):i.addEventListener("abort",()=>a(o()),{once:!0})})]):r};Td();Td();var rA=Dt.object({description:Dt.string(),expectedOutcome:Dt.string().optional(),suggestedTools:Dt.array(Dt.string()).optional()}),Fw=Dt.object({thought:Dt.string(),steps:Dt.array(rA),skills:Dt.array(Dt.string()).optional()}),Vw=Dt.object({decision:Dt.enum(["continue","revise","finish"]),reason:Dt.string(),plan:Dt.array(Dt.string()).optional()});var nA=(e,t)=>e.filter(n=>n.description&&n.description.trim()).slice(0,Math.max(1,t)).map((n,o)=>({id:`s${o+1}`,description:n.description.trim(),expectedOutcome:n.expectedOutcome,suggestedTools:n.suggestedTools})),Sp=async(e,t,n)=>{let o=await e.state(),r=n?`${t}
224
+ - Otherwise emit ONLY the remaining or corrective calls \u2014 never repeat a successful call.`,SB=async(e,t)=>{let n=Math.max(1,t.maxSteps??4),o=()=>{let d=Pw(t);return d?Object.fromEntries(Object.entries(t.tools).filter(([m])=>d.includes(m))):t.tools},r=hi(t.abortSignal,t.timeoutMs),i=t.messages?[...t.messages]:[{role:"user",content:t.prompt??""}],a=[],s=new Set,c=Wn(),l="",u=!1;for(let d=1;d<=n&&!r?.aborted;d+=1){if(t.shouldStop?.(c)){u=!0;break}let m=new Set(Object.keys(o())),f=await Oo({model:e,...KO(t),messages:t.caching?dc(i,t.caching):i,abortSignal:r});c=wi(c,rr(f.usage));let h=Tw(f.text);if(l=h.reply,h.reply.includes(Bl)||h.actions.length===0)break;let y=Ow(h.actions);if(s.has(y))break;s.add(y);let b=[];for(let v of h.actions){if(r?.aborted)break;t.callbacks?.onToolCall?.(v.tool,v.args);let x=await bw(v,o(),{abortSignal:r});a.push(x),b.push(x),t.callbacks?.onToolResult?.(x.name,x.output,x.ok)}if(d===n||r?.aborted)break;let w=Object.keys(o()).filter(v=>!m.has(v));i.push({role:"assistant",content:f.text}),i.push({role:"user",content:$B(b,w.length&&t.describeTools?t.describeTools(w):"")})}return l&&t.callbacks?.onTextDelta?.(l),{text:l,toolCalls:a,usage:c,stoppedByBudget:u}};var IB=e=>{if(!(e===void 0||e===!1))return e===!0?{level:"medium"}:typeof e=="string"?{level:e}:e},Rw=e=>{let t=IB(e);if(!t)return{};let n=t.level??"medium",o=a=>({"web-llm":{extra_body:{enable_thinking:a}}});if(n==="none")return{reasoning:"none",providerOptions:o(!1)};let r=t.includeThoughts!==!1,i=t.budgetTokens;return typeof i=="number"&&i>0?{reasoning:n,providerOptions:{anthropic:{thinking:{type:"enabled",budgetTokens:i}},google:{thinkingConfig:{thinkingBudget:i,includeThoughts:r}},...o(!0)}}:r?{reasoning:n,providerOptions:{google:{thinkingConfig:{includeThoughts:!0}},openai:{reasoningSummary:"auto"},...o(!0)}}:{reasoning:n,providerOptions:o(!0)}},jw=(e,t,n)=>n&&e in n?n[e]:t,HO=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),YO=(e,t)=>{let n={...e};for(let[o,r]of Object.entries(t))n[o]=HO(n[o])&&HO(r)?YO(n[o],r):r;return n},Nw=(...e)=>{let t;for(let n of e)!n||Object.keys(n).length===0||(t=t?YO(t,n):{...n});return t};var XO=/^data:([^;,]+)?;base64,(.*)$/s,QO=/^https?:\/\//i,Dw=e=>{if(e.mediaType)return e.mediaType;if(typeof e.data=="string"){let n=XO.exec(e.data);if(n?.[1])return n[1]}let t=e.data instanceof URL?e.data.href:typeof e.data=="string"?e.data:"";if(QO.test(t)||e.name){let n=(e.name??new URL(t,"http://x").pathname).split(".").pop()?.toLowerCase();if(n==="pdf")return"application/pdf";if(n&&["png","jpg","jpeg","gif","webp"].includes(n))return`image/${n==="jpg"?"jpeg":n}`}},xi=e=>{let t=Dw(e)??"";return t.startsWith("image/")?"image":t==="application/pdf"?"pdf":"file"},_B={image:"images",pdf:"PDF files",file:"file attachments"},kB={image:"Remove the image, or switch to a vision-capable model such as Gemini, Claude or GPT-4o/GPT-5.",pdf:"Convert the PDF to text first (e.g. PDF \u2192 Markdown), or switch to a model that reads PDFs such as Gemini, Claude or GPT-4o/GPT-5.",file:"Paste its text instead, or switch to a model that accepts this file type."},xn=class extends Error{kind;constructor(t,n,o){super(`The model "${t}" can't take ${_B[n]}${o?` (${o})`:""}. ${kB[n]}`),this.name="AttachmentsNotSupportedError",this.kind=n}toJSON(){return this.message}},vp=class extends xn{constructor(t,n){super(t,"image",n),this.name="ImagesNotSupportedError"}},bp=(e,t,n)=>t==="image"?new vp(e,n):new xn(e,t,n),TB=e=>{if(typeof e.data=="string"){let t=XO.exec(e.data);if(t)return t[2];if(QO.test(e.data))return new URL(e.data)}return e.data},wp=e=>{let t=xi(e),n=Dw(e)??(t==="image"?"image":"application/octet-stream");return{type:"file",data:TB(e),mediaType:n,...e.name?{filename:e.name}:{}}},EB=wp,xp=e=>{if(typeof e=="string")return e;let t=e;return t?.modelId?`${t.modelId}${t.provider?` (${t.provider})`:""}`:"this model"},MB=/image|vision|multimodal|multi-modal|media type|mediatype|pdf|document|unsupported (file|content|part|mime)|does not support (file|content)|invalid content type|image_url|inline_?data|file_?data/i,$p=e=>MB.test(e instanceof Error?`${e.name} ${e.message}`:String(e)),CB=$p;var Za=(e,t)=>e.images?.length?{messages:[{role:"user",content:[{type:"text",text:t},...e.images.map(wp)]}]}:{prompt:t},$i=(e,t,n)=>{if(!e.images?.length||t instanceof xn||!$p(t))return;let o=new Set(e.images.map(xi)),r=o.size===1?[...o][0]:"file",i=t instanceof Error?t.message.slice(0,160):void 0;return bp(xp(n),r,i&&`the provider said: ${i}`)},PB=(e,t)=>gw(t,e.raw.systemPrompt);var No=(e,t,n)=>{let o=PB(e,n),r=Rw(jw(t,e.raw.thinking,e.raw.stageThinking)),i=e.caching??{enabled:!1},a=Nw(gx(i,e.config.clientName,t),r.providerOptions);return{system:fx(o,i),...r.reasoning?{reasoning:r.reasoning}:{},...a?{providerOptions:a}:{}}};var tA=e=>e.includes(Bl)?{summary:e.split(Bl).join("").trim(),blocked:!0}:{summary:e.trim(),blocked:!1},OB=(e,t)=>{let n=e.strategy??e.config.toolSelectionStrategy,o=[...e.builtinTools??[]].filter(a=>e.tools[a]),r=t.suggestedTools??[],i=r.filter(a=>e.tools[a]);if(n==="search"){let a=(e.discovered?.()??[]).slice(-16);return[...new Set([...o,...i,...a])]}if(n==="plan-narrowed")return i.length===0&&r.length>0?Object.keys(e.tools):[...new Set([...i,...o])]},AB=(e,t)=>e.length>0?e:t>0?`Executed ${t} tool call(s).`:"Step produced no output.",eA=(e,t)=>Vl(Object.fromEntries(t.filter(n=>e.tools[n]).map(n=>[n,e.tools[n]])),e.toolHint),Uw=async(e,t,n,o,r,i)=>{let a=await e.state();e.setCurrentStep?.(n);let s=OB(e,n),c=(e.strategy??e.config.toolSelectionStrategy)==="search",l=eA(e,s??Object.keys(e.tools)),u=e.activeSkills?.()??[],d=e.prompts.executor({goal:t,state:a,step:n.description,index:o,total:r,toolCatalog:l,done:i,mode:e.executorMode,skills:e.skills?.length?Ll(e.skills):void 0,activeSkills:u.length?yi(u):void 0,searchMode:c&&!!e.tools[bi]}),m=await Aw(e.executorModel,{mode:e.executorMode,...No(e,"executor",d.system),...Za(e,d.prompt),tools:e.tools,activeTools:c?()=>[...new Set([...s??[],...e.discovered?.()??[]])]:s,describeTools:y=>eA(e,y),maxSteps:e.config.maxStepsPerTask,shouldStop:e.overBudget,maxOutputTokens:e.config.budgets.executor,temperature:e.config.temperature,abortSignal:e.signal,timeoutMs:e.config.chatTimeoutMs,caching:e.caching,...e.config.compaction.clearToolResultsAfterTokens>0?{clearToolResults:{triggerTokens:e.config.compaction.clearToolResultsAfterTokens,keep:e.config.compaction.keepToolResults}}:{},callbacks:{onToolResultsCleared:y=>{e.log.info(`cleared ${y.cleared} stale tool result(s) from the step's context`),e.emit({type:"context.compacted",scope:"tool-results",beforeTokens:y.beforeTokens,afterTokens:y.afterTokens})},onTextDelta:y=>e.emit({type:"step.text-delta",step:n,delta:y}),onReasoningDelta:y=>e.emit({type:"step.reasoning-delta",step:n,delta:y}),onToolCall:(y,b)=>{e.log.info(`tool call: ${y}`,b),e.emit({type:"step.tool-call",step:n,name:y,input:b})},onToolResult:(y,b,w)=>{e.log.debug(`tool result: ${y} ${w?"ok":"FAILED"}`,b),e.emit({type:"step.tool-result",step:n,name:y,output:b,ok:w})}}}).catch(y=>{throw $i(e,y,e.executorModel)??y});e.log.debug("executor text:",m.text);let{summary:f,blocked:h}=tA(m.text);return{result:{step:n,summary:AB(f,m.toolCalls.length),toolCalls:m.toolCalls,blocked:h},usage:m.usage,stoppedByBudget:m.stoppedByBudget}},zw=e=>{if(e.blocked)return!0;let{toolCalls:t}=e;return t.some((n,o)=>!n.ok&&!t.slice(o+1).some(r=>r.ok&&r.name===n.name))},Lw=async(e,t,n={})=>{if(e==="always")return!0;if(typeof e!="function")return zw(t);let o=()=>zw(t),r=(async()=>{try{return!!await e(t)}catch(a){return n.onError?.(a),o()}})(),i=hi(n.signal,n.timeoutMs);return i?Promise.race([r,new Promise(a=>{i.aborted?a(o()):i.addEventListener("abort",()=>a(o()),{once:!0})})]):r};Td();Td();var rA=Dt.object({description:Dt.string(),expectedOutcome:Dt.string().optional(),suggestedTools:Dt.array(Dt.string()).optional()}),Fw=Dt.object({thought:Dt.string(),steps:Dt.array(rA),skills:Dt.array(Dt.string()).optional()}),Vw=Dt.object({decision:Dt.enum(["continue","revise","finish"]),reason:Dt.string(),plan:Dt.array(Dt.string()).optional()});var nA=(e,t)=>e.filter(n=>n.description&&n.description.trim()).slice(0,Math.max(1,t)).map((n,o)=>({id:`s${o+1}`,description:n.description.trim(),expectedOutcome:n.expectedOutcome,suggestedTools:n.suggestedTools})),Sp=async(e,t,n)=>{let o=await e.state(),r=n?`${t}
225
225
 
226
226
  ${n}`:t,i=e.skills?.length?Ll(e.skills):void 0,a=e.config.maxPlanSteps,s=d=>{let m=e.prompts.planner({goal:r,state:o,toolCatalog:e.toolCatalog,mode:d,history:e.history,skills:i,searchMode:e.strategy==="search"});return{...No(e,"planner",m.system),...Za(e,m.prompt),maxOutputTokens:e.config.budgets.planner,temperature:e.config.temperature,abortSignal:e.signal,timeoutMs:e.config.chatTimeoutMs}},c=d=>{let m=new Set((e.skills??[]).map(y=>y.name)),f=[...new Set(d??[])],h=f.filter(y=>m.has(y));return h.length<f.length&&e.log.warn("planner picked unknown skills, dropped:",f.filter(y=>!m.has(y))),h};if(e.plannerMode==="native")try{let d=await jl(e.plannerModel,Fw,s("native"));return e.log.debug("planner (native):",d.object),{plan:{thought:d.object.thought,steps:nA(d.object.steps,a)},usage:rr(d.usage),skills:c(d.object.skills)}}catch(d){if(e.signal?.aborted)throw d;let m=$i(e,d,e.plannerModel);if(m)throw m;e.log.warn("planner: native structured output failed, salvaging:",oA(d)),e.emit({type:"retry",phase:"plan",attempt:1,error:oA(d)})}let l=await Ao(e.plannerModel,s("prompted")).catch(d=>{throw $i(e,d,e.plannerModel)??d}),u=kw(l.text);return e.log.debug("planner (prompted) raw:",l.text),e.log.debug("planner (prompted) parsed:",u),{plan:{thought:u.reply,steps:nA(u.plan.map(d=>({description:d})),a)},usage:rr(l.usage),skills:c(u.skills)}},oA=e=>e instanceof Error?e.message:String(e);var Zw=async(e,t,n,o)=>{let r=await e.state(),i=e.activeSkills?.()??[],a=s=>{let c=e.prompts.replanner({goal:t,state:r,done:n,remaining:o,mode:s,activeSkills:i.length?yi(i):void 0});return{...No(e,"replanner",c.system),prompt:c.prompt,maxOutputTokens:e.config.budgets.replanner,temperature:e.config.temperature,abortSignal:e.signal,timeoutMs:e.config.chatTimeoutMs}};if(e.plannerMode==="native")try{let s=await jl(e.plannerModel,Vw,a("native"));return{decision:s.object.decision,reason:s.object.reason,plan:s.object.plan??[],usage:rr(s.usage)}}catch{}try{let s=await Ao(e.plannerModel,a("prompted")),c=Ew(s.text);return{decision:c.decision,reason:c.reason,plan:c.plan,usage:rr(s.usage)}}catch{return{decision:"continue",reason:"replanner unavailable",plan:[],usage:Wn()}}};var Bw=async(e,t,n,o=[])=>{let r=await e.state(),i=e.activeSkills?.()??[],a=e.prompts.synthesizer({goal:t,state:r,done:n,findings:o,activeSkills:i.length?yi(i):void 0}),s=sw(e.synthesizerModel,{...No(e,"synthesizer",a.system),...Za(e,a.prompt),maxOutputTokens:e.config.budgets.synthesizer,temperature:e.config.temperature,abortSignal:e.signal,timeoutMs:e.config.chatTimeoutMs}),c="",l="unknown";for await(let d of s.fullStream){if(d.type==="reasoning-delta"){d.text&&e.emit({type:"final.reasoning-delta",delta:d.text});continue}if(d.type==="error"){let f=d.error instanceof Error?d.error:new Error(String(d.error));throw $i(e,f,e.synthesizerModel)??f}if(d.type!=="text-delta")continue;let m=d.text;if(c+=m,l==="unknown"){let f=c.trimStart();if(!f||f.startsWith("<think>")&&!c.includes("</think>"))continue;if(l=Va(f)?"suppress":"emit",l==="emit"){let h=c.includes("</think>")?c.slice(c.lastIndexOf("</think>")+8).trimStart():c;h&&e.emit({type:"final.text-delta",delta:h})}}else l==="emit"&&e.emit({type:"final.text-delta",delta:m})}return{text:Mw(c)||"Done \u2014 the changes have been applied.",usage:rr(await s.usage)}};var iA={silent:0,error:1,warn:2,info:3,debug:4},RB="[agent-web]",jB=()=>{},qw=(e="warn",t=console)=>{let n=(o,r)=>iA[e]>=iA[o]?(...i)=>r.call(t,RB,...i):jB;return{level:e,error:n("error",t.error),warn:n("warn",t.warn),info:n("info",t.info),debug:n("debug",t.debug)}};var lA=new Set(["openai","anthropic","google","openai-compatible","xai","deepseek","gateway"]),NB=e=>lA.has(e),DB=e=>lA.has(e),zB=e=>e==="google"||e==="gateway"||e==="openai-compatible"||e==="anthropic",UB=/web-?llm|mlc|browser-ai|transformers|built-?in/i,aA=/gpt-3\.5|o1-mini|o3-mini|deepseek|text-(davinci|embedding)|embedding|babbage|davinci|codestral/i,sA=/^(google|anthropic|openai|azure|xai|vertex|bedrock|gemini)/i,LB=/^(google|anthropic|openai|azure|vertex|bedrock|gemini)/i,Ip=e=>{if(typeof e=="string"){let[o="",r=e]=e.includes("/")?e.split("/",2):["",e];return aA.test(r)||/deepseek/i.test(o)?!1:sA.test(o)?!0:void 0}if(!e||typeof e!="object")return;let t=String(e.provider??""),n=String(e.modelId??"");return UB.test(t)||/deepseek/i.test(t)||aA.test(n)?!1:sA.test(t)?!0:void 0},Ww=e=>{if(Ip(e)===!1)return!1;let n=typeof e=="string"?e.split("/")[0]??"":String(e?.provider??"");return LB.test(n)?!0:void 0};var _p=e=>e instanceof Error?e.message:String(e),FB=(e,t,n)=>{let o=Object.entries(e);return t&&t.length>0&&(o=o.filter(([r])=>t.includes(r))),n&&n.length>0&&(o=o.filter(([r])=>!n.includes(r))),Object.fromEntries(o)},VB=e=>{if(typeof e=="string")return e;try{return JSON.stringify(e)??String(e)}catch{return String(e)}},cA=600,ZB=6e3,ql=async e=>{let t=uw(e),n=(P,O)=>Ua(za(e.model,P,O),e.credentials,t.clientName),o=n(void 0,"executor"),[r,i,a]=await Promise.all([o,e.planner===void 0?o:n(e.planner,"planner"),e.synthesizer===void 0?o:n(e.synthesizer,"synthesizer")]),s=fp(i,t.toolMode),c=fp(r,t.toolMode),l=FB(e.tools??{},e.availableTools,e.excludedTools),u=(e.skills??[]).map(dp),d=new Set;for(let P of u){if(d.has(P.name))throw new Error(`duplicate skill name "${P.name}"`);d.add(P.name)}let m=xw(l),f=t.toolSelectionStrategy==="auto"?m.length>t.toolSearchThreshold?"search":"all":t.toolSelectionStrategy,h=[...u.length?hw:[],...f==="search"?[bi]:[]];for(let P of h)if(Object.hasOwn(l,P))throw new Error(`tool name "${P}" is reserved by the agent's built-in tools; rename your tool`);let y=new Set(h),b=new Map;await Promise.all(Object.entries(l).map(async([P,O])=>{let N=await _w(O);N&&b.set(P,N)}));let w=P=>b.get(P),v=f==="search"?$w(m):Vl(l,w),x={...fw,...e.prompts},I=Fp(e.promptCaching),$=c==="prompted",S={image:e.inputs?.images??e.vision??($?!1:Ip(r)),pdf:e.inputs?.pdf??($?!1:Ww(r)),file:e.inputs?.files??($?!1:void 0)},M=jO(e.toolApproval),_=qw(t.logLevel,e.logger);return _.info(`agent ready \u2014 ${m.length} tool(s) (${f}), skills: [${[...d].join(", ")||"none"}], planner mode: ${s}, executor mode: ${c}, approval: ${M.mode}`),{run:async(P,O={})=>{let N=F=>{try{O.onEvent?.(F)}catch{}},z=P.trim(),Y=O.sessionId??t.sessionId,Z=Wn(),J={goal:z,final:"",plan:{thought:"",steps:[]},trace:[],steps:0,applied:0,stopped:!1,usage:Z,skills:[]};if(!z)return J;let ie=async()=>e.describeState?e.describeState():void 0,ae=()=>O.signal?.aborted===!0,ce=(F,ue)=>{Z=wi(Z,F),J.usage=Z,N({type:"usage",phase:ue,usage:F})},xe=async F=>{if(e.memory)try{await e.memory.append(Y,F)}catch{}},W=new Set,$e=(F,ue)=>{W.has(F)||!d.has(F)||(W.add(F),J.skills=[...W],N({type:"skill.activated",name:F,by:ue}))},Ye=[],he,Ee=FO(t.maxToolCalls),Me={};u.length&&Object.assign(Me,yw(u,F=>$e(F.name,"tool"))),f==="search"&&(Me[bi]=Sw(()=>m,(F,ue)=>{for(let tt of ue){let fe=Ye.indexOf(tt);fe>=0&&Ye.splice(fe,1),Ye.push(tt)}N({type:"tools.discovered",step:he,query:F,names:ue})},w));let Se=LO({...l,...Me},{approval:M,builtins:y,emit:N,step:()=>he,signal:O.signal,addUsage:F=>ce(F,"subagent"),countCall:Ee.count,maxToolOutputChars:t.compaction.maxToolOutputChars}),Je,Ge=F=>{let ue=dw(F?wi(Z,F):Z,t.limits);if(ue)return ue;if(Ee.exhausted)return{kind:"tool-calls",tokens:Ee.calls,cap:t.maxToolCalls}};N({type:"run.start",goal:z});let Fe=[...O.images??[],...O.files??[]],mt=Fe.map(xi).find(F=>S[F]===!1);if(mt){let F=bp(xp(r),mt,$?"it runs in the text-only prompted tool mode":void 0);return _.warn(F.message),N({type:"error",phase:"run",error:F.message}),J.final=F.message,J}let Ve=[];if(e.memory)try{Ve=await e.memory.load(Y)}catch{}if(e.memory&&e.compaction&&t.compaction.auto&&Ve.length>0){let F=qn(Ve);if(F>t.compaction.thresholdTokens){let ue=await ja(Ve,a,{thresholdTokens:t.compaction.thresholdTokens,keepRecent:t.compaction.keepRecentTurns,summaryMaxTokens:t.budgets.compaction,timeoutMs:t.chatTimeoutMs,abortSignal:O.signal,onUsage:tt=>ce(tt,"compact")});ue!==Ve&&(Ve=ue,await e.memory.replace(Y,ue).catch(()=>{}),N({type:"context.compacted",scope:"history",beforeTokens:F,afterTokens:qn(ue)}))}}let Te={config:t,raw:e,plannerModel:i,executorModel:r,synthesizerModel:a,plannerMode:s,executorMode:c,tools:Se,toolCatalog:v,prompts:x,emit:N,log:_,signal:O.signal,state:ie,history:Ve,strategy:f,caching:I,skills:u,activeSkills:()=>u.filter(F=>W.has(F.name)),discovered:()=>Ye,builtinTools:y,toolHint:w,usageSoFar:()=>Z,overBudget:F=>Ge(F)!==void 0,setCurrentStep:F=>{he=F},images:Fe.length?Fe:void 0};await xe({role:"user",content:Fe.length?`${z}
227
227
  [attached: ${Fe.map((F,ue)=>F.name??`${xi(F)} ${ue+1}`).join(", ")}]`:z}),_.info("run:",z,Fe.length?`(+${Fe.length} image(s))`:"");let et=()=>(N({type:"stopped"}),J.stopped=!0,J);try{let F=await Sp(Te,z);if(ce(F.usage,"plan"),ae())return et();if(F.plan.steps.length===0&&z.split(/\s+/).length>2){_.warn("planner returned no steps for a multi-word goal \u2014 retrying with a nudge. thought:",F.plan.thought);let X=await Sp(Te,z,"NOTE: If the message above asks to build, add, change, clear, delete, find, check or look up ANYTHING the tools can do, you MUST output 1-6 concrete steps. Output an empty plan ONLY for a pure greeting or small talk.");ce(X.usage,"plan"),X.plan.steps.length>0&&(F=X)}if(J.plan=F.plan,ae())return et();if(F.plan.steps.length===0){_.info("no plan \u2014 answering directly (no tools will run)");let X=F.plan.thought.trim()||"Tell me what you'd like to do.";return N({type:"final",text:X}),await xe({role:"assistant",content:X}),J.final=X,J}_.info(`plan (${F.plan.steps.length} steps):`,F.plan.steps.map(X=>X.description)),N({type:"plan.created",plan:F.plan}),F.plan.steps.forEach((X,Ce)=>N({type:"plan.step-added",step:X,index:Ce}));for(let X of F.skills)$e(X,"plan");let ue=[],tt=[],fe=[...F.plan.steps],Zt=0,Ct=0;for(;fe.length>0&&Zt<t.maxIterations;){if(ae())return et();let X=Ge();if(X){Je=X,J.budgetExceeded=X,_.warn(`${X.kind} limit reached (${X.tokens}/${X.cap}) \u2014 writing the answer now`),N({type:"budget.exceeded",...X});break}Zt+=1;let Ce=fe.shift(),it=J.trace.length+1,St=it+fe.length;N({type:"step.start",step:Ce,index:it,total:St});let ze;try{let ge=await Uw(Te,z,Ce,it,St,ue);ce(ge.usage,"execute"),ze=ge.result}catch(ge){if(ae())return et();if(ge instanceof xn)throw ge;N({type:"error",phase:"execute",error:_p(ge)}),ze={step:Ce,summary:_p(ge),toolCalls:[],blocked:!0}}finally{he=void 0}J.trace.push(ze);let ke=ze.toolCalls.filter(ge=>ge.ok).length,nr=ze.toolCalls.length-ke;J.applied+=ke,J.steps=it,_.info(`step ${it}/${St} "${Ce.description}" \u2014 ${ze.toolCalls.length} tool call(s), ${ke} ok${nr?`, ${nr} FAILED`:""}${ze.blocked?", BLOCKED":""}`),ze.toolCalls.length===0&&_.warn(`step ${it} made no tool calls \u2014 nothing changed in this step`),ze.toolCalls.filter(ge=>!ge.ok).forEach(ge=>_.warn(`tool ${ge.name} failed:`,ge.output)),_.debug(`step ${it} detail:`,ze),N({type:"step.complete",step:Ce,result:ze});let $n=ze.toolCalls.length?` [${ke} tool call(s) ok${nr?`, ${nr} failed`:""}]`:"";ue.push(`${Ce.description} \u2014 ${Lr(ze.summary,cA)}${$n}${ze.blocked?" [blocked]":""}`);for(let ge of ze.toolCalls)!ge.ok||y.has(ge.name)||tt.push(`- ${ge.name}: ${Lr(VB(ge.output),cA)}`);for(;tt.join(`