@agentskit/core
Advanced tools
| import {b,i,a,c}from'./chunk-4PAWFNZ5.js';var x=0;function w(e){return `${e}-${Date.now()}-${x++}`}function h(){let e=new Set;return {addObserver(t){return e.add(t),()=>{e.delete(t);}},emit(t){for(let o of e)try{let a=o.on(t);a&&typeof a.catch=="function"&&a.catch(()=>{});}catch{}}}}function D(e){return {id:w("msg"),role:e.role,content:e.content,status:e.status??"complete",metadata:e.metadata,toolCallId:e.toolCallId,createdAt:new Date}}function v(e){return e!=null&&typeof e=="object"&&Symbol.asyncIterator in e}function E(e){if(e==null)return "";if(typeof e=="string"||e instanceof Error)return String(e);try{return JSON.stringify(e)??String(e)}catch{return String(e)}}async function T(e,t,o,a){let n=e.execute?.(t,o);if(v(n)){let s="";for await(let m of n)s+=String(m),a?.(s);return s}let r=await n;return E(r)}function C(e){try{let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return {}}}function k(e){let t=new Set;return {async init(o){o.init&&!t.has(o.name)&&(await o.init(),t.add(o.name));},async disposeAll(){for(let o of t)try{await e.get(o)?.dispose?.();}catch{}t.clear();}}}async function M(e,t){let o="",a$1="";try{let n=e.stream();for await(let r of n)if(r.type==="text"&&r.content)o+=r.content,t.onText?.(o);else if(r.type==="reasoning"&&r.content)a$1+=r.content,t.onReasoning?.(a$1);else if(r.type==="tool_call")await t.onToolCall?.(r);else if(r.type==="tool_result"&&r.content)t.onToolResult?.(r.content);else if(r.type==="usage"&&r.usage)t.onUsage?.(r.usage);else if(r.type==="error"){t.onError?.(new b({code:i.AK_ADAPTER_STREAM_FAILED,message:r.content??"Stream error",hint:"Key/network/model/provider"}));return}else if(r.type==="done")break;t.onDone(o);}catch(n){let r=n instanceof a?n:new b({code:i.AK_ADAPTER_STREAM_FAILED,message:`Stream failed: ${n instanceof Error?n.message:String(n)}`,hint:"Adapter/provider",cause:n});t.onError?.(r);}}function I(...e){let t=new Map;for(let o of e)if(o)for(let a of o)t.set(a.name,a);return t}async function $(e,t){if(e.length===0)return {systemPrompt:t,skillTools:[]};let o=e.map(s=>`--- ${s.name} --- | ||
| ${s.systemPrompt}`),n=`${t?`${t} | ||
| `:""}${o.join(` | ||
| `)}`,r=[];for(let s of e)if(s.onActivate){let m=await s.onActivate();r.push(...m.tools??[]);}return {systemPrompt:n,skillTools:r}}async function S(e,t,o){e&&await import('./tool-authorization-internal.js').then(a=>a.authorize(e,t,o));}async function z(e){let{tool:t,toolCall:o,context:a,emitter:n,lifecycle:r,onPartial:s,onConfirm:m,validate:g,authorize:y}=e,c$1=Date.now();if(!t?.execute){let i$1=new c({code:i.AK_TOOL_NOT_FOUND,message:`Tool "${o.name}" not found or has no execute function`,hint:"Register an executable tool in ChatConfig, e.g. { tools: [myTool] }."});return n.emit({type:"error",error:i$1}),{status:"error",error:i$1.toString(),durationMs:Date.now()-c$1}}if(g&&t.schema){let i$1=g(t.schema,o.args);if(!i$1.valid){let l=new c({code:i.AK_TOOL_INVALID_INPUT,message:i$1.message??`Tool "${o.name}" received invalid arguments`});return n.emit({type:"error",error:l}),{status:"error",error:l.toString(),durationMs:Date.now()-c$1}}}if(t.requiresConfirmation){if(!m)return {status:"skipped",result:"No confirmation handler",durationMs:Date.now()-c$1};if(!await m(o))return {status:"skipped",result:"Tool execution declined by confirmation handler",durationMs:Date.now()-c$1}}try{await S(y,o,{...a,tool:t,phase:"execute"});}catch(i){let l=i;return n.emit({type:"error",error:l}),{status:"error",error:l.toString(),durationMs:Date.now()-c$1}}await r.init(t),n.emit({type:"tool:start",name:o.name,args:o.args});try{let i=await T(t,o.args,a,s);return n.emit({type:"tool:end",name:o.name,result:i,durationMs:Date.now()-c$1}),{status:"complete",result:i,durationMs:Date.now()-c$1}}catch(i$1){let l=i$1 instanceof c?i$1:new c({code:i.AK_TOOL_EXEC_FAILED,message:`Tool "${o.name}" threw during execution: ${i$1 instanceof Error?i$1.message:String(i$1)}`,hint:"Check the tool execute() implementation.",cause:i$1});return n.emit({type:"error",error:l}),n.emit({type:"tool:end",name:o.name,result:`Error: ${l.message}`,durationMs:Date.now()-c$1}),{status:"error",error:l.toString(),durationMs:Date.now()-c$1}}}export{w as a,h as b,D as c,T as d,C as e,k as f,M as g,I as h,$ as i,S as j,z as k};//# sourceMappingURL=chunk-VWKK6GKY.js.map | ||
| //# sourceMappingURL=chunk-VWKK6GKY.js.map |
| {"version":3,"sources":["../src/primitives.ts","../src/agent-loop.ts"],"names":["nextId","generateId","prefix","createEventEmitter","observers","observer","event","result","buildMessage","params","isAsyncIterable","value","serializeToolResult","executeToolCall","tool","args","context","onPartialResult","raw","accumulated","chunk","safeParseArgs","parsed","createToolLifecycle","tools","initialized","name","consumeStream","source","handlers","accumulatedText","accumulatedReasoning","iterator","AdapterError","ErrorCodes","error","err","AgentsKitError","buildToolMap","sources","map","activateSkills","skills","prompt","prompts","system","skill","a","auth","fn","call","m","executeSafeTool","options","toolCall","emitter","lifecycle","onPartial","onConfirm","validate","authorize","began","ToolError","v"],"mappings":"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","file":"chunk-VWKK6GKY.js","sourcesContent":["import { AdapterError, AgentsKitError, ErrorCodes } from './errors'\nimport type {\n AgentEvent,\n Message,\n MessageRole,\n MessageStatus,\n Observer,\n StreamChunk,\n StreamSource,\n ToolDefinition,\n ToolExecutionContext,\n} from './types'\nimport type { TokenUsage } from './types/stream'\n\nlet nextId = 0\n\nexport function generateId(prefix: string): string {\n return `${prefix}-${Date.now()}-${nextId++}`\n}\n\nexport function createEventEmitter() {\n const observers = new Set<Observer>()\n\n return {\n addObserver(observer: Observer): () => void {\n observers.add(observer)\n return () => { observers.delete(observer) }\n },\n emit(event: AgentEvent): void {\n for (const observer of observers) {\n try {\n const result = observer.on(event)\n if (result && typeof (result as Promise<void>).catch === 'function') {\n (result as Promise<void>).catch(() => {})\n }\n } catch {\n // Observer errors must never break the main loop.\n }\n }\n },\n }\n}\n\nexport function buildMessage(params: {\n role: MessageRole\n content: string\n status?: MessageStatus\n metadata?: Record<string, unknown>\n toolCallId?: string\n}): Message {\n return {\n id: generateId('msg'),\n role: params.role,\n content: params.content,\n status: params.status ?? 'complete',\n metadata: params.metadata,\n toolCallId: params.toolCallId,\n createdAt: new Date(),\n }\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof value === 'object' && Symbol.asyncIterator in value\n}\n\nfunction serializeToolResult(result: unknown): string {\n if (result == null) return ''\n if (typeof result === 'string' || result instanceof Error) return String(result)\n\n try {\n return JSON.stringify(result) ?? String(result)\n } catch {\n return String(result)\n }\n}\n\nexport async function executeToolCall(\n tool: ToolDefinition,\n args: Record<string, unknown>,\n context: ToolExecutionContext,\n onPartialResult?: (accumulated: string) => void,\n): Promise<string> {\n const raw = tool.execute?.(args, context)\n\n if (isAsyncIterable(raw)) {\n let accumulated = ''\n for await (const chunk of raw) {\n accumulated += String(chunk)\n onPartialResult?.(accumulated)\n }\n return accumulated\n }\n\n const result = await raw\n return serializeToolResult(result)\n}\n\nexport function safeParseArgs(args: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(args)\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {}\n } catch {\n return {}\n }\n}\n\nexport function createToolLifecycle(tools: Map<string, ToolDefinition>) {\n const initialized = new Set<string>()\n\n return {\n async init(tool: ToolDefinition): Promise<void> {\n if (tool.init && !initialized.has(tool.name)) {\n await tool.init()\n initialized.add(tool.name)\n }\n },\n async disposeAll(): Promise<void> {\n for (const name of initialized) {\n try {\n await tools.get(name)?.dispose?.()\n } catch {\n // Dispose errors should not propagate.\n }\n }\n initialized.clear()\n },\n }\n}\n\nexport interface ConsumeStreamHandlers {\n onText?: (accumulated: string) => void\n onReasoning?: (accumulated: string) => void\n onToolCall?: (chunk: StreamChunk) => Promise<void> | void\n onToolResult?: (content: string) => void\n onUsage?: (usage: TokenUsage) => void\n onError?: (error: Error) => void\n onDone: (accumulatedText: string) => void\n}\n\nexport async function consumeStream(\n source: StreamSource,\n handlers: ConsumeStreamHandlers,\n): Promise<void> {\n let accumulatedText = ''\n let accumulatedReasoning = ''\n\n try {\n const iterator = source.stream()\n for await (const chunk of iterator) {\n if (chunk.type === 'text' && chunk.content) {\n accumulatedText += chunk.content\n handlers.onText?.(accumulatedText)\n } else if (chunk.type === 'reasoning' && chunk.content) {\n accumulatedReasoning += chunk.content\n handlers.onReasoning?.(accumulatedReasoning)\n } else if (chunk.type === 'tool_call') {\n await handlers.onToolCall?.(chunk)\n } else if (chunk.type === 'tool_result' && chunk.content) {\n handlers.onToolResult?.(chunk.content)\n } else if (chunk.type === 'usage' && chunk.usage) {\n handlers.onUsage?.(chunk.usage)\n } else if (chunk.type === 'error') {\n handlers.onError?.(new AdapterError({\n code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message: chunk.content ?? 'Stream error',\n hint: 'Key/network/model/provider',\n }))\n return\n } else if (chunk.type === 'done') {\n break\n }\n }\n handlers.onDone(accumulatedText)\n } catch (error) {\n const err = error instanceof AgentsKitError\n ? error\n : new AdapterError({\n code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message: `Stream failed: ${error instanceof Error ? error.message : String(error)}`,\n hint: 'Adapter/provider',\n cause: error,\n })\n handlers.onError?.(err)\n }\n}\n","import { ToolError, ErrorCodes } from './errors'\nimport { executeToolCall, createToolLifecycle, createEventEmitter } from './primitives'\nimport type {\n ArgsValidator,\n MaybePromise,\n SkillDefinition,\n ToolCall,\n ToolAuthorizationContext,\n ToolAuthorizer,\n ToolDefinition,\n ToolExecutionContext,\n} from './types'\n\n// --- buildToolMap ---\n\nexport function buildToolMap(\n ...sources: Array<ToolDefinition[] | undefined>\n): Map<string, ToolDefinition> {\n const map = new Map<string, ToolDefinition>()\n for (const source of sources) {\n if (!source) continue\n for (const tool of source) map.set(tool.name, tool)\n }\n return map\n}\n\n// --- activateSkills ---\n\nexport interface ActivateSkillsResult {\n systemPrompt: string | undefined\n skillTools: ToolDefinition[]\n}\n\nexport async function activateSkills(\n skills: SkillDefinition[],\n prompt?: string,\n): Promise<ActivateSkillsResult> {\n if (skills.length === 0) {\n return { systemPrompt: prompt, skillTools: [] }\n }\n\n const prompts = skills.map(s => `--- ${s.name} ---\\n${s.systemPrompt}`)\n const base = prompt ? `${prompt}\\n\\n` : ''\n const system = `${base}${prompts.join('\\n\\n')}`\n\n const tools: ToolDefinition[] = []\n for (const skill of skills) {\n if (skill.onActivate) {\n const a = await skill.onActivate()\n tools.push(...(a.tools ?? []))\n }\n }\n\n return { systemPrompt: system, skillTools: tools }\n}\n\n// --- executeSafeTool ---\n\nexport interface ToolExecResult {\n status: 'complete' | 'error' | 'skipped'\n result?: string\n error?: string\n durationMs: number\n}\n\nexport interface ExecuteSafeToolOptions {\n tool: ToolDefinition | undefined\n toolCall: ToolCall\n context: ToolExecutionContext\n emitter: ReturnType<typeof createEventEmitter>\n lifecycle: ReturnType<typeof createToolLifecycle>\n onPartial?: (result: string) => void\n onConfirm?: (toolCall: ToolCall) => MaybePromise<boolean>\n /** Opt-in arg validation against `tool.schema` (ADR-0008). */\n validate?: ArgsValidator\n authorize?: ToolAuthorizer\n}\n\nexport async function auth(fn: ToolAuthorizer | undefined, call: ToolCall, context: ToolAuthorizationContext): Promise<void> {\n if (!fn) return\n await import('./tool-authorization-internal.js').then(m => m.authorize(fn, call, context))\n}\n\n\nexport async function executeSafeTool(\n options: ExecuteSafeToolOptions,\n): Promise<ToolExecResult> {\n const { tool, toolCall, context, emitter, lifecycle, onPartial, onConfirm, validate, authorize } = options\n const began = Date.now()\n\n // Missing tool\n if (!tool?.execute) {\n const err = new ToolError({\n code: ErrorCodes.AK_TOOL_NOT_FOUND,\n message: `Tool \"${toolCall.name}\" not found or has no execute function`,\n hint: 'Register an executable tool in ChatConfig, e.g. { tools: [myTool] }.',\n })\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n\n if (validate && tool.schema) {\n const v = validate(tool.schema, toolCall.args)\n if (!v.valid) {\n const err = new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: v.message ?? `Tool \"${toolCall.name}\" received invalid arguments`,\n })\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n }\n\n // Requires confirmation — refuse by default when no approver is configured (RT6)\n if (tool.requiresConfirmation) {\n if (!onConfirm) {\n return {\n status: 'skipped',\n result: 'No confirmation handler',\n durationMs: Date.now() - began,\n }\n }\n const confirmed = await onConfirm(toolCall)\n if (!confirmed) {\n return { status: 'skipped', result: 'Tool execution declined by confirmation handler', durationMs: Date.now() - began }\n }\n }\n\n try {\n await auth(authorize, toolCall, { ...context, tool, phase: 'execute' })\n } catch (error) {\n const err = error as ToolError\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n\n await lifecycle.init(tool)\n\n emitter.emit({ type: 'tool:start', name: toolCall.name, args: toolCall.args })\n\n try {\n const result = await executeToolCall(\n tool,\n toolCall.args,\n context,\n onPartial,\n )\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result,\n durationMs: Date.now() - began,\n })\n return { status: 'complete', result, durationMs: Date.now() - began }\n } catch (error) {\n const err = error instanceof ToolError\n ? error\n : new ToolError({\n code: ErrorCodes.AK_TOOL_EXEC_FAILED,\n message: `Tool \"${toolCall.name}\" threw during execution: ${error instanceof Error ? error.message : String(error)}`,\n hint: 'Check the tool execute() implementation.',\n cause: error,\n })\n // Emit error before tool:end so trackers can mark the active tool span.\n emitter.emit({ type: 'error', error: err })\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result: `Error: ${err.message}`,\n durationMs: Date.now() - began,\n })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n}\n"]} |
+8
-8
@@ -1,15 +0,15 @@ | ||
| 'use strict';var O="https://www.agentskit.io/docs";function Me(t,e,o,l){let s=[`error[${t}]: ${e}`];return o&&s.push(` --> Hint: ${o}`),l&&s.push(` --> Docs: ${l}`),s.join(` | ||
| `)}var _=class extends Error{constructor(e){super(e.message),this.name="AgentsKitError",this.code=e.code,this.hint=e.hint,this.docsUrl=e.docsUrl,this.cause=e.cause;}toString(){return Me(this.code,this.message,this.hint,this.docsUrl)}},N=class extends _{constructor(e){super({docsUrl:`${O}/adapters`,...e}),this.name="AdapterError";}},R=class extends _{constructor(e){super({docsUrl:`${O}/tools`,...e}),this.name="ToolError";}},q=class extends _{constructor(e){super({docsUrl:`${O}/memory`,...e}),this.name="MemoryError";}},j=class extends _{constructor(e){super({docsUrl:`${O}/configuration`,...e}),this.name="ConfigError";}},X=class extends _{constructor(e){super({docsUrl:`${O}/agents/runtime`,...e}),this.name="RuntimeError";}},G=class extends _{constructor(e){super({docsUrl:`${O}/production/security/mandatory-sandbox`,...e}),this.name="SandboxError";}},H=class extends _{constructor(e){super({docsUrl:`${O}/agents/skills`,...e}),this.name="SkillError";}},b={AK_ADAPTER_MISSING:"AK_ADAPTER_MISSING",AK_ADAPTER_STREAM_FAILED:"AK_ADAPTER_STREAM_FAILED",AK_TOOL_NOT_FOUND:"AK_TOOL_NOT_FOUND",AK_TOOL_EXEC_FAILED:"AK_TOOL_EXEC_FAILED",AK_TOOL_PEER_MISSING:"AK_TOOL_PEER_MISSING",AK_TOOL_INVALID_INPUT:"AK_TOOL_INVALID_INPUT",AK_TOOL_QUOTA_EXCEEDED:"AK_TOOL_QUOTA_EXCEEDED",AK_TOOL_FORBIDDEN:"AK_TOOL_FORBIDDEN",AK_MEMORY_LOAD_FAILED:"AK_MEMORY_LOAD_FAILED",AK_MEMORY_SAVE_FAILED:"AK_MEMORY_SAVE_FAILED",AK_MEMORY_DESERIALIZE_FAILED:"AK_MEMORY_DESERIALIZE_FAILED",AK_MEMORY_PEER_MISSING:"AK_MEMORY_PEER_MISSING",AK_MEMORY_REMOTE_HTTP:"AK_MEMORY_REMOTE_HTTP",AK_CONFIG_INVALID:"AK_CONFIG_INVALID",AK_RUNTIME_INVALID_INPUT:"AK_RUNTIME_INVALID_INPUT",AK_RUNTIME_STEP_FAILED:"AK_RUNTIME_STEP_FAILED",AK_RUNTIME_DELEGATE_FAILED:"AK_RUNTIME_DELEGATE_FAILED",AK_SANDBOX_DENIED:"AK_SANDBOX_DENIED",AK_SANDBOX_INVALID_TOOL:"AK_SANDBOX_INVALID_TOOL",AK_SANDBOX_PEER_MISSING:"AK_SANDBOX_PEER_MISSING",AK_SANDBOX_BACKEND_FAILED:"AK_SANDBOX_BACKEND_FAILED",AK_SKILL_INVALID:"AK_SKILL_INVALID",AK_SKILL_DUPLICATE:"AK_SKILL_DUPLICATE"};var Pe=0;function ce(t){return `${t}-${Date.now()}-${Pe++}`}function Y(){let t=new Set;return {addObserver(e){return t.add(e),()=>{t.delete(e);}},emit(e){for(let o of t)try{let l=o.on(e);l&&typeof l.catch=="function"&&l.catch(()=>{});}catch{}}}}function I(t){return {id:ce("msg"),role:t.role,content:t.content,status:t.status??"complete",metadata:t.metadata,toolCallId:t.toolCallId,createdAt:new Date}}function we(t){return t!=null&&typeof t=="object"&&Symbol.asyncIterator in t}async function Q(t,e,o,l){let s=t.execute?.(e,o);if(we(s)){let m="";for await(let p of s)m+=String(p),l?.(m);return m}let r=await s;return r==null?"":String(r)}function Z(t){try{let e=JSON.parse(t);return e&&typeof e=="object"?e:{}}catch{return {}}}function U(t){let e=new Set;return {async init(o){o.init&&!e.has(o.name)&&(await o.init(),e.add(o.name));},async disposeAll(){for(let o of e)try{await t.get(o)?.dispose?.();}catch{}e.clear();}}}async function W(t,e){let o="",l="";try{let s=t.stream();for await(let r of s)if(r.type==="text"&&r.content)o+=r.content,e.onText?.(o);else if(r.type==="reasoning"&&r.content)l+=r.content,e.onReasoning?.(l);else if(r.type==="tool_call")await e.onToolCall?.(r);else if(r.type==="tool_result"&&r.content)e.onToolResult?.(r.content);else if(r.type==="usage"&&r.usage)e.onUsage?.(r.usage);else if(r.type==="error"){e.onError?.(new N({code:b.AK_ADAPTER_STREAM_FAILED,message:r.content??"Stream error",hint:"Key/network/model/provider"}));return}else if(r.type==="done")break;e.onDone(o);}catch(s){let r=s instanceof _?s:new N({code:b.AK_ADAPTER_STREAM_FAILED,message:`Stream failed: ${s instanceof Error?s.message:String(s)}`,hint:"Adapter/provider",cause:s});e.onError?.(r);}}function z(...t){let e=new Map;for(let o of t)if(o)for(let l of o)e.set(l.name,l);return e}async function ee(t,e){if(t.length===0)return {systemPrompt:e,skillTools:[]};let o=t.map(m=>`--- ${m.name} --- | ||
| ${m.systemPrompt}`),s=`${e?`${e} | ||
| 'use strict';var O="https://www.agentskit.io/docs";function Me(e,t,o,l){let s=[`error[${e}]: ${t}`];return o&&s.push(` --> Hint: ${o}`),l&&s.push(` --> Docs: ${l}`),s.join(` | ||
| `)}var _=class extends Error{constructor(t){super(t.message),this.name="AgentsKitError",this.code=t.code,this.hint=t.hint,this.docsUrl=t.docsUrl,this.cause=t.cause;}toString(){return Me(this.code,this.message,this.hint,this.docsUrl)}},N=class extends _{constructor(t){super({docsUrl:`${O}/adapters`,...t}),this.name="AdapterError";}},R=class extends _{constructor(t){super({docsUrl:`${O}/tools`,...t}),this.name="ToolError";}},q=class extends _{constructor(t){super({docsUrl:`${O}/memory`,...t}),this.name="MemoryError";}},j=class extends _{constructor(t){super({docsUrl:`${O}/configuration`,...t}),this.name="ConfigError";}},X=class extends _{constructor(t){super({docsUrl:`${O}/agents/runtime`,...t}),this.name="RuntimeError";}},G=class extends _{constructor(t){super({docsUrl:`${O}/production/security/mandatory-sandbox`,...t}),this.name="SandboxError";}},H=class extends _{constructor(t){super({docsUrl:`${O}/agents/skills`,...t}),this.name="SkillError";}},b={AK_ADAPTER_MISSING:"AK_ADAPTER_MISSING",AK_ADAPTER_STREAM_FAILED:"AK_ADAPTER_STREAM_FAILED",AK_TOOL_NOT_FOUND:"AK_TOOL_NOT_FOUND",AK_TOOL_EXEC_FAILED:"AK_TOOL_EXEC_FAILED",AK_TOOL_PEER_MISSING:"AK_TOOL_PEER_MISSING",AK_TOOL_INVALID_INPUT:"AK_TOOL_INVALID_INPUT",AK_TOOL_QUOTA_EXCEEDED:"AK_TOOL_QUOTA_EXCEEDED",AK_TOOL_FORBIDDEN:"AK_TOOL_FORBIDDEN",AK_MEMORY_LOAD_FAILED:"AK_MEMORY_LOAD_FAILED",AK_MEMORY_SAVE_FAILED:"AK_MEMORY_SAVE_FAILED",AK_MEMORY_DESERIALIZE_FAILED:"AK_MEMORY_DESERIALIZE_FAILED",AK_MEMORY_PEER_MISSING:"AK_MEMORY_PEER_MISSING",AK_MEMORY_REMOTE_HTTP:"AK_MEMORY_REMOTE_HTTP",AK_CONFIG_INVALID:"AK_CONFIG_INVALID",AK_RUNTIME_INVALID_INPUT:"AK_RUNTIME_INVALID_INPUT",AK_RUNTIME_STEP_FAILED:"AK_RUNTIME_STEP_FAILED",AK_RUNTIME_DELEGATE_FAILED:"AK_RUNTIME_DELEGATE_FAILED",AK_SANDBOX_DENIED:"AK_SANDBOX_DENIED",AK_SANDBOX_INVALID_TOOL:"AK_SANDBOX_INVALID_TOOL",AK_SANDBOX_PEER_MISSING:"AK_SANDBOX_PEER_MISSING",AK_SANDBOX_BACKEND_FAILED:"AK_SANDBOX_BACKEND_FAILED",AK_SKILL_INVALID:"AK_SKILL_INVALID",AK_SKILL_DUPLICATE:"AK_SKILL_DUPLICATE"};var Pe=0;function ce(e){return `${e}-${Date.now()}-${Pe++}`}function Y(){let e=new Set;return {addObserver(t){return e.add(t),()=>{e.delete(t);}},emit(t){for(let o of e)try{let l=o.on(t);l&&typeof l.catch=="function"&&l.catch(()=>{});}catch{}}}}function I(e){return {id:ce("msg"),role:e.role,content:e.content,status:e.status??"complete",metadata:e.metadata,toolCallId:e.toolCallId,createdAt:new Date}}function we(e){return e!=null&&typeof e=="object"&&Symbol.asyncIterator in e}function _e(e){if(e==null)return "";if(typeof e=="string"||e instanceof Error)return String(e);try{return JSON.stringify(e)??String(e)}catch{return String(e)}}async function Q(e,t,o,l){let s=e.execute?.(t,o);if(we(s)){let m="";for await(let p of s)m+=String(p),l?.(m);return m}let r=await s;return _e(r)}function Z(e){try{let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return {}}}function U(e){let t=new Set;return {async init(o){o.init&&!t.has(o.name)&&(await o.init(),t.add(o.name));},async disposeAll(){for(let o of t)try{await e.get(o)?.dispose?.();}catch{}t.clear();}}}async function W(e,t){let o="",l="";try{let s=e.stream();for await(let r of s)if(r.type==="text"&&r.content)o+=r.content,t.onText?.(o);else if(r.type==="reasoning"&&r.content)l+=r.content,t.onReasoning?.(l);else if(r.type==="tool_call")await t.onToolCall?.(r);else if(r.type==="tool_result"&&r.content)t.onToolResult?.(r.content);else if(r.type==="usage"&&r.usage)t.onUsage?.(r.usage);else if(r.type==="error"){t.onError?.(new N({code:b.AK_ADAPTER_STREAM_FAILED,message:r.content??"Stream error",hint:"Key/network/model/provider"}));return}else if(r.type==="done")break;t.onDone(o);}catch(s){let r=s instanceof _?s:new N({code:b.AK_ADAPTER_STREAM_FAILED,message:`Stream failed: ${s instanceof Error?s.message:String(s)}`,hint:"Adapter/provider",cause:s});t.onError?.(r);}}function z(...e){let t=new Map;for(let o of e)if(o)for(let l of o)t.set(l.name,l);return t}async function ee(e,t){if(e.length===0)return {systemPrompt:t,skillTools:[]};let o=e.map(m=>`--- ${m.name} --- | ||
| ${m.systemPrompt}`),s=`${t?`${t} | ||
| `:""}${o.join(` | ||
| `)}`,r=[];for(let m of t)if(m.onActivate){let p=await m.onActivate();r.push(...p.tools??[]);}return {systemPrompt:s,skillTools:r}}async function te(t,e,o){t&&await import('./tool-authorization-internal.js').then(l=>l.authorize(t,e,o));}async function re(t){let{tool:e,toolCall:o,context:l,emitter:s,lifecycle:r,onPartial:m,onConfirm:p,validate:C,authorize:v}=t,g=Date.now();if(!e?.execute){let d=new R({code:b.AK_TOOL_NOT_FOUND,message:`Tool "${o.name}" not found or has no execute function`,hint:"Register an executable tool in ChatConfig, e.g. { tools: [myTool] }."});return s.emit({type:"error",error:d}),{status:"error",error:d.toString(),durationMs:Date.now()-g}}if(C&&e.schema){let d=C(e.schema,o.args);if(!d.valid){let c=new R({code:b.AK_TOOL_INVALID_INPUT,message:d.message??`Tool "${o.name}" received invalid arguments`});return s.emit({type:"error",error:c}),{status:"error",error:c.toString(),durationMs:Date.now()-g}}}if(e.requiresConfirmation){if(!p)return {status:"skipped",result:"No confirmation handler",durationMs:Date.now()-g};if(!await p(o))return {status:"skipped",result:"Tool execution declined by confirmation handler",durationMs:Date.now()-g}}try{await te(v,o,{...l,tool:e,phase:"execute"});}catch(d){let c=d;return s.emit({type:"error",error:c}),{status:"error",error:c.toString(),durationMs:Date.now()-g}}await r.init(e),s.emit({type:"tool:start",name:o.name,args:o.args});try{let d=await Q(e,o.args,l,m);return s.emit({type:"tool:end",name:o.name,result:d,durationMs:Date.now()-g}),{status:"complete",result:d,durationMs:Date.now()-g}}catch(d){let c=d instanceof R?d:new R({code:b.AK_TOOL_EXEC_FAILED,message:`Tool "${o.name}" threw during execution: ${d instanceof Error?d.message:String(d)}`,hint:"Check the tool execute() implementation.",cause:d});return s.emit({type:"error",error:c}),s.emit({type:"tool:end",name:o.name,result:`Error: ${c.message}`,durationMs:Date.now()-g}),{status:"error",error:c.toString(),durationMs:Date.now()-g}}}function _e(t,e){let o=`${t.content} ${t.source??""}`.toLowerCase(),l=e.toLowerCase().split(/\s+/).filter(Boolean);return l.length===0?0:l.reduce((s,r)=>o.includes(r)?s+1:s,0)}function ke(t){let{documents:e,limit:o=4}=t;return {async retrieve(l){return [...e].map(s=>({...s,score:s.score??_e(s,l.query)})).filter(s=>(s.score??0)>0).sort((s,r)=>(r.score??0)-(s.score??0)).slice(0,o)}}}function oe(t){return t.length===0?"":t.map((e,o)=>{let l=e.source?`Source: ${e.source} | ||
| `)}`,r=[];for(let m of e)if(m.onActivate){let p=await m.onActivate();r.push(...p.tools??[]);}return {systemPrompt:s,skillTools:r}}async function te(e,t,o){e&&await import('./tool-authorization-internal.js').then(l=>l.authorize(e,t,o));}async function re(e){let{tool:t,toolCall:o,context:l,emitter:s,lifecycle:r,onPartial:m,onConfirm:p,validate:C,authorize:S}=e,g=Date.now();if(!t?.execute){let d=new R({code:b.AK_TOOL_NOT_FOUND,message:`Tool "${o.name}" not found or has no execute function`,hint:"Register an executable tool in ChatConfig, e.g. { tools: [myTool] }."});return s.emit({type:"error",error:d}),{status:"error",error:d.toString(),durationMs:Date.now()-g}}if(C&&t.schema){let d=C(t.schema,o.args);if(!d.valid){let c=new R({code:b.AK_TOOL_INVALID_INPUT,message:d.message??`Tool "${o.name}" received invalid arguments`});return s.emit({type:"error",error:c}),{status:"error",error:c.toString(),durationMs:Date.now()-g}}}if(t.requiresConfirmation){if(!p)return {status:"skipped",result:"No confirmation handler",durationMs:Date.now()-g};if(!await p(o))return {status:"skipped",result:"Tool execution declined by confirmation handler",durationMs:Date.now()-g}}try{await te(S,o,{...l,tool:t,phase:"execute"});}catch(d){let c=d;return s.emit({type:"error",error:c}),{status:"error",error:c.toString(),durationMs:Date.now()-g}}await r.init(t),s.emit({type:"tool:start",name:o.name,args:o.args});try{let d=await Q(t,o.args,l,m);return s.emit({type:"tool:end",name:o.name,result:d,durationMs:Date.now()-g}),{status:"complete",result:d,durationMs:Date.now()-g}}catch(d){let c=d instanceof R?d:new R({code:b.AK_TOOL_EXEC_FAILED,message:`Tool "${o.name}" threw during execution: ${d instanceof Error?d.message:String(d)}`,hint:"Check the tool execute() implementation.",cause:d});return s.emit({type:"error",error:c}),s.emit({type:"tool:end",name:o.name,result:`Error: ${c.message}`,durationMs:Date.now()-g}),{status:"error",error:c.toString(),durationMs:Date.now()-g}}}function ke(e,t){let o=`${e.content} ${e.source??""}`.toLowerCase(),l=t.toLowerCase().split(/\s+/).filter(Boolean);return l.length===0?0:l.reduce((s,r)=>o.includes(r)?s+1:s,0)}function Ie(e){let{documents:t,limit:o=4}=e;return {async retrieve(l){return [...t].map(s=>({...s,score:s.score??ke(s,l.query)})).filter(s=>(s.score??0)>0).sort((s,r)=>(r.score??0)-(s.score??0)).slice(0,o)}}}function oe(e){return e.length===0?"":e.map((t,o)=>{let l=t.source?`Source: ${t.source} | ||
| `:"";return `[${o+1}] | ||
| ${l}${e.content}`}).join(` | ||
| ${l}${t.content}`}).join(` | ||
| `)}function ue(t){if(!t)return;let e=Number.isFinite(t.promptTokens)&&t.promptTokens>=0?t.promptTokens:0,o=Number.isFinite(t.completionTokens)&&t.completionTokens>=0?t.completionTokens:0;return {promptTokens:e,completionTokens:o}}function me(t,e){let o=Number.isFinite(e.promptTokens)&&e.promptTokens>=0?e.promptTokens:0,l=Number.isFinite(e.completionTokens)&&e.completionTokens>=0?e.completionTokens:0,s=Number.isFinite(e.totalTokens)&&e.totalTokens>=0?e.totalTokens:0;return {promptTokens:t.promptTokens+o,completionTokens:t.completionTokens+l,totalTokens:t.totalTokens+s}}function $(t,e,o){return t.map(l=>l.id===e?o(l):l)}function ge(t,e,o,l){return $(t,e,s=>({...s,toolCalls:(s.toolCalls??[]).map(r=>r.id===o?{...r,...l}:r)}))}function de(t,e,o,l){let s=o.map(m=>l({role:"tool",content:m.result??m.error??"",toolCallId:m.id})),r=l({role:"assistant",content:"",status:"streaming"});return {messages:[...t.map(m=>m.id===e?{...m,status:"complete"}:m),...s,r],nextAssistantId:r.id}}async function fe(t,e,o,l,s){let r=Ie(e,l),m=t.retriever&&o?await t.retriever.retrieve({query:o,messages:e}):[],p=De(oe(m));return {messages:p?[p,...r]:r,context:{systemPrompt:l,temperature:t.temperature,maxTokens:t.maxTokens,tools:s,metadata:m.length>0?{retrievedDocuments:m}:void 0}}}function Ie(t,e){return !e||t.some(o=>o.role==="system"&&o.content===e)?t:[I({role:"system",content:e}),...t]}function De(t){return t?I({role:"system",content:`Use the retrieved context below when it is relevant. | ||
| `)}function ue(e){if(!e)return;let t=Number.isFinite(e.promptTokens)&&e.promptTokens>=0?e.promptTokens:0,o=Number.isFinite(e.completionTokens)&&e.completionTokens>=0?e.completionTokens:0;return {promptTokens:t,completionTokens:o}}function me(e,t){let o=Number.isFinite(t.promptTokens)&&t.promptTokens>=0?t.promptTokens:0,l=Number.isFinite(t.completionTokens)&&t.completionTokens>=0?t.completionTokens:0,s=Number.isFinite(t.totalTokens)&&t.totalTokens>=0?t.totalTokens:0;return {promptTokens:e.promptTokens+o,completionTokens:e.completionTokens+l,totalTokens:e.totalTokens+s}}function $(e,t,o){return e.map(l=>l.id===t?o(l):l)}function ge(e,t,o,l){return $(e,t,s=>({...s,toolCalls:(s.toolCalls??[]).map(r=>r.id===o?{...r,...l}:r)}))}function de(e,t,o,l){let s=o.map(m=>l({role:"tool",content:m.result??m.error??"",toolCallId:m.id})),r=l({role:"assistant",content:"",status:"streaming"});return {messages:[...e.map(m=>m.id===t?{...m,status:"complete"}:m),...s,r],nextAssistantId:r.id}}async function fe(e,t,o,l,s){let r=De(t,l),m=e.retriever&&o?await e.retriever.retrieve({query:o,messages:t}):[],p=Re(oe(m));return {messages:p?[p,...r]:r,context:{systemPrompt:l,temperature:e.temperature,maxTokens:e.maxTokens,tools:s,metadata:m.length>0?{retrievedDocuments:m}:void 0}}}function De(e,t){return !t||e.some(o=>o.role==="system"&&o.content===t)?e:[I({role:"system",content:t}),...e]}function Re(e){return e?I({role:"system",content:`Use the retrieved context below when it is relevant. | ||
| ${t}`}):null}function Re(t){let e=t,o=e.systemPrompt,l,s=0,r={messages:t.initialMessages??[],status:"idle",input:"",error:null,usage:{promptTokens:0,completionTokens:0,totalTokens:0}},m=new Set,p=Y(),C=z(e.tools),v=U(C),g=false,d=false,c=false,f,h=async(n,a)=>{let i=e.authorizeToolCall,u=i?await i(n,a):{allowed:true};return i===e.authorizeToolCall&&C.get(n.name)?.execute===a.tool?.execute?u:{allowed:false}},M=n=>{C=z(e.tools,n),v=U(C);},w=async()=>{if(d)return;d=true;let n=await ee(e.skills??[],e.systemPrompt);o=n.systemPrompt,n.skillTools.length>0&&M(n.skillTools);};w();for(let n of e.observers??[])p.addObserver(n);let P=()=>{for(let n of m)n();},A=n=>{r=typeof n=="function"?n(r):n,ve(r.messages),P();},ve=async n=>{if(f=[n,e.memory],!c){for(c=true;f;){let[a,i]=f;f=void 0;try{await i?.save(a),i&&p.emit({type:"memory:save",messageCount:a.length});}catch{}}c=false;}},se=async()=>{if(!(g||!e.memory)){g=true;try{let n=await e.memory.load();n.length>0&&r.messages.length===0&&(r={...r,messages:n},p.emit({type:"memory:load",messageCount:n.length}),P());}catch{}}};se();let K=(n,a)=>{A(i=>({...i,messages:$(i.messages,n,a)}));},D=(n,a,i)=>{A(u=>({...u,messages:ge(u.messages,n,a,i)}));},ie=(n,a,i)=>re({tool:n,toolCall:a,context:{messages:r.messages,call:a},emitter:p,lifecycle:v,validate:e.validateArgs,authorize:h,onPartial:i}),Se=async(n,a,i)=>{let u=a.toolCall;if(!u)return;let x=C.get(u.name),y={id:u.id,name:u.name,args:Z(u.args),result:u.result,status:x?.requiresConfirmation?"requires_confirmation":"pending"};if(await te(h,y,{messages:r.messages,tool:x,phase:"propose"}),i!==s||(K(n,T=>({...T,toolCalls:[...T.toolCalls??[],y]})),await e.onToolCall?.(y,{messages:r.messages,tool:x}),i!==s))return;if(x?.requiresConfirmation){u.result&&D(n,y.id,{result:u.result,status:"complete"});return}x?.execute&&D(n,y.id,{status:"running"});let E=await ie(x,y,T=>{i===s&&D(n,y.id,{result:T});});i===s&&D(n,y.id,{status:E.status==="complete"?"complete":"error",result:E.result,error:E.error});},ae=async(n,a,i)=>{await w();let u=await fe(e,r.messages,a,o,[...C.values()]);if(i!==s)return false;l=e.adapter.createSource(u);let x=Date.now(),y=false,E;return p.emit({type:"llm:start",messageCount:u.messages.length}),await W(l,{onText(T){i===s&&(y||(p.emit({type:"llm:first-token",latencyMs:Date.now()-x}),y=true),K(n,S=>({...S,content:T})));},onReasoning(T){i===s&&K(n,S=>({...S,metadata:{...S.metadata,reasoning:T}}));},async onToolCall(T){i===s&&await Se(n,T,i);},onToolResult(T){i===s&&K(n,S=>({...S,metadata:{...S.metadata,toolResult:T}}));},onUsage(T){if(i!==s)return;let S=ue(T);S&&(E=S),A(L=>({...L,messages:$(L.messages,n,k=>({...k,metadata:{...k.metadata,usage:T}})),usage:me(L.usage,T)}));},onError(T){i===s&&(s++,K(n,S=>({...S,status:"error"})),A(S=>({...S,status:"error",error:T})),p.emit({type:"error",error:T}),e.onError?.(T));},onDone(T){i===s&&p.emit({type:"llm:end",content:T,...E?{usage:E}:{},durationMs:Date.now()-x});}}),i===s},le=n=>{let a;A(i=>({...i,messages:i.messages.map(u=>u.id!==n?u:(a={...u,status:"complete"},a)),status:"idle",error:null})),a&&e.onMessage?.(a);},Ee=(n,a)=>{let i="";return A(u=>{let{messages:x,nextAssistantId:y}=de(u.messages,n,a,I);return i=y,{...u,messages:x,status:"streaming",error:null}}),i},V=async(n,a)=>{let i=n;for(let u=e.maxToolIterations??5;u>0;u--){let y=r.messages.find(S=>S.id===i)?.toolCalls??[],E=y.some(S=>S.status!=="complete"&&S.status!=="error");if(!y.length||E){le(i);return}if(i=Ee(i,y),!await ae(i,"",a))return}le(i);},F=async(n,a,i)=>{await ae(n,a,i)&&await V(n,i);},B={getState:()=>r,subscribe(n){return m.add(n),()=>{m.delete(n);}},async send(n){if(!n.trim())return;r.status==="streaming"&&B.stop(),s++;let a=I({role:"user",content:n}),i=I({role:"assistant",content:"",status:"streaming"});A(u=>({...u,messages:[...u.messages,a,i],status:"streaming",input:"",error:null})),await F(i.id,n,s);},stop(){s++,l?.abort();let n=r.messages.filter(a=>a.status==="streaming");A(a=>({...a,messages:a.messages.map(i=>i.status==="streaming"?{...i,status:"complete"}:i),status:"idle"})),n.forEach(a=>e.onMessage?.({...a,status:"complete"}));},async retry(){let n=[...r.messages];if(n.length<2)return;let a=n[n.length-1],i=n[n.length-2];if(a.role!=="assistant"||i.role!=="user")return;s++;let u=n.slice(0,-1),x=I({role:"assistant",content:"",status:"streaming"});A(y=>({...y,messages:[...u,x],status:"streaming",error:null})),await F(x.id,i.content,s);},async edit(n,a,i={}){let u=r.messages,x=u.findIndex(k=>k.id===n);if(x===-1)return;let y=u[x];if(y.role!=="user"){A(k=>({...k,messages:k.messages.map(J=>J.id===n?{...J,content:a}:J)}));return}let E=i.regenerate!==false,T=u.slice(0,x).concat({...y,content:a});if(!E){A(k=>({...k,messages:T}));return}s++,l?.abort();let S=I({role:"assistant",content:"",status:"streaming"}),L=[...T,S];A(k=>({...k,messages:L,status:"streaming",error:null})),await F(S.id,a,s);},async regenerate(n){let a=r.messages;if(a.length<2)return;let i;if(n){if(i=a.findIndex(T=>T.id===n&&T.role==="assistant"),i===-1)return}else if(i=a.length-1,a[i].role!=="assistant")return;let u=i-1;for(;u>=0&&a[u].role!=="user";)u--;if(u<0)return;s++,l?.abort();let x=a.slice(0,i),y=I({role:"assistant",content:"",status:"streaming"}),E=[...x,y];A(T=>({...T,messages:E,status:"streaming",error:null})),await F(y.id,a[u].content,s);},setInput(n){A(a=>({...a,input:n}));},setMessages(n){A(a=>({...a,messages:n}));},async clear(){await v.disposeAll(),A(n=>({...n,messages:[],status:"idle",error:null,usage:{promptTokens:0,completionTokens:0,totalTokens:0}})),await e.memory?.clear?.();},proposeToolCall:n=>import('./tool-proposal-internal.js').then(a=>a.withAuthority(B,n,i=>[C.get(i),e.validateArgs,e.onToolCall,h])),async approve(n){let a=r.messages.find(y=>y.toolCalls?.some(E=>E.id===n&&E.status==="requires_confirmation")),i=a?.toolCalls?.find(y=>y.id===n);if(!a||!i)return;let u=C.get(i.name);if(!u?.execute)return;D(a.id,n,{status:"running"});let x=await ie({...u,requiresConfirmation:false},i,y=>D(a.id,n,{result:y}));D(a.id,n,{status:x.status==="complete"?"complete":"error",result:x.result,error:x.error}),await V(a.id,s);},async deny(n,a){let i=r.messages.find(x=>x.toolCalls?.some(y=>y.id===n&&y.status==="requires_confirmation")),u=i?.toolCalls?.find(x=>x.id===n);!i||!u||(D(i.id,n,{status:"error",error:`Permission denied: ${a??"user denied access"}`}),await V(i.id,s));},updateConfig(n){v.disposeAll(),e={...e,...n},d=false,M(),w(),se();}};return B}function pe(t){return JSON.parse(JSON.stringify({version:1,messages:t}))}function ye(t){return t?.messages?t.messages.map(e=>({...e,createdAt:new Date(e.createdAt)})):[]}function be(t=[]){let e=[...t];return {async load(){return [...e]},async save(o){e=[...o];},async clear(){e=[];}}}function Oe(t){return {async load(){if(typeof localStorage>"u")return [];let e=localStorage.getItem(t);if(!e)return [];try{return ye(JSON.parse(e))}catch{return []}},async save(e){typeof localStorage>"u"||localStorage.setItem(t,JSON.stringify(pe(e)));},async clear(){typeof localStorage>"u"||localStorage.removeItem(t);}}}function Ne(t){return t}var Te={name:"approximate",count(t){let e=0;for(let o of t)e+=Math.ceil(((o.role?.length??0)+(o.content?.length??0))/4)+2;return e},countDetailed(t){let e=t.map(o=>Math.ceil(((o.role?.length??0)+(o.content?.length??0))/4)+2);return {total:e.reduce((o,l)=>o+l,0),perMessage:e}}};function Ke(t,e){return !t||t.length===0?0:e.count(t.map(o=>({role:"system",content:`${o.name}:${o.description??""}:${JSON.stringify(o.schema??{})}`})))}async function ne(t){return typeof t=="number"?t:await t}async function Le(t){let e=t.counter??Te,o=t.strategy??"drop-oldest",l=Math.max(1,t.keepRecent??1),s=t.reserveForOutput??0,r=t.budget-s;if(r<=0)throw new Error(`Budget must exceed reserveForOutput (${t.budget} \u2264 ${s})`);let m=t.systemPrompt?{id:"__system",role:"system",content:t.systemPrompt,status:"complete",createdAt:new Date(0)}:void 0,p=m?await ne(e.count([m])):0,C=await ne(Ke(t.tools,e)),v=p+C;if(v>r)throw new Error(`System prompt + tools (${v} tokens) exceed budget (${r}). Shrink system prompt or raise budget.`);let g=[...t.messages],d=[],c=async h=>ne(e.count(h)),f=v+await c(g);if(o==="sliding-window")for(;g.length>l&&f>r;)d.push(g.shift()),f=v+await c(g);else if(o==="drop-oldest")for(;g.length>l&&f>r;)d.push(g.shift()),f=v+await c(g);else if(o==="summarize"){if(!t.summarizer)throw new Error("strategy='summarize' requires a summarizer function");for(;g.length>l&&f>r;)d.push(g.shift()),f=v+await c(g);if(d.length>0){let h=await t.summarizer(d);g.unshift(h),f=v+await c(g);}}return {messages:g,systemPrompt:t.systemPrompt,tokens:{system:p,messages:f-v,tools:C,total:f,budget:r},dropped:d,fits:f<=r,strategy:o}}function he(){let t="",e=[],o={},l=false,s=false,r=0,m=()=>{for(;r<t.length&&/\s/.test(t[r]);)r++;},p=()=>{if(t[r]!=='"')return -1;let c=r+1;for(;c<t.length;){let f=t[c];if(f==="\\"){c+=2;continue}if(f==='"')return c+1;c++;}return -1},C=(c,f)=>{let h=0,M=r,w=false,P=false;for(;M<t.length;){let A=t[M];if(w)P?P=false:A==="\\"?P=true:A==='"'&&(w=false);else if(A==='"')w=true;else if(A===c)h++;else if(A===f&&(h--,h===0))return M+1;M++;}return -1},v=()=>{let c=r;for(;c<t.length;){let f=t[c];if(f===","||f==="}"||/\s/.test(f))return c;c++;}return -1},g=()=>{if(m(),r>=t.length)return null;let c=t[r],f=-1;if(c==='"'?f=p():c==="{"?f=C("{","}"):c==="["?f=C("[","]"):f=v(),f<0)return null;let h=t.slice(r,f);try{return {end:f,raw:h,value:JSON.parse(h)}}catch{return null}},d=()=>{let c=[];if(s)return c;if(!l){if(m(),r>=t.length)return c;if(t[r]!=="{")throw new Error(`Expected '{' at position ${r}`);r++,l=true;}for(;;){if(m(),r>=t.length)return c;if(t[r]==="}")return r++,s=true,c;if(t[r]===","){r++;continue}let f=p();if(f<0)return c;let h=t.slice(r,f),M=JSON.parse(h),w=r;if(r=f,m(),t[r]!==":")return r=w,c;r++;let P=g();if(!P)return r=w,c;let A={field:M,value:P.value,raw:P.raw,offset:P.end};o[M]=P.value,e.push(A),c.push(A),r=P.end;}};return {push(c){return t+=c,d()},end(){let c=d();if(!s)throw new Error("Progressive JSON ended without closing `}`");return c},get events(){return e},get value(){return o},get buffer(){return t}}}function Fe(t,e,o,l={}){let s=he(),r=new Set(l.triggerFields??[]),m=r.size===0,p=false,C=()=>{},v=new Promise(h=>{C=h;}),g={},d=h=>{g[h.field]=h.value,l.onField?.(h),p||(m||r.has(h.field))&&(m||r.delete(h.field),(m||r.size===0)&&(p=true,C({...g})));},c=async()=>{for await(let h of e)for(let M of s.push(h))d(M);for(let h of s.end())d(h);p||(p=true,C({...g}));},f=(async()=>{let h=c(),M=await v,w={id:o.callId,name:t.name,args:M,status:"running"},P=t.execute?Promise.resolve(t.execute(M,{messages:o.messages,call:w})):Promise.resolve(void 0),[A]=await Promise.all([P,h]);return A})();return {get fields(){return s.events.slice()},get finalArgs(){return g},execution:f}}function Ue(t,e={}){let o=Math.max(1,e.maxActive??50),l=Math.max(0,e.maxRetrieved??10),s=r=>r.length<=o?{hot:r.slice(),cold:[]}:{hot:r.slice(r.length-o),cold:r.slice(0,r.length-o)};return {async load(){let r=[...await t.load()],{hot:m,cold:p}=s(r);if(p.length===0)return m;let C=[];e.retriever&&l>0&&(C=[...await e.retriever({hot:m,cold:p,maxRetrieved:l})]);let v=new Set(m.map(d=>d.id)),g=C.filter(d=>!v.has(d.id));return xe(g,m)},async save(r){let m=[...await t.load()],{cold:p}=s(m),C=new Set(r.map(g=>g.id)),v=p.filter(g=>!C.has(g.id));await t.save(xe(v,r));},async clear(){await t.clear?.();},async size(){return (await t.load()).length},async loadAll(){return [...await t.load()]}}}function xe(t,e){let o=[...t,...e];return o.sort((l,s)=>l.createdAt.getTime()-s.createdAt.getTime()),o}function Ae(t){return {type:"text",text:t}}function ze(t,e={}){return {type:"image",source:t,...e}}function $e(t,e={}){return {type:"audio",source:t,...e}}function Ve(t,e={}){return {type:"video",source:t,...e}}function Be(t,e={}){return {type:"file",source:t,...e}}function Ce(t){let e=[];for(let o of t)switch(o.type){case "text":e.push(o.text);break;case "image":e.push(`[image: ${o.source}]`);break;case "audio":e.push(`[audio: ${o.source}]`);break;case "video":e.push(`[video: ${o.source}]`);break;case "file":e.push(`[file: ${o.filename??o.source}]`);break}return e.join(` | ||
| `)}function Je(t,e){if(e&&e.length>0)return {text:Ce(e),parts:e};let o=t??"";return {text:o,parts:o?[Ae(o)]:[]}}function qe(t,e){return t.filter(o=>o.type===e)}exports.AdapterError=N;exports.AgentsKitError=_;exports.ConfigError=j;exports.ErrorCodes=b;exports.MemoryError=q;exports.RuntimeError=X;exports.SandboxError=G;exports.SkillError=H;exports.ToolError=R;exports.activateSkills=ee;exports.approximateCounter=Te;exports.audioPart=$e;exports.buildMessage=I;exports.buildToolMap=z;exports.compileBudget=Le;exports.consumeStream=W;exports.createChatController=Re;exports.createEventEmitter=Y;exports.createInMemoryMemory=be;exports.createLocalStorageMemory=Oe;exports.createProgressiveArgParser=he;exports.createStaticRetriever=ke;exports.createToolLifecycle=U;exports.createVirtualizedMemory=Ue;exports.defineTool=Ne;exports.deserializeMessages=ye;exports.executeSafeTool=re;exports.executeToolCall=Q;exports.executeToolProgressively=Fe;exports.filePart=Be;exports.filterParts=qe;exports.formatRetrievedDocuments=oe;exports.generateId=ce;exports.imagePart=ze;exports.normalizeContent=Je;exports.partsToText=Ce;exports.safeParseArgs=Z;exports.serializeMessages=pe;exports.textPart=Ae;exports.videoPart=Ve;//# sourceMappingURL=index.cjs.map | ||
| ${e}`}):null}function be(e){let t=e,o=t.systemPrompt,l,s=0,r={messages:e.initialMessages??[],status:"idle",input:"",error:null,usage:{promptTokens:0,completionTokens:0,totalTokens:0}},m=new Set,p=Y(),C=z(t.tools),S=U(C),g=false,d=false,c=false,f,h=async(n,a)=>{let i=t.authorizeToolCall,u=i?await i(n,a):{allowed:true};return i===t.authorizeToolCall&&C.get(n.name)?.execute===a.tool?.execute?u:{allowed:false}},M=n=>{C=z(t.tools,n),S=U(C);},w=async()=>{if(d)return;d=true;let n=await ee(t.skills??[],t.systemPrompt);o=n.systemPrompt,n.skillTools.length>0&&M(n.skillTools);};w();for(let n of t.observers??[])p.addObserver(n);let P=()=>{for(let n of m)n();},A=n=>{r=typeof n=="function"?n(r):n,Se(r.messages),P();},Se=async n=>{if(f=[n,t.memory],!c){for(c=true;f;){let[a,i]=f;f=void 0;try{await i?.save(a),i&&p.emit({type:"memory:save",messageCount:a.length});}catch{}}c=false;}},se=async()=>{if(!(g||!t.memory)){g=true;try{let n=await t.memory.load();n.length>0&&r.messages.length===0&&(r={...r,messages:n},p.emit({type:"memory:load",messageCount:n.length}),P());}catch{}}};se();let K=(n,a)=>{A(i=>({...i,messages:$(i.messages,n,a)}));},D=(n,a,i)=>{A(u=>({...u,messages:ge(u.messages,n,a,i)}));},ie=(n,a,i)=>re({tool:n,toolCall:a,context:{messages:r.messages,call:a},emitter:p,lifecycle:S,validate:t.validateArgs,authorize:h,onPartial:i}),ve=async(n,a,i)=>{let u=a.toolCall;if(!u)return;let x=C.get(u.name),y={id:u.id,name:u.name,args:Z(u.args),result:u.result,status:x?.requiresConfirmation?"requires_confirmation":"pending"};if(await te(h,y,{messages:r.messages,tool:x,phase:"propose"}),i!==s||(K(n,T=>({...T,toolCalls:[...T.toolCalls??[],y]})),await t.onToolCall?.(y,{messages:r.messages,tool:x}),i!==s))return;if(x?.requiresConfirmation){u.result&&D(n,y.id,{result:u.result,status:"complete"});return}x?.execute&&D(n,y.id,{status:"running"});let E=await ie(x,y,T=>{i===s&&D(n,y.id,{result:T});});i===s&&D(n,y.id,{status:E.status==="complete"?"complete":"error",result:E.result,error:E.error});},ae=async(n,a,i)=>{await w();let u=await fe(t,r.messages,a,o,[...C.values()]);if(i!==s)return false;l=t.adapter.createSource(u);let x=Date.now(),y=false,E;return p.emit({type:"llm:start",messageCount:u.messages.length}),await W(l,{onText(T){i===s&&(y||(p.emit({type:"llm:first-token",latencyMs:Date.now()-x}),y=true),K(n,v=>({...v,content:T})));},onReasoning(T){i===s&&K(n,v=>({...v,metadata:{...v.metadata,reasoning:T}}));},async onToolCall(T){i===s&&await ve(n,T,i);},onToolResult(T){i===s&&K(n,v=>({...v,metadata:{...v.metadata,toolResult:T}}));},onUsage(T){if(i!==s)return;let v=ue(T);v&&(E=v),A(L=>({...L,messages:$(L.messages,n,k=>({...k,metadata:{...k.metadata,usage:T}})),usage:me(L.usage,T)}));},onError(T){i===s&&(s++,K(n,v=>({...v,status:"error"})),A(v=>({...v,status:"error",error:T})),p.emit({type:"error",error:T}),t.onError?.(T));},onDone(T){i===s&&p.emit({type:"llm:end",content:T,...E?{usage:E}:{},durationMs:Date.now()-x});}}),i===s},le=n=>{let a;A(i=>({...i,messages:i.messages.map(u=>u.id!==n?u:(a={...u,status:"complete"},a)),status:"idle",error:null})),a&&t.onMessage?.(a);},Ee=(n,a)=>{let i="";return A(u=>{let{messages:x,nextAssistantId:y}=de(u.messages,n,a,I);return i=y,{...u,messages:x,status:"streaming",error:null}}),i},V=async(n,a)=>{let i=n;for(let u=t.maxToolIterations??5;u>0;u--){let y=r.messages.find(v=>v.id===i)?.toolCalls??[],E=y.some(v=>v.status!=="complete"&&v.status!=="error");if(!y.length||E){le(i);return}if(i=Ee(i,y),!await ae(i,"",a))return}le(i);},F=async(n,a,i)=>{await ae(n,a,i)&&await V(n,i);},B={getState:()=>r,subscribe(n){return m.add(n),()=>{m.delete(n);}},async send(n){if(!n.trim())return;r.status==="streaming"&&B.stop(),s++;let a=I({role:"user",content:n}),i=I({role:"assistant",content:"",status:"streaming"});A(u=>({...u,messages:[...u.messages,a,i],status:"streaming",input:"",error:null})),await F(i.id,n,s);},stop(){s++,l?.abort();let n=r.messages.filter(a=>a.status==="streaming");A(a=>({...a,messages:a.messages.map(i=>i.status==="streaming"?{...i,status:"complete"}:i),status:"idle"})),n.forEach(a=>t.onMessage?.({...a,status:"complete"}));},async retry(){let n=[...r.messages];if(n.length<2)return;let a=n[n.length-1],i=n[n.length-2];if(a.role!=="assistant"||i.role!=="user")return;s++;let u=n.slice(0,-1),x=I({role:"assistant",content:"",status:"streaming"});A(y=>({...y,messages:[...u,x],status:"streaming",error:null})),await F(x.id,i.content,s);},async edit(n,a,i={}){let u=r.messages,x=u.findIndex(k=>k.id===n);if(x===-1)return;let y=u[x];if(y.role!=="user"){A(k=>({...k,messages:k.messages.map(J=>J.id===n?{...J,content:a}:J)}));return}let E=i.regenerate!==false,T=u.slice(0,x).concat({...y,content:a});if(!E){A(k=>({...k,messages:T}));return}s++,l?.abort();let v=I({role:"assistant",content:"",status:"streaming"}),L=[...T,v];A(k=>({...k,messages:L,status:"streaming",error:null})),await F(v.id,a,s);},async regenerate(n){let a=r.messages;if(a.length<2)return;let i;if(n){if(i=a.findIndex(T=>T.id===n&&T.role==="assistant"),i===-1)return}else if(i=a.length-1,a[i].role!=="assistant")return;let u=i-1;for(;u>=0&&a[u].role!=="user";)u--;if(u<0)return;s++,l?.abort();let x=a.slice(0,i),y=I({role:"assistant",content:"",status:"streaming"}),E=[...x,y];A(T=>({...T,messages:E,status:"streaming",error:null})),await F(y.id,a[u].content,s);},setInput(n){A(a=>({...a,input:n}));},setMessages(n){A(a=>({...a,messages:n}));},async clear(){await S.disposeAll(),A(n=>({...n,messages:[],status:"idle",error:null,usage:{promptTokens:0,completionTokens:0,totalTokens:0}})),await t.memory?.clear?.();},proposeToolCall:n=>import('./tool-proposal-internal.js').then(a=>a.withAuthority(B,n,i=>[C.get(i),t.validateArgs,t.onToolCall,h])),async approve(n){let a=r.messages.find(y=>y.toolCalls?.some(E=>E.id===n&&E.status==="requires_confirmation")),i=a?.toolCalls?.find(y=>y.id===n);if(!a||!i)return;let u=C.get(i.name);if(!u?.execute)return;D(a.id,n,{status:"running"});let x=await ie({...u,requiresConfirmation:false},i,y=>D(a.id,n,{result:y}));D(a.id,n,{status:x.status==="complete"?"complete":"error",result:x.result,error:x.error}),await V(a.id,s);},async deny(n,a){let i=r.messages.find(x=>x.toolCalls?.some(y=>y.id===n&&y.status==="requires_confirmation")),u=i?.toolCalls?.find(x=>x.id===n);!i||!u||(D(i.id,n,{status:"error",error:`Permission denied: ${a??"user denied access"}`}),await V(i.id,s));},updateConfig(n){S.disposeAll(),t={...t,...n},d=false,M(),w(),se();}};return B}function pe(e){return JSON.parse(JSON.stringify({version:1,messages:e}))}function ye(e){return e?.messages?e.messages.map(t=>({...t,createdAt:new Date(t.createdAt)})):[]}function Oe(e=[]){let t=[...e];return {async load(){return [...t]},async save(o){t=[...o];},async clear(){t=[];}}}function Ne(e){return {async load(){if(typeof localStorage>"u")return [];let t=localStorage.getItem(e);if(!t)return [];try{return ye(JSON.parse(t))}catch{return []}},async save(t){typeof localStorage>"u"||localStorage.setItem(e,JSON.stringify(pe(t)));},async clear(){typeof localStorage>"u"||localStorage.removeItem(e);}}}function Ke(e){return e}var Te={name:"approximate",count(e){let t=0;for(let o of e)t+=Math.ceil(((o.role?.length??0)+(o.content?.length??0))/4)+2;return t},countDetailed(e){let t=e.map(o=>Math.ceil(((o.role?.length??0)+(o.content?.length??0))/4)+2);return {total:t.reduce((o,l)=>o+l,0),perMessage:t}}};function Le(e,t){return !e||e.length===0?0:t.count(e.map(o=>({role:"system",content:`${o.name}:${o.description??""}:${JSON.stringify(o.schema??{})}`})))}async function ne(e){return typeof e=="number"?e:await e}async function Fe(e){let t=e.counter??Te,o=e.strategy??"drop-oldest",l=Math.max(1,e.keepRecent??1),s=e.reserveForOutput??0,r=e.budget-s;if(r<=0)throw new Error(`Budget must exceed reserveForOutput (${e.budget} \u2264 ${s})`);let m=e.systemPrompt?{id:"__system",role:"system",content:e.systemPrompt,status:"complete",createdAt:new Date(0)}:void 0,p=m?await ne(t.count([m])):0,C=await ne(Le(e.tools,t)),S=p+C;if(S>r)throw new Error(`System prompt + tools (${S} tokens) exceed budget (${r}). Shrink system prompt or raise budget.`);let g=[...e.messages],d=[],c=async h=>ne(t.count(h)),f=S+await c(g);if(o==="sliding-window")for(;g.length>l&&f>r;)d.push(g.shift()),f=S+await c(g);else if(o==="drop-oldest")for(;g.length>l&&f>r;)d.push(g.shift()),f=S+await c(g);else if(o==="summarize"){if(!e.summarizer)throw new Error("strategy='summarize' requires a summarizer function");for(;g.length>l&&f>r;)d.push(g.shift()),f=S+await c(g);if(d.length>0){let h=await e.summarizer(d);g.unshift(h),f=S+await c(g);}}return {messages:g,systemPrompt:e.systemPrompt,tokens:{system:p,messages:f-S,tools:C,total:f,budget:r},dropped:d,fits:f<=r,strategy:o}}function he(){let e="",t=[],o={},l=false,s=false,r=0,m=()=>{for(;r<e.length&&/\s/.test(e[r]);)r++;},p=()=>{if(e[r]!=='"')return -1;let c=r+1;for(;c<e.length;){let f=e[c];if(f==="\\"){c+=2;continue}if(f==='"')return c+1;c++;}return -1},C=(c,f)=>{let h=0,M=r,w=false,P=false;for(;M<e.length;){let A=e[M];if(w)P?P=false:A==="\\"?P=true:A==='"'&&(w=false);else if(A==='"')w=true;else if(A===c)h++;else if(A===f&&(h--,h===0))return M+1;M++;}return -1},S=()=>{let c=r;for(;c<e.length;){let f=e[c];if(f===","||f==="}"||/\s/.test(f))return c;c++;}return -1},g=()=>{if(m(),r>=e.length)return null;let c=e[r],f=-1;if(c==='"'?f=p():c==="{"?f=C("{","}"):c==="["?f=C("[","]"):f=S(),f<0)return null;let h=e.slice(r,f);try{return {end:f,raw:h,value:JSON.parse(h)}}catch{return null}},d=()=>{let c=[];if(s)return c;if(!l){if(m(),r>=e.length)return c;if(e[r]!=="{")throw new Error(`Expected '{' at position ${r}`);r++,l=true;}for(;;){if(m(),r>=e.length)return c;if(e[r]==="}")return r++,s=true,c;if(e[r]===","){r++;continue}let f=p();if(f<0)return c;let h=e.slice(r,f),M=JSON.parse(h),w=r;if(r=f,m(),e[r]!==":")return r=w,c;r++;let P=g();if(!P)return r=w,c;let A={field:M,value:P.value,raw:P.raw,offset:P.end};o[M]=P.value,t.push(A),c.push(A),r=P.end;}};return {push(c){return e+=c,d()},end(){let c=d();if(!s)throw new Error("Progressive JSON ended without closing `}`");return c},get events(){return t},get value(){return o},get buffer(){return e}}}function Ue(e,t,o,l={}){let s=he(),r=new Set(l.triggerFields??[]),m=r.size===0,p=false,C=()=>{},S=new Promise(h=>{C=h;}),g={},d=h=>{g[h.field]=h.value,l.onField?.(h),p||(m||r.has(h.field))&&(m||r.delete(h.field),(m||r.size===0)&&(p=true,C({...g})));},c=async()=>{for await(let h of t)for(let M of s.push(h))d(M);for(let h of s.end())d(h);p||(p=true,C({...g}));},f=(async()=>{let h=c(),M=await S,w={id:o.callId,name:e.name,args:M,status:"running"},P=e.execute?Promise.resolve(e.execute(M,{messages:o.messages,call:w})):Promise.resolve(void 0),[A]=await Promise.all([P,h]);return A})();return {get fields(){return s.events.slice()},get finalArgs(){return g},execution:f}}function ze(e,t={}){let o=Math.max(1,t.maxActive??50),l=Math.max(0,t.maxRetrieved??10),s=r=>r.length<=o?{hot:r.slice(),cold:[]}:{hot:r.slice(r.length-o),cold:r.slice(0,r.length-o)};return {async load(){let r=[...await e.load()],{hot:m,cold:p}=s(r);if(p.length===0)return m;let C=[];t.retriever&&l>0&&(C=[...await t.retriever({hot:m,cold:p,maxRetrieved:l})]);let S=new Set(m.map(d=>d.id)),g=C.filter(d=>!S.has(d.id));return xe(g,m)},async save(r){let m=[...await e.load()],{cold:p}=s(m),C=new Set(r.map(g=>g.id)),S=p.filter(g=>!C.has(g.id));await e.save(xe(S,r));},async clear(){await e.clear?.();},async size(){return (await e.load()).length},async loadAll(){return [...await e.load()]}}}function xe(e,t){let o=[...e,...t];return o.sort((l,s)=>l.createdAt.getTime()-s.createdAt.getTime()),o}function Ae(e){return {type:"text",text:e}}function $e(e,t={}){return {type:"image",source:e,...t}}function Ve(e,t={}){return {type:"audio",source:e,...t}}function Be(e,t={}){return {type:"video",source:e,...t}}function Je(e,t={}){return {type:"file",source:e,...t}}function Ce(e){let t=[];for(let o of e)switch(o.type){case "text":t.push(o.text);break;case "image":t.push(`[image: ${o.source}]`);break;case "audio":t.push(`[audio: ${o.source}]`);break;case "video":t.push(`[video: ${o.source}]`);break;case "file":t.push(`[file: ${o.filename??o.source}]`);break}return t.join(` | ||
| `)}function qe(e,t){if(t&&t.length>0)return {text:Ce(t),parts:t};let o=e??"";return {text:o,parts:o?[Ae(o)]:[]}}function je(e,t){return e.filter(o=>o.type===t)}exports.AdapterError=N;exports.AgentsKitError=_;exports.ConfigError=j;exports.ErrorCodes=b;exports.MemoryError=q;exports.RuntimeError=X;exports.SandboxError=G;exports.SkillError=H;exports.ToolError=R;exports.activateSkills=ee;exports.approximateCounter=Te;exports.audioPart=Ve;exports.buildMessage=I;exports.buildToolMap=z;exports.compileBudget=Fe;exports.consumeStream=W;exports.createChatController=be;exports.createEventEmitter=Y;exports.createInMemoryMemory=Oe;exports.createLocalStorageMemory=Ne;exports.createProgressiveArgParser=he;exports.createStaticRetriever=Ie;exports.createToolLifecycle=U;exports.createVirtualizedMemory=ze;exports.defineTool=Ke;exports.deserializeMessages=ye;exports.executeSafeTool=re;exports.executeToolCall=Q;exports.executeToolProgressively=Ue;exports.filePart=Je;exports.filterParts=je;exports.formatRetrievedDocuments=oe;exports.generateId=ce;exports.imagePart=$e;exports.normalizeContent=qe;exports.partsToText=Ce;exports.safeParseArgs=Z;exports.serializeMessages=pe;exports.textPart=Ae;exports.videoPart=Be;//# sourceMappingURL=index.cjs.map | ||
| //# sourceMappingURL=index.cjs.map |
+1
-1
@@ -1,2 +0,2 @@ | ||
| import {b,h,f,i,c,k,g,e,j}from'./chunk-MNAKU42O.js';export{i as activateSkills,c as buildMessage,h as buildToolMap,g as consumeStream,b as createEventEmitter,f as createToolLifecycle,k as executeSafeTool,d as executeToolCall,a as generateId,e as safeParseArgs}from'./chunk-MNAKU42O.js';export{a as approximateCounter,b as compileBudget}from'./chunk-T7ZO4R4E.js';export{b as AdapterError,a as AgentsKitError,e as ConfigError,i as ErrorCodes,d as MemoryError,f as RuntimeError,g as SandboxError,h as SkillError,c as ToolError}from'./chunk-4PAWFNZ5.js';function Me(e,t){let i=`${e.content} ${e.source??""}`.toLowerCase(),c=t.toLowerCase().split(/\s+/).filter(Boolean);return c.length===0?0:c.reduce((a,o)=>i.includes(o)?a+1:a,0)}function we(e){let{documents:t,limit:i=4}=e;return {async retrieve(c){return [...t].map(a=>({...a,score:a.score??Me(a,c.query)})).filter(a=>(a.score??0)>0).sort((a,o)=>(o.score??0)-(a.score??0)).slice(0,i)}}}function L(e){return e.length===0?"":e.map((t,i)=>{let c=t.source?`Source: ${t.source} | ||
| import {b,h,f,i,c,k,g,e,j}from'./chunk-VWKK6GKY.js';export{i as activateSkills,c as buildMessage,h as buildToolMap,g as consumeStream,b as createEventEmitter,f as createToolLifecycle,k as executeSafeTool,d as executeToolCall,a as generateId,e as safeParseArgs}from'./chunk-VWKK6GKY.js';export{a as approximateCounter,b as compileBudget}from'./chunk-T7ZO4R4E.js';export{b as AdapterError,a as AgentsKitError,e as ConfigError,i as ErrorCodes,d as MemoryError,f as RuntimeError,g as SandboxError,h as SkillError,c as ToolError}from'./chunk-4PAWFNZ5.js';function Me(e,t){let i=`${e.content} ${e.source??""}`.toLowerCase(),c=t.toLowerCase().split(/\s+/).filter(Boolean);return c.length===0?0:c.reduce((a,o)=>i.includes(o)?a+1:a,0)}function we(e){let{documents:t,limit:i=4}=e;return {async retrieve(c){return [...t].map(a=>({...a,score:a.score??Me(a,c.query)})).filter(a=>(a.score??0)>0).sort((a,o)=>(o.score??0)-(a.score??0)).slice(0,i)}}}function L(e){return e.length===0?"":e.map((t,i)=>{let c=t.source?`Source: ${t.source} | ||
| `:"";return `[${i+1}] | ||
@@ -3,0 +3,0 @@ ${c}${t.content}`}).join(` |
@@ -1,3 +0,3 @@ | ||
| 'use strict';var w="https://www.agentskit.io/docs";function S(t,e,g,c){let r=[`error[${t}]: ${e}`];return g&&r.push(` --> Hint: ${g}`),c&&r.push(` --> Docs: ${c}`),r.join(` | ||
| `)}var I=class extends Error{constructor(e){super(e.message),this.name="AgentsKitError",this.code=e.code,this.hint=e.hint,this.docsUrl=e.docsUrl,this.cause=e.cause;}toString(){return S(this.code,this.message,this.hint,this.docsUrl)}};var m=class extends I{constructor(e){super({docsUrl:`${w}/tools`,...e}),this.name="ToolError";}};var _={AK_TOOL_NOT_FOUND:"AK_TOOL_NOT_FOUND",AK_TOOL_INVALID_INPUT:"AK_TOOL_INVALID_INPUT",AK_CONFIG_INVALID:"AK_CONFIG_INVALID"};function h(t,e,g=1/0,c=true){let r=i=>{let f=new WeakSet,l=[{value:i,depth:0}],A=0;for(;l.length>0;){let n=l.pop(),o=n.value;if(n.exit){f.delete(o);continue}if((++A>1e4||n.depth>32)&&e(),o===null||typeof o=="boolean")continue;if(typeof o=="string"){o.length>g&&e();continue}if(typeof o=="number"){Number.isFinite(o)||e();continue}typeof o!="object"&&e();let T=Array.isArray(o),p=T?Array.prototype:Object.getPrototypeOf(o);if(!T&&p!==Object.prototype&&p!==null&&e(),f.has(o)&&e(),f.add(o),l.push({value:o,depth:n.depth,exit:true}),T){let a=o;a.length>1e4&&e();for(let s=a.length-1;s>=0;s--)l.push({value:a[s],depth:n.depth+1});continue}let u=Object.keys(o);u.length>1e4&&e();for(let a=u.length-1;a>=0;a--){let s=u[a];s.length>256&&e();let d=Object.getOwnPropertyDescriptor(o,s);(!d||d.get||d.set)&&e(),l.push({value:d.value,depth:n.depth+1});}}};try{c&&r(t);let i=structuredClone(t);return r(i),(typeof i!="object"||i===null||Array.isArray(i))&&e(),i}catch{return e()}}var x=0;function L(t){return `${t}-${Date.now()}-${x++}`}function y(t){return {id:L("msg"),role:t.role,content:t.content,status:t.status??"complete",metadata:t.metadata,toolCallId:t.toolCallId,createdAt:new Date}}async function D(t,e,g){t&&await import('./tool-authorization-internal.js').then(c=>c.authorize(t,e,g));}var O=new WeakMap;async function U(t,e,g){let c=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;if(!c.test(e.id))throw new m({code:_.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal identity"});for(let l of t.getState().messages){let A=l.toolCalls?.find(n=>n.id===e.id);if(A)return A}let r=O.get(t);r||(r=new Map,O.set(t,r));let i=r.get(e.id);if(i)return i;let f=(async()=>{if(!c.test(e.name))throw new m({code:_.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal identity"});let l=()=>{throw new m({code:_.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal arguments"})},A=h(e.args,l,16384),[n,o,T,p]=g(e.name);if(!n?.requiresConfirmation||!n.execute)throw new m({code:n?_.AK_CONFIG_INVALID:_.AK_TOOL_NOT_FOUND,message:"Tool is not registered for confirmation"});if(o&&n.schema){let s=o(n.schema,A);if(!s.valid)throw new m({code:_.AK_TOOL_INVALID_INPUT,message:s.message??"Invalid tool arguments"})}let u={...e,args:A,status:"requires_confirmation"};await D(p,u,{messages:t.getState().messages,tool:n,phase:"propose"});let a={...y({role:"assistant",content:""}),toolCalls:[u]};t.setMessages([...t.getState().messages,a]);try{await T?.(u,{messages:t.getState().messages,tool:n});}catch(s){throw t.setMessages(t.getState().messages.map(d=>d.id!==a.id?d:{...d,toolCalls:d.toolCalls?.map(E=>E.id!==u.id?E:{...E,status:"error",error:s instanceof Error?s.message:"Tool proposal rejected"})})),s}return u})();r.set(e.id,f);try{return await f}finally{r.delete(e.id);}}exports.withAuthority=U;//# sourceMappingURL=tool-proposal-internal.cjs.map | ||
| 'use strict';var S="https://www.agentskit.io/docs";function w(t,e,g,c){let r=[`error[${t}]: ${e}`];return g&&r.push(` --> Hint: ${g}`),c&&r.push(` --> Docs: ${c}`),r.join(` | ||
| `)}var I=class extends Error{constructor(e){super(e.message),this.name="AgentsKitError",this.code=e.code,this.hint=e.hint,this.docsUrl=e.docsUrl,this.cause=e.cause;}toString(){return w(this.code,this.message,this.hint,this.docsUrl)}};var m=class extends I{constructor(e){super({docsUrl:`${S}/tools`,...e}),this.name="ToolError";}};var A={AK_TOOL_NOT_FOUND:"AK_TOOL_NOT_FOUND",AK_TOOL_INVALID_INPUT:"AK_TOOL_INVALID_INPUT",AK_CONFIG_INVALID:"AK_CONFIG_INVALID"};function y(t,e,g=1/0,c=true){let r=i=>{let _=new WeakSet,l=[{value:i,depth:0}],f=0;for(;l.length>0;){let n=l.pop(),o=n.value;if(n.exit){_.delete(o);continue}if((++f>1e4||n.depth>32)&&e(),o===null||typeof o=="boolean")continue;if(typeof o=="string"){o.length>g&&e();continue}if(typeof o=="number"){Number.isFinite(o)||e();continue}typeof o!="object"&&e();let T=Array.isArray(o),p=T?Array.prototype:Object.getPrototypeOf(o);if(!T&&p!==Object.prototype&&p!==null&&e(),_.has(o)&&e(),_.add(o),l.push({value:o,depth:n.depth,exit:true}),T){let a=o;a.length>1e4&&e();for(let s=a.length-1;s>=0;s--)l.push({value:a[s],depth:n.depth+1});continue}let u=Object.keys(o);u.length>1e4&&e();for(let a=u.length-1;a>=0;a--){let s=u[a];s.length>256&&e();let d=Object.getOwnPropertyDescriptor(o,s);(!d||d.get||d.set)&&e(),l.push({value:d.value,depth:n.depth+1});}}};try{c&&r(t);let i=structuredClone(t);return r(i),(typeof i!="object"||i===null||Array.isArray(i))&&e(),i}catch{return e()}}var x=0;function L(t){return `${t}-${Date.now()}-${x++}`}function h(t){return {id:L("msg"),role:t.role,content:t.content,status:t.status??"complete",metadata:t.metadata,toolCallId:t.toolCallId,createdAt:new Date}}async function D(t,e,g){t&&await import('./tool-authorization-internal.js').then(c=>c.authorize(t,e,g));}var O=new WeakMap;async function U(t,e,g){let c=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;if(!c.test(e.id))throw new m({code:A.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal identity"});for(let l of t.getState().messages){let f=l.toolCalls?.find(n=>n.id===e.id);if(f)return f}let r=O.get(t);r||(r=new Map,O.set(t,r));let i=r.get(e.id);if(i)return i;let _=(async()=>{if(!c.test(e.name))throw new m({code:A.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal identity"});let l=()=>{throw new m({code:A.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal arguments"})},f=y(e.args,l,16384),[n,o,T,p]=g(e.name);if(!n?.requiresConfirmation||!n.execute)throw new m({code:n?A.AK_CONFIG_INVALID:A.AK_TOOL_NOT_FOUND,message:"Tool is not registered for confirmation"});if(o&&n.schema){let s=o(n.schema,f);if(!s.valid)throw new m({code:A.AK_TOOL_INVALID_INPUT,message:s.message??"Invalid tool arguments"})}let u={...e,args:f,status:"requires_confirmation"};await D(p,u,{messages:t.getState().messages,tool:n,phase:"propose"});let a={...h({role:"assistant",content:""}),toolCalls:[u]};t.setMessages([...t.getState().messages,a]);try{await T?.(u,{messages:t.getState().messages,tool:n});}catch(s){throw t.setMessages(t.getState().messages.map(d=>d.id!==a.id?d:{...d,toolCalls:d.toolCalls?.map(E=>E.id!==u.id?E:{...E,status:"error",error:s instanceof Error?s.message:"Tool proposal rejected"})})),s}return u})();r.set(e.id,_);try{return await _}finally{r.delete(e.id);}}exports.withAuthority=U;//# sourceMappingURL=tool-proposal-internal.cjs.map | ||
| //# sourceMappingURL=tool-proposal-internal.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/errors.ts","../src/json-validation.ts","../src/primitives.ts","../src/agent-loop.ts","../src/tool-proposal-internal.ts"],"names":["DOCS_BASE","formatError","code","message","hint","docsUrl","lines","AgentsKitError","options","ToolError","ErrorCodes","cloneJsonRecord","input","invalid","maxStringLength","preflight","assertJson","root","active","stack","nodes","item","value","isArray","prototype","array","index","keys","key","descriptor","snapshot","nextId","generateId","prefix","buildMessage","params","auth","fn","call","context","m","pending","withAuthority","controller","proposal","resolve","identifier","existing","calls","operation","invalidArgs","args","tool","validateArgs","onToolCall","authorize","validation","error","current"],"mappings":"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","file":"tool-proposal-internal.cjs","sourcesContent":["// ---------------------------------------------------------------------------\n// AgentsKit didactic error system — Rust-compiler-style helpful errors\n// ---------------------------------------------------------------------------\n\nconst DOCS_BASE = 'https://www.agentskit.io/docs'\n\n/**\n * Format an error for display, Rust-compiler style.\n *\n * Example output:\n * ```\n * error[AK_ADAPTER_MISSING]: No adapter provided\n * --> Hint: Pass an adapter when creating the chat controller, e.g.\n * createChatController({ adapter: openaiAdapter() })\n * --> Docs: https://www.agentskit.io/docs/adapters\n * ```\n */\nfunction formatError(code: string, message: string, hint?: string, docsUrl?: string): string {\n const lines: string[] = [`error[${code}]: ${message}`]\n if (hint) lines.push(` --> Hint: ${hint}`)\n if (docsUrl) lines.push(` --> Docs: ${docsUrl}`)\n return lines.join('\\n')\n}\n\n// ---------------------------------------------------------------------------\n// Base class\n// ---------------------------------------------------------------------------\n\nexport class AgentsKitError extends Error {\n readonly code: string\n readonly hint: string | undefined\n readonly docsUrl: string | undefined\n readonly cause: unknown\n\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super(options.message)\n this.name = 'AgentsKitError'\n this.code = options.code\n this.hint = options.hint\n this.docsUrl = options.docsUrl\n this.cause = options.cause\n }\n\n override toString(): string {\n return formatError(this.code, this.message, this.hint, this.docsUrl)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Subclasses\n// ---------------------------------------------------------------------------\n\nexport class AdapterError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/adapters`, ...options })\n this.name = 'AdapterError'\n }\n}\n\nexport class ToolError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/tools`, ...options })\n this.name = 'ToolError'\n }\n}\n\nexport class MemoryError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/memory`, ...options })\n this.name = 'MemoryError'\n }\n}\n\nexport class ConfigError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/configuration`, ...options })\n this.name = 'ConfigError'\n }\n}\n\nexport class RuntimeError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/agents/runtime`, ...options })\n this.name = 'RuntimeError'\n }\n}\n\nexport class SandboxError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/production/security/mandatory-sandbox`, ...options })\n this.name = 'SandboxError'\n }\n}\n\nexport class SkillError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/agents/skills`, ...options })\n this.name = 'SkillError'\n }\n}\n\n// ---------------------------------------------------------------------------\n// Error code constants\n// ---------------------------------------------------------------------------\n\nexport const ErrorCodes = {\n // Adapter errors\n AK_ADAPTER_MISSING: 'AK_ADAPTER_MISSING',\n AK_ADAPTER_STREAM_FAILED: 'AK_ADAPTER_STREAM_FAILED',\n\n // Tool errors\n AK_TOOL_NOT_FOUND: 'AK_TOOL_NOT_FOUND',\n AK_TOOL_EXEC_FAILED: 'AK_TOOL_EXEC_FAILED',\n AK_TOOL_PEER_MISSING: 'AK_TOOL_PEER_MISSING',\n AK_TOOL_INVALID_INPUT: 'AK_TOOL_INVALID_INPUT',\n AK_TOOL_QUOTA_EXCEEDED: 'AK_TOOL_QUOTA_EXCEEDED',\n AK_TOOL_FORBIDDEN: 'AK_TOOL_FORBIDDEN',\n\n // Memory errors\n AK_MEMORY_LOAD_FAILED: 'AK_MEMORY_LOAD_FAILED',\n AK_MEMORY_SAVE_FAILED: 'AK_MEMORY_SAVE_FAILED',\n AK_MEMORY_DESERIALIZE_FAILED: 'AK_MEMORY_DESERIALIZE_FAILED',\n AK_MEMORY_PEER_MISSING: 'AK_MEMORY_PEER_MISSING',\n AK_MEMORY_REMOTE_HTTP: 'AK_MEMORY_REMOTE_HTTP',\n\n // Config errors\n AK_CONFIG_INVALID: 'AK_CONFIG_INVALID',\n\n // Runtime errors\n AK_RUNTIME_INVALID_INPUT: 'AK_RUNTIME_INVALID_INPUT',\n AK_RUNTIME_STEP_FAILED: 'AK_RUNTIME_STEP_FAILED',\n AK_RUNTIME_DELEGATE_FAILED: 'AK_RUNTIME_DELEGATE_FAILED',\n\n // Sandbox errors\n AK_SANDBOX_DENIED: 'AK_SANDBOX_DENIED',\n AK_SANDBOX_INVALID_TOOL: 'AK_SANDBOX_INVALID_TOOL',\n AK_SANDBOX_PEER_MISSING: 'AK_SANDBOX_PEER_MISSING',\n AK_SANDBOX_BACKEND_FAILED: 'AK_SANDBOX_BACKEND_FAILED',\n\n // Skill errors\n AK_SKILL_INVALID: 'AK_SKILL_INVALID',\n AK_SKILL_DUPLICATE: 'AK_SKILL_DUPLICATE',\n} as const\n","export function cloneJsonRecord(\n input: unknown,\n invalid: () => never,\n maxStringLength = Infinity,\n preflight = true,\n): Record<string, unknown> {\n const assertJson = (root: unknown): void => {\n const active = new WeakSet<object>()\n const stack: Array<{ value: unknown; depth: number; exit?: boolean }> = [{ value: root, depth: 0 }]\n let nodes = 0\n while (stack.length > 0) {\n const item = stack.pop()!\n const value = item.value\n if (item.exit) { active.delete(value as object); continue }\n if (++nodes > 10_000 || item.depth > 32) invalid()\n if (value === null || typeof value === 'boolean') continue\n if (typeof value === 'string') { if (value.length > maxStringLength) invalid(); continue }\n if (typeof value === 'number') { if (!Number.isFinite(value)) invalid(); continue }\n if (typeof value !== 'object') invalid()\n const isArray = Array.isArray(value)\n const prototype = isArray ? Array.prototype : Object.getPrototypeOf(value) as unknown\n if (!isArray && prototype !== Object.prototype && prototype !== null) invalid()\n if (active.has(value)) invalid()\n active.add(value)\n stack.push({ value, depth: item.depth, exit: true })\n if (isArray) {\n const array = value as unknown[]\n if (array.length > 10_000) invalid()\n for (let index = array.length - 1; index >= 0; index--) {\n stack.push({ value: array[index], depth: item.depth + 1 })\n }\n continue\n }\n const keys = Object.keys(value)\n if (keys.length > 10_000) invalid()\n for (let index = keys.length - 1; index >= 0; index--) {\n const key = keys[index]!\n if (key.length > 256) invalid()\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n if (!descriptor || descriptor.get || descriptor.set) invalid()\n stack.push({ value: descriptor.value, depth: item.depth + 1 })\n }\n }\n }\n try {\n if (preflight) assertJson(input)\n const snapshot = structuredClone(input) as unknown\n assertJson(snapshot)\n if (typeof snapshot !== 'object' || snapshot === null || Array.isArray(snapshot)) invalid()\n return snapshot as Record<string, unknown>\n } catch {\n return invalid()\n }\n}\n","import { AdapterError, AgentsKitError, ErrorCodes } from './errors'\nimport type {\n AgentEvent,\n Message,\n MessageRole,\n MessageStatus,\n Observer,\n StreamChunk,\n StreamSource,\n ToolDefinition,\n ToolExecutionContext,\n} from './types'\nimport type { TokenUsage } from './types/stream'\n\nlet nextId = 0\n\nexport function generateId(prefix: string): string {\n return `${prefix}-${Date.now()}-${nextId++}`\n}\n\nexport function createEventEmitter() {\n const observers = new Set<Observer>()\n\n return {\n addObserver(observer: Observer): () => void {\n observers.add(observer)\n return () => { observers.delete(observer) }\n },\n emit(event: AgentEvent): void {\n for (const observer of observers) {\n try {\n const result = observer.on(event)\n if (result && typeof (result as Promise<void>).catch === 'function') {\n (result as Promise<void>).catch(() => {})\n }\n } catch {\n // Observer errors must never break the main loop.\n }\n }\n },\n }\n}\n\nexport function buildMessage(params: {\n role: MessageRole\n content: string\n status?: MessageStatus\n metadata?: Record<string, unknown>\n toolCallId?: string\n}): Message {\n return {\n id: generateId('msg'),\n role: params.role,\n content: params.content,\n status: params.status ?? 'complete',\n metadata: params.metadata,\n toolCallId: params.toolCallId,\n createdAt: new Date(),\n }\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof value === 'object' && Symbol.asyncIterator in value\n}\n\nexport async function executeToolCall(\n tool: ToolDefinition,\n args: Record<string, unknown>,\n context: ToolExecutionContext,\n onPartialResult?: (accumulated: string) => void,\n): Promise<string> {\n const raw = tool.execute?.(args, context)\n\n if (isAsyncIterable(raw)) {\n let accumulated = ''\n for await (const chunk of raw) {\n accumulated += String(chunk)\n onPartialResult?.(accumulated)\n }\n return accumulated\n }\n\n const result = await raw\n return result == null ? '' : String(result)\n}\n\nexport function safeParseArgs(args: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(args)\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {}\n } catch {\n return {}\n }\n}\n\nexport function createToolLifecycle(tools: Map<string, ToolDefinition>) {\n const initialized = new Set<string>()\n\n return {\n async init(tool: ToolDefinition): Promise<void> {\n if (tool.init && !initialized.has(tool.name)) {\n await tool.init()\n initialized.add(tool.name)\n }\n },\n async disposeAll(): Promise<void> {\n for (const name of initialized) {\n try {\n await tools.get(name)?.dispose?.()\n } catch {\n // Dispose errors should not propagate.\n }\n }\n initialized.clear()\n },\n }\n}\n\nexport interface ConsumeStreamHandlers {\n onText?: (accumulated: string) => void\n onReasoning?: (accumulated: string) => void\n onToolCall?: (chunk: StreamChunk) => Promise<void> | void\n onToolResult?: (content: string) => void\n onUsage?: (usage: TokenUsage) => void\n onError?: (error: Error) => void\n onDone: (accumulatedText: string) => void\n}\n\nexport async function consumeStream(\n source: StreamSource,\n handlers: ConsumeStreamHandlers,\n): Promise<void> {\n let accumulatedText = ''\n let accumulatedReasoning = ''\n\n try {\n const iterator = source.stream()\n for await (const chunk of iterator) {\n if (chunk.type === 'text' && chunk.content) {\n accumulatedText += chunk.content\n handlers.onText?.(accumulatedText)\n } else if (chunk.type === 'reasoning' && chunk.content) {\n accumulatedReasoning += chunk.content\n handlers.onReasoning?.(accumulatedReasoning)\n } else if (chunk.type === 'tool_call') {\n await handlers.onToolCall?.(chunk)\n } else if (chunk.type === 'tool_result' && chunk.content) {\n handlers.onToolResult?.(chunk.content)\n } else if (chunk.type === 'usage' && chunk.usage) {\n handlers.onUsage?.(chunk.usage)\n } else if (chunk.type === 'error') {\n handlers.onError?.(new AdapterError({\n code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message: chunk.content ?? 'Stream error',\n hint: 'Key/network/model/provider',\n }))\n return\n } else if (chunk.type === 'done') {\n break\n }\n }\n handlers.onDone(accumulatedText)\n } catch (error) {\n const err = error instanceof AgentsKitError\n ? error\n : new AdapterError({\n code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message: `Stream failed: ${error instanceof Error ? error.message : String(error)}`,\n hint: 'Adapter/provider',\n cause: error,\n })\n handlers.onError?.(err)\n }\n}\n","import { ToolError, ErrorCodes } from './errors'\nimport { executeToolCall, createToolLifecycle, createEventEmitter } from './primitives'\nimport type {\n ArgsValidator,\n MaybePromise,\n SkillDefinition,\n ToolCall,\n ToolAuthorizationContext,\n ToolAuthorizer,\n ToolDefinition,\n ToolExecutionContext,\n} from './types'\n\n// --- buildToolMap ---\n\nexport function buildToolMap(\n ...sources: Array<ToolDefinition[] | undefined>\n): Map<string, ToolDefinition> {\n const map = new Map<string, ToolDefinition>()\n for (const source of sources) {\n if (!source) continue\n for (const tool of source) map.set(tool.name, tool)\n }\n return map\n}\n\n// --- activateSkills ---\n\nexport interface ActivateSkillsResult {\n systemPrompt: string | undefined\n skillTools: ToolDefinition[]\n}\n\nexport async function activateSkills(\n skills: SkillDefinition[],\n prompt?: string,\n): Promise<ActivateSkillsResult> {\n if (skills.length === 0) {\n return { systemPrompt: prompt, skillTools: [] }\n }\n\n const prompts = skills.map(s => `--- ${s.name} ---\\n${s.systemPrompt}`)\n const base = prompt ? `${prompt}\\n\\n` : ''\n const system = `${base}${prompts.join('\\n\\n')}`\n\n const tools: ToolDefinition[] = []\n for (const skill of skills) {\n if (skill.onActivate) {\n const a = await skill.onActivate()\n tools.push(...(a.tools ?? []))\n }\n }\n\n return { systemPrompt: system, skillTools: tools }\n}\n\n// --- executeSafeTool ---\n\nexport interface ToolExecResult {\n status: 'complete' | 'error' | 'skipped'\n result?: string\n error?: string\n durationMs: number\n}\n\nexport interface ExecuteSafeToolOptions {\n tool: ToolDefinition | undefined\n toolCall: ToolCall\n context: ToolExecutionContext\n emitter: ReturnType<typeof createEventEmitter>\n lifecycle: ReturnType<typeof createToolLifecycle>\n onPartial?: (result: string) => void\n onConfirm?: (toolCall: ToolCall) => MaybePromise<boolean>\n /** Opt-in arg validation against `tool.schema` (ADR-0008). */\n validate?: ArgsValidator\n authorize?: ToolAuthorizer\n}\n\nexport async function auth(fn: ToolAuthorizer | undefined, call: ToolCall, context: ToolAuthorizationContext): Promise<void> {\n if (!fn) return\n await import('./tool-authorization-internal.js').then(m => m.authorize(fn, call, context))\n}\n\n\nexport async function executeSafeTool(\n options: ExecuteSafeToolOptions,\n): Promise<ToolExecResult> {\n const { tool, toolCall, context, emitter, lifecycle, onPartial, onConfirm, validate, authorize } = options\n const began = Date.now()\n\n // Missing tool\n if (!tool?.execute) {\n const err = new ToolError({\n code: ErrorCodes.AK_TOOL_NOT_FOUND,\n message: `Tool \"${toolCall.name}\" not found or has no execute function`,\n hint: 'Register an executable tool in ChatConfig, e.g. { tools: [myTool] }.',\n })\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n\n if (validate && tool.schema) {\n const v = validate(tool.schema, toolCall.args)\n if (!v.valid) {\n const err = new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: v.message ?? `Tool \"${toolCall.name}\" received invalid arguments`,\n })\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n }\n\n // Requires confirmation — refuse by default when no approver is configured (RT6)\n if (tool.requiresConfirmation) {\n if (!onConfirm) {\n return {\n status: 'skipped',\n result: 'No confirmation handler',\n durationMs: Date.now() - began,\n }\n }\n const confirmed = await onConfirm(toolCall)\n if (!confirmed) {\n return { status: 'skipped', result: 'Tool execution declined by confirmation handler', durationMs: Date.now() - began }\n }\n }\n\n try {\n await auth(authorize, toolCall, { ...context, tool, phase: 'execute' })\n } catch (error) {\n const err = error as ToolError\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n\n await lifecycle.init(tool)\n\n emitter.emit({ type: 'tool:start', name: toolCall.name, args: toolCall.args })\n\n try {\n const result = await executeToolCall(\n tool,\n toolCall.args,\n context,\n onPartial,\n )\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result,\n durationMs: Date.now() - began,\n })\n return { status: 'complete', result, durationMs: Date.now() - began }\n } catch (error) {\n const err = error instanceof ToolError\n ? error\n : new ToolError({\n code: ErrorCodes.AK_TOOL_EXEC_FAILED,\n message: `Tool \"${toolCall.name}\" threw during execution: ${error instanceof Error ? error.message : String(error)}`,\n hint: 'Check the tool execute() implementation.',\n cause: error,\n })\n // Emit error before tool:end so trackers can mark the active tool span.\n emitter.emit({ type: 'error', error: err })\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result: `Error: ${err.message}`,\n durationMs: Date.now() - began,\n })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n}\n","import { ErrorCodes, ToolError } from './errors'\nimport { cloneJsonRecord } from './json-validation'\nimport { buildMessage } from './primitives'\nimport { auth } from './agent-loop'\nimport type { ArgsValidator, ChatController, MaybePromise, ToolAuthorizer, ToolCall, ToolCallHandlerContext, ToolDefinition } from './types'\n\ntype Proposal = Pick<ToolCall, 'id' | 'name' | 'args'>\ntype Authority = readonly [\n ToolDefinition | undefined,\n ArgsValidator | undefined,\n ((toolCall: ToolCall, context: ToolCallHandlerContext) => MaybePromise<void>) | undefined,\n ToolAuthorizer | undefined,\n]\nconst pending = new WeakMap<ChatController, Map<string, Promise<ToolCall>>>()\n\nexport async function withAuthority(\n controller: ChatController,\n proposal: Proposal,\n resolve: (name: string) => Authority,\n): Promise<ToolCall> {\n const identifier = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/\n if (!identifier.test(proposal.id)) {\n throw new ToolError({ code: ErrorCodes.AK_TOOL_INVALID_INPUT, message: 'Invalid tool proposal identity' })\n }\n for (const message of controller.getState().messages) {\n const existing = message.toolCalls?.find(call => call.id === proposal.id)\n if (existing) return existing\n }\n let calls = pending.get(controller)\n if (!calls) { calls = new Map(); pending.set(controller, calls) }\n const active = calls.get(proposal.id)\n if (active) return active\n const operation = (async () => {\n if (!identifier.test(proposal.name)) {\n throw new ToolError({ code: ErrorCodes.AK_TOOL_INVALID_INPUT, message: 'Invalid tool proposal identity' })\n }\n const invalidArgs = (): never => {\n throw new ToolError({ code: ErrorCodes.AK_TOOL_INVALID_INPUT, message: 'Invalid tool proposal arguments' })\n }\n const args = cloneJsonRecord(proposal.args, invalidArgs, 16_384)\n const [tool, validateArgs, onToolCall, authorize] = resolve(proposal.name)\n if (!tool?.requiresConfirmation || !tool.execute) {\n throw new ToolError({\n code: tool ? ErrorCodes.AK_CONFIG_INVALID : ErrorCodes.AK_TOOL_NOT_FOUND,\n message: 'Tool is not registered for confirmation',\n })\n }\n if (validateArgs && tool.schema) {\n const validation = validateArgs(tool.schema, args)\n if (!validation.valid) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: validation.message ?? 'Invalid tool arguments',\n })\n }\n }\n const call: ToolCall = { ...proposal, args, status: 'requires_confirmation' }\n await auth(authorize, call, { messages: controller.getState().messages, tool, phase: 'propose' })\n const message = { ...buildMessage({ role: 'assistant', content: '' }), toolCalls: [call] }\n controller.setMessages([...controller.getState().messages, message])\n try {\n await onToolCall?.(call, { messages: controller.getState().messages, tool })\n } catch (error) {\n controller.setMessages(controller.getState().messages.map(current => current.id !== message.id ? current : {\n ...current,\n toolCalls: current.toolCalls?.map(existing => existing.id !== call.id ? existing : {\n ...existing,\n status: 'error',\n error: error instanceof Error ? error.message : 'Tool proposal rejected',\n }),\n }))\n throw error\n }\n return call\n })()\n calls.set(proposal.id, operation)\n try { return await operation } finally { calls.delete(proposal.id) }\n}\n"]} | ||
| {"version":3,"sources":["../src/errors.ts","../src/json-validation.ts","../src/primitives.ts","../src/agent-loop.ts","../src/tool-proposal-internal.ts"],"names":["DOCS_BASE","formatError","code","message","hint","docsUrl","lines","AgentsKitError","options","ToolError","ErrorCodes","cloneJsonRecord","input","invalid","maxStringLength","preflight","assertJson","root","active","stack","nodes","item","value","isArray","prototype","array","index","keys","key","descriptor","snapshot","nextId","generateId","prefix","buildMessage","params","auth","fn","call","context","m","pending","withAuthority","controller","proposal","resolve","identifier","existing","calls","operation","invalidArgs","args","tool","validateArgs","onToolCall","authorize","validation","error","current"],"mappings":"aAIA,IAAMA,CAAAA,CAAY,+BAAA,CAalB,SAASC,CAAAA,CAAYC,EAAcC,CAAAA,CAAiBC,CAAAA,CAAeC,CAAAA,CAA0B,CAC3F,IAAMC,CAAAA,CAAkB,CAAC,CAAA,MAAA,EAASJ,CAAI,MAAMC,CAAO,CAAA,CAAE,CAAA,CACrD,OAAIC,CAAAA,EAAME,CAAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAeF,CAAI,CAAA,CAAE,CAAA,CACtCC,CAAAA,EAASC,CAAAA,CAAM,KAAK,CAAA,YAAA,EAAeD,CAAO,CAAA,CAAE,CAAA,CACzCC,EAAM,IAAA,CAAK;AAAA,CAAI,CACxB,CAMO,IAAMC,CAAAA,CAAN,cAA6B,KAAM,CAMxC,YAAYC,CAAAA,CAMT,CACD,MAAMA,CAAAA,CAAQ,OAAO,EACrB,IAAA,CAAK,IAAA,CAAO,iBACZ,IAAA,CAAK,IAAA,CAAOA,EAAQ,IAAA,CACpB,IAAA,CAAK,KAAOA,CAAAA,CAAQ,IAAA,CACpB,KAAK,OAAA,CAAUA,CAAAA,CAAQ,QACvB,IAAA,CAAK,KAAA,CAAQA,EAAQ,MACvB,CAES,UAAmB,CAC1B,OAAOP,EAAY,IAAA,CAAK,IAAA,CAAM,KAAK,OAAA,CAAS,IAAA,CAAK,IAAA,CAAM,IAAA,CAAK,OAAO,CACrE,CACF,CAAA,CAmBO,IAAMQ,EAAN,cAAwBF,CAAe,CAC5C,WAAA,CAAYC,CAAAA,CAMT,CACD,KAAA,CAAM,CAAE,QAAS,CAAA,EAAGR,CAAS,SAAU,GAAGQ,CAAQ,CAAC,CAAA,CACnD,IAAA,CAAK,KAAO,YACd,CACF,EAuEO,IAAME,CAAAA,CAAa,CAMxB,iBAAA,CAAmB,oBAGnB,qBAAA,CAAuB,wBAYvB,iBAAA,CAAmB,mBAgBrB,CAAA,CC9LO,SAASC,EACdC,CAAAA,CACAC,CAAAA,CACAC,EAAkB,CAAA,CAAA,CAAA,CAClBC,CAAAA,CAAY,KACa,CACzB,IAAMC,EAAcC,CAAAA,EAAwB,CAC1C,IAAMC,CAAAA,CAAS,IAAI,QACbC,CAAAA,CAAkE,CAAC,CAAE,KAAA,CAAOF,CAAAA,CAAM,KAAA,CAAO,CAAE,CAAC,CAAA,CAC9FG,EAAQ,CAAA,CACZ,KAAOD,EAAM,MAAA,CAAS,CAAA,EAAG,CACvB,IAAME,CAAAA,CAAOF,EAAM,GAAA,EAAI,CACjBG,EAAQD,CAAAA,CAAK,KAAA,CACnB,GAAIA,CAAAA,CAAK,IAAA,CAAM,CAAEH,CAAAA,CAAO,MAAA,CAAOI,CAAe,EAAG,QAAS,CAE1D,IADI,EAAEF,CAAAA,CAAQ,KAAUC,CAAAA,CAAK,KAAA,CAAQ,KAAIR,CAAAA,EAAQ,CAC7CS,IAAU,IAAA,EAAQ,OAAOA,GAAU,SAAA,CAAW,SAClD,GAAI,OAAOA,CAAAA,EAAU,QAAA,CAAU,CAAMA,CAAAA,CAAM,MAAA,CAASR,GAAiBD,CAAAA,EAAQ,CAAG,QAAS,CACzF,GAAI,OAAOS,CAAAA,EAAU,QAAA,CAAU,CAAO,MAAA,CAAO,QAAA,CAASA,CAAK,CAAA,EAAGT,CAAAA,GAAW,QAAS,CAC9E,OAAOS,CAAAA,EAAU,QAAA,EAAUT,GAAQ,CACvC,IAAMU,EAAU,KAAA,CAAM,OAAA,CAAQD,CAAK,CAAA,CAC7BE,CAAAA,CAAYD,EAAU,KAAA,CAAM,SAAA,CAAY,OAAO,cAAA,CAAeD,CAAK,EAKzE,GAJI,CAACC,GAAWC,CAAAA,GAAc,MAAA,CAAO,WAAaA,CAAAA,GAAc,IAAA,EAAMX,CAAAA,EAAQ,CAC1EK,CAAAA,CAAO,GAAA,CAAII,CAAK,CAAA,EAAGT,CAAAA,GACvBK,CAAAA,CAAO,GAAA,CAAII,CAAK,CAAA,CAChBH,CAAAA,CAAM,KAAK,CAAE,KAAA,CAAAG,EAAO,KAAA,CAAOD,CAAAA,CAAK,MAAO,IAAA,CAAM,IAAK,CAAC,CAAA,CAC/CE,CAAAA,CAAS,CACX,IAAME,CAAAA,CAAQH,CAAAA,CACVG,EAAM,MAAA,CAAS,GAAA,EAAQZ,GAAQ,CACnC,IAAA,IAASa,EAAQD,CAAAA,CAAM,MAAA,CAAS,EAAGC,CAAAA,EAAS,CAAA,CAAGA,IAC7CP,CAAAA,CAAM,IAAA,CAAK,CAAE,KAAA,CAAOM,CAAAA,CAAMC,CAAK,CAAA,CAAG,KAAA,CAAOL,CAAAA,CAAK,KAAA,CAAQ,CAAE,CAAC,EAE3D,QACF,CACA,IAAMM,CAAAA,CAAO,MAAA,CAAO,KAAKL,CAAK,CAAA,CAC1BK,EAAK,MAAA,CAAS,GAAA,EAAQd,GAAQ,CAClC,IAAA,IAASa,EAAQC,CAAAA,CAAK,MAAA,CAAS,EAAGD,CAAAA,EAAS,CAAA,CAAGA,IAAS,CACrD,IAAME,EAAMD,CAAAA,CAAKD,CAAK,EAClBE,CAAAA,CAAI,MAAA,CAAS,KAAKf,CAAAA,EAAQ,CAC9B,IAAMgB,CAAAA,CAAa,MAAA,CAAO,yBAAyBP,CAAAA,CAAOM,CAAG,GACzD,CAACC,CAAAA,EAAcA,EAAW,GAAA,EAAOA,CAAAA,CAAW,GAAA,GAAKhB,CAAAA,EAAQ,CAC7DM,CAAAA,CAAM,KAAK,CAAE,KAAA,CAAOU,EAAW,KAAA,CAAO,KAAA,CAAOR,EAAK,KAAA,CAAQ,CAAE,CAAC,EAC/D,CACF,CACF,CAAA,CACA,GAAI,CACEN,CAAAA,EAAWC,CAAAA,CAAWJ,CAAK,CAAA,CAC/B,IAAMkB,CAAAA,CAAW,eAAA,CAAgBlB,CAAK,CAAA,CACtC,OAAAI,CAAAA,CAAWc,CAAQ,GACf,OAAOA,CAAAA,EAAa,UAAYA,CAAAA,GAAa,IAAA,EAAQ,MAAM,OAAA,CAAQA,CAAQ,IAAGjB,CAAAA,EAAQ,CACnFiB,CACT,CAAA,KAAQ,CACN,OAAOjB,CAAAA,EACT,CACF,CCvCA,IAAIkB,CAAAA,CAAS,EAEN,SAASC,CAAAA,CAAWC,EAAwB,CACjD,OAAO,GAAGA,CAAM,CAAA,CAAA,EAAI,KAAK,GAAA,EAAK,IAAIF,CAAAA,EAAQ,CAAA,CAC5C,CAyBO,SAASG,CAAAA,CAAaC,EAMjB,CACV,OAAO,CACL,EAAA,CAAIH,CAAAA,CAAW,KAAK,CAAA,CACpB,IAAA,CAAMG,EAAO,IAAA,CACb,OAAA,CAASA,EAAO,OAAA,CAChB,MAAA,CAAQA,EAAO,MAAA,EAAU,UAAA,CACzB,SAAUA,CAAAA,CAAO,QAAA,CACjB,WAAYA,CAAAA,CAAO,UAAA,CACnB,UAAW,IAAI,IACjB,CACF,CCmBA,eAAsBC,CAAAA,CAAKC,EAAgCC,CAAAA,CAAgBC,CAAAA,CAAkD,CACtHF,CAAAA,EACL,aAAa,kCAAkC,CAAA,CAAE,KAAKG,CAAAA,EAAKA,CAAAA,CAAE,UAAUH,CAAAA,CAAIC,CAAAA,CAAMC,CAAO,CAAC,EAC3F,CCpEA,IAAME,CAAAA,CAAU,IAAI,OAAA,CAEpB,eAAsBC,EACpBC,CAAAA,CACAC,CAAAA,CACAC,EACmB,CACnB,IAAMC,EAAa,qCAAA,CACnB,GAAI,CAACA,CAAAA,CAAW,IAAA,CAAKF,EAAS,EAAE,CAAA,CAC9B,MAAM,IAAInC,CAAAA,CAAU,CAAE,IAAA,CAAMC,CAAAA,CAAW,qBAAA,CAAuB,OAAA,CAAS,gCAAiC,CAAC,EAE3G,IAAA,IAAWP,CAAAA,IAAWwC,EAAW,QAAA,EAAS,CAAE,SAAU,CACpD,IAAMI,EAAW5C,CAAAA,CAAQ,SAAA,EAAW,KAAKmC,CAAAA,EAAQA,CAAAA,CAAK,KAAOM,CAAAA,CAAS,EAAE,EACxE,GAAIG,CAAAA,CAAU,OAAOA,CACvB,CACA,IAAIC,CAAAA,CAAQP,CAAAA,CAAQ,IAAIE,CAAU,CAAA,CAC7BK,IAASA,CAAAA,CAAQ,IAAI,IAAOP,CAAAA,CAAQ,GAAA,CAAIE,EAAYK,CAAK,CAAA,CAAA,CAC9D,IAAM9B,CAAAA,CAAS8B,CAAAA,CAAM,IAAIJ,CAAAA,CAAS,EAAE,CAAA,CACpC,GAAI1B,CAAAA,CAAQ,OAAOA,EACnB,IAAM+B,CAAAA,CAAAA,CAAa,SAAY,CAC/B,GAAI,CAACH,CAAAA,CAAW,IAAA,CAAKF,EAAS,IAAI,CAAA,CAChC,MAAM,IAAInC,CAAAA,CAAU,CAAE,IAAA,CAAMC,CAAAA,CAAW,sBAAuB,OAAA,CAAS,gCAAiC,CAAC,CAAA,CAE3G,IAAMwC,CAAAA,CAAc,IAAa,CAC/B,MAAM,IAAIzC,CAAAA,CAAU,CAAE,KAAMC,CAAAA,CAAW,qBAAA,CAAuB,QAAS,iCAAkC,CAAC,CAC5G,CAAA,CACMyC,CAAAA,CAAOxC,EAAgBiC,CAAAA,CAAS,IAAA,CAAMM,EAAa,KAAM,CAAA,CACzD,CAACE,CAAAA,CAAMC,CAAAA,CAAcC,CAAAA,CAAYC,CAAS,CAAA,CAAIV,CAAAA,CAAQD,EAAS,IAAI,CAAA,CACzE,GAAI,CAACQ,CAAAA,EAAM,sBAAwB,CAACA,CAAAA,CAAK,QACvC,MAAM,IAAI3C,EAAU,CAClB,IAAA,CAAM2C,EAAO1C,CAAAA,CAAW,iBAAA,CAAoBA,EAAW,iBAAA,CACvD,OAAA,CAAS,yCACX,CAAC,CAAA,CAEH,GAAI2C,CAAAA,EAAgBD,CAAAA,CAAK,OAAQ,CAC/B,IAAMI,EAAaH,CAAAA,CAAaD,CAAAA,CAAK,OAAQD,CAAI,CAAA,CACjD,GAAI,CAACK,CAAAA,CAAW,MACd,MAAM,IAAI/C,CAAAA,CAAU,CAClB,IAAA,CAAMC,CAAAA,CAAW,sBACjB,OAAA,CAAS8C,CAAAA,CAAW,SAAW,wBACjC,CAAC,CAEL,CACA,IAAMlB,EAAiB,CAAE,GAAGM,EAAU,IAAA,CAAAO,CAAAA,CAAM,OAAQ,uBAAwB,CAAA,CAC5E,MAAMf,CAAAA,CAAKmB,CAAAA,CAAWjB,CAAAA,CAAM,CAAE,QAAA,CAAUK,CAAAA,CAAW,UAAS,CAAE,QAAA,CAAU,KAAAS,CAAAA,CAAM,KAAA,CAAO,SAAU,CAAC,CAAA,CAChG,IAAMjD,CAAAA,CAAU,CAAE,GAAG+B,CAAAA,CAAa,CAAE,KAAM,WAAA,CAAa,OAAA,CAAS,EAAG,CAAC,CAAA,CAAG,SAAA,CAAW,CAACI,CAAI,CAAE,EACzFK,CAAAA,CAAW,WAAA,CAAY,CAAC,GAAGA,CAAAA,CAAW,UAAS,CAAE,QAAA,CAAUxC,CAAO,CAAC,CAAA,CACnE,GAAI,CACF,MAAMmD,IAAahB,CAAAA,CAAM,CAAE,SAAUK,CAAAA,CAAW,QAAA,GAAW,QAAA,CAAU,IAAA,CAAAS,CAAK,CAAC,EAC7E,OAASK,CAAAA,CAAO,CACd,MAAAd,CAAAA,CAAW,WAAA,CAAYA,EAAW,QAAA,EAAS,CAAE,SAAS,GAAA,CAAIe,CAAAA,EAAWA,EAAQ,EAAA,GAAOvD,CAAAA,CAAQ,GAAKuD,CAAAA,CAAU,CACzG,GAAGA,CAAAA,CACH,SAAA,CAAWA,CAAAA,CAAQ,WAAW,GAAA,CAAIX,CAAAA,EAAYA,EAAS,EAAA,GAAOT,CAAAA,CAAK,GAAKS,CAAAA,CAAW,CACjF,GAAGA,CAAAA,CACH,MAAA,CAAQ,QACR,KAAA,CAAOU,CAAAA,YAAiB,MAAQA,CAAAA,CAAM,OAAA,CAAU,wBAClD,CAAC,CACH,CAAC,CAAC,CAAA,CACIA,CACR,CACA,OAAOnB,CACP,IAAG,CACHU,CAAAA,CAAM,IAAIJ,CAAAA,CAAS,EAAA,CAAIK,CAAS,CAAA,CAChC,GAAI,CAAE,OAAO,MAAMA,CAAU,CAAA,OAAE,CAAUD,EAAM,MAAA,CAAOJ,CAAAA,CAAS,EAAE,EAAE,CACrE","file":"tool-proposal-internal.cjs","sourcesContent":["// ---------------------------------------------------------------------------\n// AgentsKit didactic error system — Rust-compiler-style helpful errors\n// ---------------------------------------------------------------------------\n\nconst DOCS_BASE = 'https://www.agentskit.io/docs'\n\n/**\n * Format an error for display, Rust-compiler style.\n *\n * Example output:\n * ```\n * error[AK_ADAPTER_MISSING]: No adapter provided\n * --> Hint: Pass an adapter when creating the chat controller, e.g.\n * createChatController({ adapter: openaiAdapter() })\n * --> Docs: https://www.agentskit.io/docs/adapters\n * ```\n */\nfunction formatError(code: string, message: string, hint?: string, docsUrl?: string): string {\n const lines: string[] = [`error[${code}]: ${message}`]\n if (hint) lines.push(` --> Hint: ${hint}`)\n if (docsUrl) lines.push(` --> Docs: ${docsUrl}`)\n return lines.join('\\n')\n}\n\n// ---------------------------------------------------------------------------\n// Base class\n// ---------------------------------------------------------------------------\n\nexport class AgentsKitError extends Error {\n readonly code: string\n readonly hint: string | undefined\n readonly docsUrl: string | undefined\n readonly cause: unknown\n\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super(options.message)\n this.name = 'AgentsKitError'\n this.code = options.code\n this.hint = options.hint\n this.docsUrl = options.docsUrl\n this.cause = options.cause\n }\n\n override toString(): string {\n return formatError(this.code, this.message, this.hint, this.docsUrl)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Subclasses\n// ---------------------------------------------------------------------------\n\nexport class AdapterError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/adapters`, ...options })\n this.name = 'AdapterError'\n }\n}\n\nexport class ToolError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/tools`, ...options })\n this.name = 'ToolError'\n }\n}\n\nexport class MemoryError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/memory`, ...options })\n this.name = 'MemoryError'\n }\n}\n\nexport class ConfigError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/configuration`, ...options })\n this.name = 'ConfigError'\n }\n}\n\nexport class RuntimeError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/agents/runtime`, ...options })\n this.name = 'RuntimeError'\n }\n}\n\nexport class SandboxError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/production/security/mandatory-sandbox`, ...options })\n this.name = 'SandboxError'\n }\n}\n\nexport class SkillError extends AgentsKitError {\n constructor(options: {\n code: string\n message: string\n hint?: string\n docsUrl?: string\n cause?: unknown\n }) {\n super({ docsUrl: `${DOCS_BASE}/agents/skills`, ...options })\n this.name = 'SkillError'\n }\n}\n\n// ---------------------------------------------------------------------------\n// Error code constants\n// ---------------------------------------------------------------------------\n\nexport const ErrorCodes = {\n // Adapter errors\n AK_ADAPTER_MISSING: 'AK_ADAPTER_MISSING',\n AK_ADAPTER_STREAM_FAILED: 'AK_ADAPTER_STREAM_FAILED',\n\n // Tool errors\n AK_TOOL_NOT_FOUND: 'AK_TOOL_NOT_FOUND',\n AK_TOOL_EXEC_FAILED: 'AK_TOOL_EXEC_FAILED',\n AK_TOOL_PEER_MISSING: 'AK_TOOL_PEER_MISSING',\n AK_TOOL_INVALID_INPUT: 'AK_TOOL_INVALID_INPUT',\n AK_TOOL_QUOTA_EXCEEDED: 'AK_TOOL_QUOTA_EXCEEDED',\n AK_TOOL_FORBIDDEN: 'AK_TOOL_FORBIDDEN',\n\n // Memory errors\n AK_MEMORY_LOAD_FAILED: 'AK_MEMORY_LOAD_FAILED',\n AK_MEMORY_SAVE_FAILED: 'AK_MEMORY_SAVE_FAILED',\n AK_MEMORY_DESERIALIZE_FAILED: 'AK_MEMORY_DESERIALIZE_FAILED',\n AK_MEMORY_PEER_MISSING: 'AK_MEMORY_PEER_MISSING',\n AK_MEMORY_REMOTE_HTTP: 'AK_MEMORY_REMOTE_HTTP',\n\n // Config errors\n AK_CONFIG_INVALID: 'AK_CONFIG_INVALID',\n\n // Runtime errors\n AK_RUNTIME_INVALID_INPUT: 'AK_RUNTIME_INVALID_INPUT',\n AK_RUNTIME_STEP_FAILED: 'AK_RUNTIME_STEP_FAILED',\n AK_RUNTIME_DELEGATE_FAILED: 'AK_RUNTIME_DELEGATE_FAILED',\n\n // Sandbox errors\n AK_SANDBOX_DENIED: 'AK_SANDBOX_DENIED',\n AK_SANDBOX_INVALID_TOOL: 'AK_SANDBOX_INVALID_TOOL',\n AK_SANDBOX_PEER_MISSING: 'AK_SANDBOX_PEER_MISSING',\n AK_SANDBOX_BACKEND_FAILED: 'AK_SANDBOX_BACKEND_FAILED',\n\n // Skill errors\n AK_SKILL_INVALID: 'AK_SKILL_INVALID',\n AK_SKILL_DUPLICATE: 'AK_SKILL_DUPLICATE',\n} as const\n","export function cloneJsonRecord(\n input: unknown,\n invalid: () => never,\n maxStringLength = Infinity,\n preflight = true,\n): Record<string, unknown> {\n const assertJson = (root: unknown): void => {\n const active = new WeakSet<object>()\n const stack: Array<{ value: unknown; depth: number; exit?: boolean }> = [{ value: root, depth: 0 }]\n let nodes = 0\n while (stack.length > 0) {\n const item = stack.pop()!\n const value = item.value\n if (item.exit) { active.delete(value as object); continue }\n if (++nodes > 10_000 || item.depth > 32) invalid()\n if (value === null || typeof value === 'boolean') continue\n if (typeof value === 'string') { if (value.length > maxStringLength) invalid(); continue }\n if (typeof value === 'number') { if (!Number.isFinite(value)) invalid(); continue }\n if (typeof value !== 'object') invalid()\n const isArray = Array.isArray(value)\n const prototype = isArray ? Array.prototype : Object.getPrototypeOf(value) as unknown\n if (!isArray && prototype !== Object.prototype && prototype !== null) invalid()\n if (active.has(value)) invalid()\n active.add(value)\n stack.push({ value, depth: item.depth, exit: true })\n if (isArray) {\n const array = value as unknown[]\n if (array.length > 10_000) invalid()\n for (let index = array.length - 1; index >= 0; index--) {\n stack.push({ value: array[index], depth: item.depth + 1 })\n }\n continue\n }\n const keys = Object.keys(value)\n if (keys.length > 10_000) invalid()\n for (let index = keys.length - 1; index >= 0; index--) {\n const key = keys[index]!\n if (key.length > 256) invalid()\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n if (!descriptor || descriptor.get || descriptor.set) invalid()\n stack.push({ value: descriptor.value, depth: item.depth + 1 })\n }\n }\n }\n try {\n if (preflight) assertJson(input)\n const snapshot = structuredClone(input) as unknown\n assertJson(snapshot)\n if (typeof snapshot !== 'object' || snapshot === null || Array.isArray(snapshot)) invalid()\n return snapshot as Record<string, unknown>\n } catch {\n return invalid()\n }\n}\n","import { AdapterError, AgentsKitError, ErrorCodes } from './errors'\nimport type {\n AgentEvent,\n Message,\n MessageRole,\n MessageStatus,\n Observer,\n StreamChunk,\n StreamSource,\n ToolDefinition,\n ToolExecutionContext,\n} from './types'\nimport type { TokenUsage } from './types/stream'\n\nlet nextId = 0\n\nexport function generateId(prefix: string): string {\n return `${prefix}-${Date.now()}-${nextId++}`\n}\n\nexport function createEventEmitter() {\n const observers = new Set<Observer>()\n\n return {\n addObserver(observer: Observer): () => void {\n observers.add(observer)\n return () => { observers.delete(observer) }\n },\n emit(event: AgentEvent): void {\n for (const observer of observers) {\n try {\n const result = observer.on(event)\n if (result && typeof (result as Promise<void>).catch === 'function') {\n (result as Promise<void>).catch(() => {})\n }\n } catch {\n // Observer errors must never break the main loop.\n }\n }\n },\n }\n}\n\nexport function buildMessage(params: {\n role: MessageRole\n content: string\n status?: MessageStatus\n metadata?: Record<string, unknown>\n toolCallId?: string\n}): Message {\n return {\n id: generateId('msg'),\n role: params.role,\n content: params.content,\n status: params.status ?? 'complete',\n metadata: params.metadata,\n toolCallId: params.toolCallId,\n createdAt: new Date(),\n }\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof value === 'object' && Symbol.asyncIterator in value\n}\n\nfunction serializeToolResult(result: unknown): string {\n if (result == null) return ''\n if (typeof result === 'string' || result instanceof Error) return String(result)\n\n try {\n return JSON.stringify(result) ?? String(result)\n } catch {\n return String(result)\n }\n}\n\nexport async function executeToolCall(\n tool: ToolDefinition,\n args: Record<string, unknown>,\n context: ToolExecutionContext,\n onPartialResult?: (accumulated: string) => void,\n): Promise<string> {\n const raw = tool.execute?.(args, context)\n\n if (isAsyncIterable(raw)) {\n let accumulated = ''\n for await (const chunk of raw) {\n accumulated += String(chunk)\n onPartialResult?.(accumulated)\n }\n return accumulated\n }\n\n const result = await raw\n return serializeToolResult(result)\n}\n\nexport function safeParseArgs(args: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(args)\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {}\n } catch {\n return {}\n }\n}\n\nexport function createToolLifecycle(tools: Map<string, ToolDefinition>) {\n const initialized = new Set<string>()\n\n return {\n async init(tool: ToolDefinition): Promise<void> {\n if (tool.init && !initialized.has(tool.name)) {\n await tool.init()\n initialized.add(tool.name)\n }\n },\n async disposeAll(): Promise<void> {\n for (const name of initialized) {\n try {\n await tools.get(name)?.dispose?.()\n } catch {\n // Dispose errors should not propagate.\n }\n }\n initialized.clear()\n },\n }\n}\n\nexport interface ConsumeStreamHandlers {\n onText?: (accumulated: string) => void\n onReasoning?: (accumulated: string) => void\n onToolCall?: (chunk: StreamChunk) => Promise<void> | void\n onToolResult?: (content: string) => void\n onUsage?: (usage: TokenUsage) => void\n onError?: (error: Error) => void\n onDone: (accumulatedText: string) => void\n}\n\nexport async function consumeStream(\n source: StreamSource,\n handlers: ConsumeStreamHandlers,\n): Promise<void> {\n let accumulatedText = ''\n let accumulatedReasoning = ''\n\n try {\n const iterator = source.stream()\n for await (const chunk of iterator) {\n if (chunk.type === 'text' && chunk.content) {\n accumulatedText += chunk.content\n handlers.onText?.(accumulatedText)\n } else if (chunk.type === 'reasoning' && chunk.content) {\n accumulatedReasoning += chunk.content\n handlers.onReasoning?.(accumulatedReasoning)\n } else if (chunk.type === 'tool_call') {\n await handlers.onToolCall?.(chunk)\n } else if (chunk.type === 'tool_result' && chunk.content) {\n handlers.onToolResult?.(chunk.content)\n } else if (chunk.type === 'usage' && chunk.usage) {\n handlers.onUsage?.(chunk.usage)\n } else if (chunk.type === 'error') {\n handlers.onError?.(new AdapterError({\n code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message: chunk.content ?? 'Stream error',\n hint: 'Key/network/model/provider',\n }))\n return\n } else if (chunk.type === 'done') {\n break\n }\n }\n handlers.onDone(accumulatedText)\n } catch (error) {\n const err = error instanceof AgentsKitError\n ? error\n : new AdapterError({\n code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message: `Stream failed: ${error instanceof Error ? error.message : String(error)}`,\n hint: 'Adapter/provider',\n cause: error,\n })\n handlers.onError?.(err)\n }\n}\n","import { ToolError, ErrorCodes } from './errors'\nimport { executeToolCall, createToolLifecycle, createEventEmitter } from './primitives'\nimport type {\n ArgsValidator,\n MaybePromise,\n SkillDefinition,\n ToolCall,\n ToolAuthorizationContext,\n ToolAuthorizer,\n ToolDefinition,\n ToolExecutionContext,\n} from './types'\n\n// --- buildToolMap ---\n\nexport function buildToolMap(\n ...sources: Array<ToolDefinition[] | undefined>\n): Map<string, ToolDefinition> {\n const map = new Map<string, ToolDefinition>()\n for (const source of sources) {\n if (!source) continue\n for (const tool of source) map.set(tool.name, tool)\n }\n return map\n}\n\n// --- activateSkills ---\n\nexport interface ActivateSkillsResult {\n systemPrompt: string | undefined\n skillTools: ToolDefinition[]\n}\n\nexport async function activateSkills(\n skills: SkillDefinition[],\n prompt?: string,\n): Promise<ActivateSkillsResult> {\n if (skills.length === 0) {\n return { systemPrompt: prompt, skillTools: [] }\n }\n\n const prompts = skills.map(s => `--- ${s.name} ---\\n${s.systemPrompt}`)\n const base = prompt ? `${prompt}\\n\\n` : ''\n const system = `${base}${prompts.join('\\n\\n')}`\n\n const tools: ToolDefinition[] = []\n for (const skill of skills) {\n if (skill.onActivate) {\n const a = await skill.onActivate()\n tools.push(...(a.tools ?? []))\n }\n }\n\n return { systemPrompt: system, skillTools: tools }\n}\n\n// --- executeSafeTool ---\n\nexport interface ToolExecResult {\n status: 'complete' | 'error' | 'skipped'\n result?: string\n error?: string\n durationMs: number\n}\n\nexport interface ExecuteSafeToolOptions {\n tool: ToolDefinition | undefined\n toolCall: ToolCall\n context: ToolExecutionContext\n emitter: ReturnType<typeof createEventEmitter>\n lifecycle: ReturnType<typeof createToolLifecycle>\n onPartial?: (result: string) => void\n onConfirm?: (toolCall: ToolCall) => MaybePromise<boolean>\n /** Opt-in arg validation against `tool.schema` (ADR-0008). */\n validate?: ArgsValidator\n authorize?: ToolAuthorizer\n}\n\nexport async function auth(fn: ToolAuthorizer | undefined, call: ToolCall, context: ToolAuthorizationContext): Promise<void> {\n if (!fn) return\n await import('./tool-authorization-internal.js').then(m => m.authorize(fn, call, context))\n}\n\n\nexport async function executeSafeTool(\n options: ExecuteSafeToolOptions,\n): Promise<ToolExecResult> {\n const { tool, toolCall, context, emitter, lifecycle, onPartial, onConfirm, validate, authorize } = options\n const began = Date.now()\n\n // Missing tool\n if (!tool?.execute) {\n const err = new ToolError({\n code: ErrorCodes.AK_TOOL_NOT_FOUND,\n message: `Tool \"${toolCall.name}\" not found or has no execute function`,\n hint: 'Register an executable tool in ChatConfig, e.g. { tools: [myTool] }.',\n })\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n\n if (validate && tool.schema) {\n const v = validate(tool.schema, toolCall.args)\n if (!v.valid) {\n const err = new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: v.message ?? `Tool \"${toolCall.name}\" received invalid arguments`,\n })\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n }\n\n // Requires confirmation — refuse by default when no approver is configured (RT6)\n if (tool.requiresConfirmation) {\n if (!onConfirm) {\n return {\n status: 'skipped',\n result: 'No confirmation handler',\n durationMs: Date.now() - began,\n }\n }\n const confirmed = await onConfirm(toolCall)\n if (!confirmed) {\n return { status: 'skipped', result: 'Tool execution declined by confirmation handler', durationMs: Date.now() - began }\n }\n }\n\n try {\n await auth(authorize, toolCall, { ...context, tool, phase: 'execute' })\n } catch (error) {\n const err = error as ToolError\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n\n await lifecycle.init(tool)\n\n emitter.emit({ type: 'tool:start', name: toolCall.name, args: toolCall.args })\n\n try {\n const result = await executeToolCall(\n tool,\n toolCall.args,\n context,\n onPartial,\n )\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result,\n durationMs: Date.now() - began,\n })\n return { status: 'complete', result, durationMs: Date.now() - began }\n } catch (error) {\n const err = error instanceof ToolError\n ? error\n : new ToolError({\n code: ErrorCodes.AK_TOOL_EXEC_FAILED,\n message: `Tool \"${toolCall.name}\" threw during execution: ${error instanceof Error ? error.message : String(error)}`,\n hint: 'Check the tool execute() implementation.',\n cause: error,\n })\n // Emit error before tool:end so trackers can mark the active tool span.\n emitter.emit({ type: 'error', error: err })\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result: `Error: ${err.message}`,\n durationMs: Date.now() - began,\n })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n}\n","import { ErrorCodes, ToolError } from './errors'\nimport { cloneJsonRecord } from './json-validation'\nimport { buildMessage } from './primitives'\nimport { auth } from './agent-loop'\nimport type { ArgsValidator, ChatController, MaybePromise, ToolAuthorizer, ToolCall, ToolCallHandlerContext, ToolDefinition } from './types'\n\ntype Proposal = Pick<ToolCall, 'id' | 'name' | 'args'>\ntype Authority = readonly [\n ToolDefinition | undefined,\n ArgsValidator | undefined,\n ((toolCall: ToolCall, context: ToolCallHandlerContext) => MaybePromise<void>) | undefined,\n ToolAuthorizer | undefined,\n]\nconst pending = new WeakMap<ChatController, Map<string, Promise<ToolCall>>>()\n\nexport async function withAuthority(\n controller: ChatController,\n proposal: Proposal,\n resolve: (name: string) => Authority,\n): Promise<ToolCall> {\n const identifier = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/\n if (!identifier.test(proposal.id)) {\n throw new ToolError({ code: ErrorCodes.AK_TOOL_INVALID_INPUT, message: 'Invalid tool proposal identity' })\n }\n for (const message of controller.getState().messages) {\n const existing = message.toolCalls?.find(call => call.id === proposal.id)\n if (existing) return existing\n }\n let calls = pending.get(controller)\n if (!calls) { calls = new Map(); pending.set(controller, calls) }\n const active = calls.get(proposal.id)\n if (active) return active\n const operation = (async () => {\n if (!identifier.test(proposal.name)) {\n throw new ToolError({ code: ErrorCodes.AK_TOOL_INVALID_INPUT, message: 'Invalid tool proposal identity' })\n }\n const invalidArgs = (): never => {\n throw new ToolError({ code: ErrorCodes.AK_TOOL_INVALID_INPUT, message: 'Invalid tool proposal arguments' })\n }\n const args = cloneJsonRecord(proposal.args, invalidArgs, 16_384)\n const [tool, validateArgs, onToolCall, authorize] = resolve(proposal.name)\n if (!tool?.requiresConfirmation || !tool.execute) {\n throw new ToolError({\n code: tool ? ErrorCodes.AK_CONFIG_INVALID : ErrorCodes.AK_TOOL_NOT_FOUND,\n message: 'Tool is not registered for confirmation',\n })\n }\n if (validateArgs && tool.schema) {\n const validation = validateArgs(tool.schema, args)\n if (!validation.valid) {\n throw new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: validation.message ?? 'Invalid tool arguments',\n })\n }\n }\n const call: ToolCall = { ...proposal, args, status: 'requires_confirmation' }\n await auth(authorize, call, { messages: controller.getState().messages, tool, phase: 'propose' })\n const message = { ...buildMessage({ role: 'assistant', content: '' }), toolCalls: [call] }\n controller.setMessages([...controller.getState().messages, message])\n try {\n await onToolCall?.(call, { messages: controller.getState().messages, tool })\n } catch (error) {\n controller.setMessages(controller.getState().messages.map(current => current.id !== message.id ? current : {\n ...current,\n toolCalls: current.toolCalls?.map(existing => existing.id !== call.id ? existing : {\n ...existing,\n status: 'error',\n error: error instanceof Error ? error.message : 'Tool proposal rejected',\n }),\n }))\n throw error\n }\n return call\n })()\n calls.set(proposal.id, operation)\n try { return await operation } finally { calls.delete(proposal.id) }\n}\n"]} |
@@ -1,2 +0,2 @@ | ||
| import {a}from'./chunk-JAODCWFD.js';import {j,c as c$1}from'./chunk-MNAKU42O.js';import {c,i}from'./chunk-4PAWFNZ5.js';var I=new WeakMap;async function L(e,o,w){let f=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;if(!f.test(o.id))throw new c({code:i.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal identity"});for(let m of e.getState().messages){let r=m.toolCalls?.find(t=>t.id===o.id);if(r)return r}let a$1=I.get(e);a$1||(a$1=new Map,I.set(e,a$1));let c$2=a$1.get(o.id);if(c$2)return c$2;let T=(async()=>{if(!f.test(o.name))throw new c({code:i.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal identity"});let m=()=>{throw new c({code:i.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal arguments"})},r=a(o.args,m,16384),[t,C,y,p]=w(o.name);if(!t?.requiresConfirmation||!t.execute)throw new c({code:t?i.AK_CONFIG_INVALID:i.AK_TOOL_NOT_FOUND,message:"Tool is not registered for confirmation"});if(C&&t.schema){let i$1=C(t.schema,r);if(!i$1.valid)throw new c({code:i.AK_TOOL_INVALID_INPUT,message:i$1.message??"Invalid tool arguments"})}let l={...o,args:r,status:"requires_confirmation"};await j(p,l,{messages:e.getState().messages,tool:t,phase:"propose"});let A={...c$1({role:"assistant",content:""}),toolCalls:[l]};e.setMessages([...e.getState().messages,A]);try{await y?.(l,{messages:e.getState().messages,tool:t});}catch(i){throw e.setMessages(e.getState().messages.map(d=>d.id!==A.id?d:{...d,toolCalls:d.toolCalls?.map(g=>g.id!==l.id?g:{...g,status:"error",error:i instanceof Error?i.message:"Tool proposal rejected"})})),i}return l})();a$1.set(o.id,T);try{return await T}finally{a$1.delete(o.id);}}export{L as withAuthority};//# sourceMappingURL=tool-proposal-internal.js.map | ||
| import {a}from'./chunk-JAODCWFD.js';import {j,c as c$1}from'./chunk-VWKK6GKY.js';import {c,i}from'./chunk-4PAWFNZ5.js';var I=new WeakMap;async function L(e,o,w){let f=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;if(!f.test(o.id))throw new c({code:i.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal identity"});for(let m of e.getState().messages){let r=m.toolCalls?.find(t=>t.id===o.id);if(r)return r}let a$1=I.get(e);a$1||(a$1=new Map,I.set(e,a$1));let c$2=a$1.get(o.id);if(c$2)return c$2;let T=(async()=>{if(!f.test(o.name))throw new c({code:i.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal identity"});let m=()=>{throw new c({code:i.AK_TOOL_INVALID_INPUT,message:"Invalid tool proposal arguments"})},r=a(o.args,m,16384),[t,C,y,p]=w(o.name);if(!t?.requiresConfirmation||!t.execute)throw new c({code:t?i.AK_CONFIG_INVALID:i.AK_TOOL_NOT_FOUND,message:"Tool is not registered for confirmation"});if(C&&t.schema){let i$1=C(t.schema,r);if(!i$1.valid)throw new c({code:i.AK_TOOL_INVALID_INPUT,message:i$1.message??"Invalid tool arguments"})}let l={...o,args:r,status:"requires_confirmation"};await j(p,l,{messages:e.getState().messages,tool:t,phase:"propose"});let A={...c$1({role:"assistant",content:""}),toolCalls:[l]};e.setMessages([...e.getState().messages,A]);try{await y?.(l,{messages:e.getState().messages,tool:t});}catch(i){throw e.setMessages(e.getState().messages.map(d=>d.id!==A.id?d:{...d,toolCalls:d.toolCalls?.map(g=>g.id!==l.id?g:{...g,status:"error",error:i instanceof Error?i.message:"Tool proposal rejected"})})),i}return l})();a$1.set(o.id,T);try{return await T}finally{a$1.delete(o.id);}}export{L as withAuthority};//# sourceMappingURL=tool-proposal-internal.js.map | ||
| //# sourceMappingURL=tool-proposal-internal.js.map |
+1
-1
| { | ||
| "name": "@agentskit/core", | ||
| "version": "1.12.6", | ||
| "version": "1.12.7", | ||
| "description": "Portable AgentsKit runtime for chat orchestration, tools, memory, and retrieval.", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
| import {b,i,a,c}from'./chunk-4PAWFNZ5.js';var x=0;function w(t){return `${t}-${Date.now()}-${x++}`}function S(){let t=new Set;return {addObserver(e){return t.add(e),()=>{t.delete(e);}},emit(e){for(let o of t)try{let a=o.on(e);a&&typeof a.catch=="function"&&a.catch(()=>{});}catch{}}}}function D(t){return {id:w("msg"),role:t.role,content:t.content,status:t.status??"complete",metadata:t.metadata,toolCallId:t.toolCallId,createdAt:new Date}}function v(t){return t!=null&&typeof t=="object"&&Symbol.asyncIterator in t}async function T(t,e,o,a){let n=t.execute?.(e,o);if(v(n)){let s="";for await(let m of n)s+=String(m),a?.(s);return s}let r=await n;return r==null?"":String(r)}function h(t){try{let e=JSON.parse(t);return e&&typeof e=="object"?e:{}}catch{return {}}}function C(t){let e=new Set;return {async init(o){o.init&&!e.has(o.name)&&(await o.init(),e.add(o.name));},async disposeAll(){for(let o of e)try{await t.get(o)?.dispose?.();}catch{}e.clear();}}}async function k(t,e){let o="",a$1="";try{let n=t.stream();for await(let r of n)if(r.type==="text"&&r.content)o+=r.content,e.onText?.(o);else if(r.type==="reasoning"&&r.content)a$1+=r.content,e.onReasoning?.(a$1);else if(r.type==="tool_call")await e.onToolCall?.(r);else if(r.type==="tool_result"&&r.content)e.onToolResult?.(r.content);else if(r.type==="usage"&&r.usage)e.onUsage?.(r.usage);else if(r.type==="error"){e.onError?.(new b({code:i.AK_ADAPTER_STREAM_FAILED,message:r.content??"Stream error",hint:"Key/network/model/provider"}));return}else if(r.type==="done")break;e.onDone(o);}catch(n){let r=n instanceof a?n:new b({code:i.AK_ADAPTER_STREAM_FAILED,message:`Stream failed: ${n instanceof Error?n.message:String(n)}`,hint:"Adapter/provider",cause:n});e.onError?.(r);}}function O(...t){let e=new Map;for(let o of t)if(o)for(let a of o)e.set(a.name,a);return e}async function I(t,e){if(t.length===0)return {systemPrompt:e,skillTools:[]};let o=t.map(s=>`--- ${s.name} --- | ||
| ${s.systemPrompt}`),n=`${e?`${e} | ||
| `:""}${o.join(` | ||
| `)}`,r=[];for(let s of t)if(s.onActivate){let m=await s.onActivate();r.push(...m.tools??[]);}return {systemPrompt:n,skillTools:r}}async function E(t,e,o){t&&await import('./tool-authorization-internal.js').then(a=>a.authorize(t,e,o));}async function $(t){let{tool:e,toolCall:o,context:a,emitter:n,lifecycle:r,onPartial:s,onConfirm:m,validate:g,authorize:y}=t,c$1=Date.now();if(!e?.execute){let i$1=new c({code:i.AK_TOOL_NOT_FOUND,message:`Tool "${o.name}" not found or has no execute function`,hint:"Register an executable tool in ChatConfig, e.g. { tools: [myTool] }."});return n.emit({type:"error",error:i$1}),{status:"error",error:i$1.toString(),durationMs:Date.now()-c$1}}if(g&&e.schema){let i$1=g(e.schema,o.args);if(!i$1.valid){let l=new c({code:i.AK_TOOL_INVALID_INPUT,message:i$1.message??`Tool "${o.name}" received invalid arguments`});return n.emit({type:"error",error:l}),{status:"error",error:l.toString(),durationMs:Date.now()-c$1}}}if(e.requiresConfirmation){if(!m)return {status:"skipped",result:"No confirmation handler",durationMs:Date.now()-c$1};if(!await m(o))return {status:"skipped",result:"Tool execution declined by confirmation handler",durationMs:Date.now()-c$1}}try{await E(y,o,{...a,tool:e,phase:"execute"});}catch(i){let l=i;return n.emit({type:"error",error:l}),{status:"error",error:l.toString(),durationMs:Date.now()-c$1}}await r.init(e),n.emit({type:"tool:start",name:o.name,args:o.args});try{let i=await T(e,o.args,a,s);return n.emit({type:"tool:end",name:o.name,result:i,durationMs:Date.now()-c$1}),{status:"complete",result:i,durationMs:Date.now()-c$1}}catch(i$1){let l=i$1 instanceof c?i$1:new c({code:i.AK_TOOL_EXEC_FAILED,message:`Tool "${o.name}" threw during execution: ${i$1 instanceof Error?i$1.message:String(i$1)}`,hint:"Check the tool execute() implementation.",cause:i$1});return n.emit({type:"error",error:l}),n.emit({type:"tool:end",name:o.name,result:`Error: ${l.message}`,durationMs:Date.now()-c$1}),{status:"error",error:l.toString(),durationMs:Date.now()-c$1}}}export{w as a,S as b,D as c,T as d,h as e,C as f,k as g,O as h,I as i,E as j,$ as k};//# sourceMappingURL=chunk-MNAKU42O.js.map | ||
| //# sourceMappingURL=chunk-MNAKU42O.js.map |
| {"version":3,"sources":["../src/primitives.ts","../src/agent-loop.ts"],"names":["nextId","generateId","prefix","createEventEmitter","observers","observer","event","result","buildMessage","params","isAsyncIterable","value","executeToolCall","tool","args","context","onPartialResult","raw","accumulated","chunk","safeParseArgs","parsed","createToolLifecycle","tools","initialized","name","consumeStream","source","handlers","accumulatedText","accumulatedReasoning","iterator","AdapterError","ErrorCodes","error","err","AgentsKitError","buildToolMap","sources","map","activateSkills","skills","prompt","prompts","system","skill","a","auth","fn","call","m","executeSafeTool","options","toolCall","emitter","lifecycle","onPartial","onConfirm","validate","authorize","began","ToolError","v"],"mappings":"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","file":"chunk-MNAKU42O.js","sourcesContent":["import { AdapterError, AgentsKitError, ErrorCodes } from './errors'\nimport type {\n AgentEvent,\n Message,\n MessageRole,\n MessageStatus,\n Observer,\n StreamChunk,\n StreamSource,\n ToolDefinition,\n ToolExecutionContext,\n} from './types'\nimport type { TokenUsage } from './types/stream'\n\nlet nextId = 0\n\nexport function generateId(prefix: string): string {\n return `${prefix}-${Date.now()}-${nextId++}`\n}\n\nexport function createEventEmitter() {\n const observers = new Set<Observer>()\n\n return {\n addObserver(observer: Observer): () => void {\n observers.add(observer)\n return () => { observers.delete(observer) }\n },\n emit(event: AgentEvent): void {\n for (const observer of observers) {\n try {\n const result = observer.on(event)\n if (result && typeof (result as Promise<void>).catch === 'function') {\n (result as Promise<void>).catch(() => {})\n }\n } catch {\n // Observer errors must never break the main loop.\n }\n }\n },\n }\n}\n\nexport function buildMessage(params: {\n role: MessageRole\n content: string\n status?: MessageStatus\n metadata?: Record<string, unknown>\n toolCallId?: string\n}): Message {\n return {\n id: generateId('msg'),\n role: params.role,\n content: params.content,\n status: params.status ?? 'complete',\n metadata: params.metadata,\n toolCallId: params.toolCallId,\n createdAt: new Date(),\n }\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof value === 'object' && Symbol.asyncIterator in value\n}\n\nexport async function executeToolCall(\n tool: ToolDefinition,\n args: Record<string, unknown>,\n context: ToolExecutionContext,\n onPartialResult?: (accumulated: string) => void,\n): Promise<string> {\n const raw = tool.execute?.(args, context)\n\n if (isAsyncIterable(raw)) {\n let accumulated = ''\n for await (const chunk of raw) {\n accumulated += String(chunk)\n onPartialResult?.(accumulated)\n }\n return accumulated\n }\n\n const result = await raw\n return result == null ? '' : String(result)\n}\n\nexport function safeParseArgs(args: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(args)\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : {}\n } catch {\n return {}\n }\n}\n\nexport function createToolLifecycle(tools: Map<string, ToolDefinition>) {\n const initialized = new Set<string>()\n\n return {\n async init(tool: ToolDefinition): Promise<void> {\n if (tool.init && !initialized.has(tool.name)) {\n await tool.init()\n initialized.add(tool.name)\n }\n },\n async disposeAll(): Promise<void> {\n for (const name of initialized) {\n try {\n await tools.get(name)?.dispose?.()\n } catch {\n // Dispose errors should not propagate.\n }\n }\n initialized.clear()\n },\n }\n}\n\nexport interface ConsumeStreamHandlers {\n onText?: (accumulated: string) => void\n onReasoning?: (accumulated: string) => void\n onToolCall?: (chunk: StreamChunk) => Promise<void> | void\n onToolResult?: (content: string) => void\n onUsage?: (usage: TokenUsage) => void\n onError?: (error: Error) => void\n onDone: (accumulatedText: string) => void\n}\n\nexport async function consumeStream(\n source: StreamSource,\n handlers: ConsumeStreamHandlers,\n): Promise<void> {\n let accumulatedText = ''\n let accumulatedReasoning = ''\n\n try {\n const iterator = source.stream()\n for await (const chunk of iterator) {\n if (chunk.type === 'text' && chunk.content) {\n accumulatedText += chunk.content\n handlers.onText?.(accumulatedText)\n } else if (chunk.type === 'reasoning' && chunk.content) {\n accumulatedReasoning += chunk.content\n handlers.onReasoning?.(accumulatedReasoning)\n } else if (chunk.type === 'tool_call') {\n await handlers.onToolCall?.(chunk)\n } else if (chunk.type === 'tool_result' && chunk.content) {\n handlers.onToolResult?.(chunk.content)\n } else if (chunk.type === 'usage' && chunk.usage) {\n handlers.onUsage?.(chunk.usage)\n } else if (chunk.type === 'error') {\n handlers.onError?.(new AdapterError({\n code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message: chunk.content ?? 'Stream error',\n hint: 'Key/network/model/provider',\n }))\n return\n } else if (chunk.type === 'done') {\n break\n }\n }\n handlers.onDone(accumulatedText)\n } catch (error) {\n const err = error instanceof AgentsKitError\n ? error\n : new AdapterError({\n code: ErrorCodes.AK_ADAPTER_STREAM_FAILED,\n message: `Stream failed: ${error instanceof Error ? error.message : String(error)}`,\n hint: 'Adapter/provider',\n cause: error,\n })\n handlers.onError?.(err)\n }\n}\n","import { ToolError, ErrorCodes } from './errors'\nimport { executeToolCall, createToolLifecycle, createEventEmitter } from './primitives'\nimport type {\n ArgsValidator,\n MaybePromise,\n SkillDefinition,\n ToolCall,\n ToolAuthorizationContext,\n ToolAuthorizer,\n ToolDefinition,\n ToolExecutionContext,\n} from './types'\n\n// --- buildToolMap ---\n\nexport function buildToolMap(\n ...sources: Array<ToolDefinition[] | undefined>\n): Map<string, ToolDefinition> {\n const map = new Map<string, ToolDefinition>()\n for (const source of sources) {\n if (!source) continue\n for (const tool of source) map.set(tool.name, tool)\n }\n return map\n}\n\n// --- activateSkills ---\n\nexport interface ActivateSkillsResult {\n systemPrompt: string | undefined\n skillTools: ToolDefinition[]\n}\n\nexport async function activateSkills(\n skills: SkillDefinition[],\n prompt?: string,\n): Promise<ActivateSkillsResult> {\n if (skills.length === 0) {\n return { systemPrompt: prompt, skillTools: [] }\n }\n\n const prompts = skills.map(s => `--- ${s.name} ---\\n${s.systemPrompt}`)\n const base = prompt ? `${prompt}\\n\\n` : ''\n const system = `${base}${prompts.join('\\n\\n')}`\n\n const tools: ToolDefinition[] = []\n for (const skill of skills) {\n if (skill.onActivate) {\n const a = await skill.onActivate()\n tools.push(...(a.tools ?? []))\n }\n }\n\n return { systemPrompt: system, skillTools: tools }\n}\n\n// --- executeSafeTool ---\n\nexport interface ToolExecResult {\n status: 'complete' | 'error' | 'skipped'\n result?: string\n error?: string\n durationMs: number\n}\n\nexport interface ExecuteSafeToolOptions {\n tool: ToolDefinition | undefined\n toolCall: ToolCall\n context: ToolExecutionContext\n emitter: ReturnType<typeof createEventEmitter>\n lifecycle: ReturnType<typeof createToolLifecycle>\n onPartial?: (result: string) => void\n onConfirm?: (toolCall: ToolCall) => MaybePromise<boolean>\n /** Opt-in arg validation against `tool.schema` (ADR-0008). */\n validate?: ArgsValidator\n authorize?: ToolAuthorizer\n}\n\nexport async function auth(fn: ToolAuthorizer | undefined, call: ToolCall, context: ToolAuthorizationContext): Promise<void> {\n if (!fn) return\n await import('./tool-authorization-internal.js').then(m => m.authorize(fn, call, context))\n}\n\n\nexport async function executeSafeTool(\n options: ExecuteSafeToolOptions,\n): Promise<ToolExecResult> {\n const { tool, toolCall, context, emitter, lifecycle, onPartial, onConfirm, validate, authorize } = options\n const began = Date.now()\n\n // Missing tool\n if (!tool?.execute) {\n const err = new ToolError({\n code: ErrorCodes.AK_TOOL_NOT_FOUND,\n message: `Tool \"${toolCall.name}\" not found or has no execute function`,\n hint: 'Register an executable tool in ChatConfig, e.g. { tools: [myTool] }.',\n })\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n\n if (validate && tool.schema) {\n const v = validate(tool.schema, toolCall.args)\n if (!v.valid) {\n const err = new ToolError({\n code: ErrorCodes.AK_TOOL_INVALID_INPUT,\n message: v.message ?? `Tool \"${toolCall.name}\" received invalid arguments`,\n })\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n }\n\n // Requires confirmation — refuse by default when no approver is configured (RT6)\n if (tool.requiresConfirmation) {\n if (!onConfirm) {\n return {\n status: 'skipped',\n result: 'No confirmation handler',\n durationMs: Date.now() - began,\n }\n }\n const confirmed = await onConfirm(toolCall)\n if (!confirmed) {\n return { status: 'skipped', result: 'Tool execution declined by confirmation handler', durationMs: Date.now() - began }\n }\n }\n\n try {\n await auth(authorize, toolCall, { ...context, tool, phase: 'execute' })\n } catch (error) {\n const err = error as ToolError\n emitter.emit({ type: 'error', error: err })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n\n await lifecycle.init(tool)\n\n emitter.emit({ type: 'tool:start', name: toolCall.name, args: toolCall.args })\n\n try {\n const result = await executeToolCall(\n tool,\n toolCall.args,\n context,\n onPartial,\n )\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result,\n durationMs: Date.now() - began,\n })\n return { status: 'complete', result, durationMs: Date.now() - began }\n } catch (error) {\n const err = error instanceof ToolError\n ? error\n : new ToolError({\n code: ErrorCodes.AK_TOOL_EXEC_FAILED,\n message: `Tool \"${toolCall.name}\" threw during execution: ${error instanceof Error ? error.message : String(error)}`,\n hint: 'Check the tool execute() implementation.',\n cause: error,\n })\n // Emit error before tool:end so trackers can mark the active tool span.\n emitter.emit({ type: 'error', error: err })\n emitter.emit({\n type: 'tool:end',\n name: toolCall.name,\n result: `Error: ${err.message}`,\n durationMs: Date.now() - began,\n })\n return { status: 'error', error: err.toString(), durationMs: Date.now() - began }\n }\n}\n"]} |
Sorry, the diff of this file is too big to display
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
971653
0.18%2771
0.04%