@providerprotocol/agents 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agent/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import {\n llm,\n UserMessage,\n} from '@providerprotocol/ai';\nimport type {\n LLMInstance,\n Message,\n Turn,\n} from '@providerprotocol/ai';\nimport { generateUUID } from '../utils/uuid.ts';\nimport { AgentState } from '../state/index.ts';\nimport { loop } from '../execution/loop.ts';\nimport type {\n ExecutionContext,\n GenerateResult,\n AgentStreamResult,\n AgentStrategy,\n} from '../execution/types.ts';\nimport type { Middleware, MiddlewareContext } from '../middleware/types.ts';\nimport type { Agent, AgentOptions } from './types.ts';\n\n/**\n * Create an agent instance.\n *\n * @param options - Agent configuration\n * @returns Agent instance\n *\n * @example\n * ```typescript\n * import { agent, AgentState } from '@providerprotocol/agents';\n * import { anthropic } from '@providerprotocol/ai/anthropic';\n *\n * const coder = agent({\n * model: anthropic('claude-sonnet-4-20250514'),\n * tools: [Bash, Read, Write],\n * system: 'You are a coding assistant.',\n * });\n *\n * const state = AgentState.initial();\n * const { turn, state: newState } = await coder.generate('Hello', state);\n * ```\n */\nexport function agent(options: AgentOptions): Agent {\n const {\n // UAP-specific options\n execution = loop(),\n middleware = [],\n strategy = {},\n checkpoints,\n sessionId: providedSessionId,\n _llmInstance,\n // LLM options (passthrough to UPP)\n model,\n params = {},\n config,\n tools = [],\n system,\n structure,\n toolStrategy,\n } = options;\n\n const agentId = generateUUID();\n // Generate sessionId (UUIDv4) if checkpoints provided but no sessionId\n // Per UAP spec Section 3.4: Session IDs MUST be UUIDv4\n const sessionId = checkpoints ? (providedSessionId ?? generateUUID()) : providedSessionId;\n\n // Create the LLM instance with full UPP passthrough (or use injected instance for testing)\n const llmInstance: LLMInstance = _llmInstance ?? llm({\n model,\n params,\n config,\n system,\n structure,\n tools,\n toolStrategy,\n });\n\n /**\n * Normalize input to a Message.\n */\n function normalizeInput(input: string | Message): Message {\n if (typeof input === 'string') {\n return new UserMessage(input);\n }\n return input;\n }\n\n /**\n * Run middleware before hooks.\n */\n async function runBeforeMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n ): Promise<MiddlewareContext> {\n let currentContext = context;\n\n for (const mw of middlewares) {\n if (mw.before) {\n const result = await mw.before(currentContext);\n if (result) {\n currentContext = result;\n }\n }\n }\n\n return currentContext;\n }\n\n /**\n * Run middleware after hooks (in reverse order).\n */\n async function runAfterMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n result: GenerateResult,\n ): Promise<GenerateResult> {\n let currentResult = result;\n\n // Run in reverse order\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const mw = middlewares[i];\n if (mw?.after) {\n currentResult = await mw.after(context, currentResult);\n }\n }\n\n return currentResult;\n }\n\n /**\n * Run middleware error hooks (in reverse order).\n */\n async function runErrorMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n error: Error,\n ): Promise<GenerateResult | undefined> {\n // Run in reverse order\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const mw = middlewares[i];\n if (mw?.onError) {\n const result = await mw.onError(context, error);\n if (result) {\n return result;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Build execution context.\n */\n function buildExecutionContext(\n input: Message,\n state: AgentState,\n resolvedStrategy: AgentStrategy,\n signal?: AbortSignal,\n ): ExecutionContext {\n return {\n agent: { id: agentId, system },\n llm: llmInstance,\n input,\n state,\n tools,\n strategy: resolvedStrategy,\n signal,\n checkpoints,\n sessionId,\n };\n }\n\n const agentInstance: Agent = {\n id: agentId,\n model,\n tools,\n system,\n\n async generate(\n input: string | Message,\n state: AgentState,\n ): Promise<GenerateResult> {\n const normalizedInput = normalizeInput(input);\n\n // Create middleware context\n const middlewareContext: MiddlewareContext = {\n agent: { id: agentId, system },\n input: normalizedInput,\n state,\n metadata: new Map(),\n };\n\n try {\n // Run before middleware\n const processedContext = await runBeforeMiddleware(middleware, middlewareContext);\n\n // Build execution context\n const executionContext = buildExecutionContext(\n processedContext.input,\n processedContext.state,\n strategy,\n );\n\n // Execute strategy\n const result = await execution.execute(executionContext);\n\n // Run after middleware\n const finalResult = await runAfterMiddleware(\n middleware,\n processedContext,\n result,\n );\n\n return finalResult;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Try to recover with error middleware\n const recovered = await runErrorMiddleware(middleware, middlewareContext, err);\n if (recovered) {\n return recovered;\n }\n\n throw err;\n }\n },\n\n stream(\n input: string | Message,\n state: AgentState,\n ): AgentStreamResult {\n const normalizedInput = normalizeInput(input);\n\n // Create middleware context\n const middlewareContext: MiddlewareContext = {\n agent: { id: agentId, system },\n input: normalizedInput,\n state,\n metadata: new Map(),\n };\n\n // We need to run before middleware synchronously enough to get the context\n // but streaming is inherently async. We'll handle this by wrapping the stream.\n let aborted = false;\n const abortController = new AbortController();\n\n let resolveResult: (result: GenerateResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<GenerateResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const createStream = async function* () {\n try {\n // Run before middleware\n const processedContext = await runBeforeMiddleware(middleware, middlewareContext);\n\n // Build execution context\n const executionContext = buildExecutionContext(\n processedContext.input,\n processedContext.state,\n strategy,\n abortController.signal,\n );\n\n // Get the stream from the execution strategy\n const streamResult = execution.stream(executionContext);\n\n // Yield events from the stream\n for await (const event of streamResult) {\n if (aborted) {\n break;\n }\n yield event;\n }\n\n // Get the final result\n const result = await streamResult.result;\n\n // Run after middleware\n const finalResult = await runAfterMiddleware(\n middleware,\n processedContext,\n result,\n );\n\n resolveResult(finalResult);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Try to recover with error middleware\n const recovered = await runErrorMiddleware(middleware, middlewareContext, err);\n if (recovered) {\n resolveResult(recovered);\n return;\n }\n\n rejectResult(err);\n throw err;\n }\n };\n\n const iterator = createStream();\n\n return {\n [Symbol.asyncIterator]() {\n return iterator;\n },\n result: resultPromise,\n abort() {\n aborted = true;\n abortController.abort();\n },\n };\n },\n\n async ask(\n input: string | Message,\n state: AgentState,\n ): Promise<GenerateResult> {\n const normalizedInput = normalizeInput(input);\n\n // Generate with original state - execution strategy adds input to LLM call\n const result = await agentInstance.generate(normalizedInput, state);\n\n // Build final state with correct message order:\n // original messages + input + response messages from this turn\n const responseMessages = result.state.messages.slice(state.messages.length);\n const finalState = state\n .withMessage(normalizedInput)\n .withMessages(responseMessages)\n .withStep(result.state.step);\n\n // Preserve metadata from execution\n let stateWithMetadata = finalState;\n for (const [key, value] of Object.entries(result.state.metadata)) {\n stateWithMetadata = stateWithMetadata.withMetadata(key, value);\n }\n\n // Preserve reasoning traces\n for (const reasoning of result.state.reasoning) {\n stateWithMetadata = stateWithMetadata.withReasoning(reasoning);\n }\n\n // Preserve plan if present\n if (result.state.plan) {\n stateWithMetadata = stateWithMetadata.withPlan([...result.state.plan]);\n }\n\n return {\n turn: result.turn,\n state: stateWithMetadata,\n };\n },\n\n async query(input: string | Message): Promise<Turn> {\n const initialState = AgentState.initial();\n const result = await agentInstance.generate(input, initialState);\n return result.turn;\n },\n };\n\n return agentInstance;\n}\n\nexport type { Agent, AgentOptions } from './types.ts';\nexport type {\n GenerateResult,\n AgentStreamResult,\n AgentStreamEvent,\n UAPEventType,\n AgentStrategy,\n // Sub-agent event types (Section 8.7)\n SubagentEventType,\n SubagentEventBase,\n SubagentStartEvent,\n SubagentInnerEvent,\n SubagentEndEvent,\n SubagentEvent,\n OnSubagentEvent,\n} from '../execution/types.ts';\n"]}
1
+ {"version":3,"sources":["../src/agent/index.ts","../src/subagent/index.ts"],"names":["agent"],"mappings":"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","file":"index.js","sourcesContent":["import {\n llm,\n UserMessage,\n} from '@providerprotocol/ai';\nimport type {\n LLMInstance,\n Message,\n Turn,\n} from '@providerprotocol/ai';\nimport { generateUUID } from '../utils/uuid.ts';\nimport { AgentState } from '../state/index.ts';\nimport { loop } from '../execution/loop.ts';\nimport type {\n ExecutionContext,\n GenerateResult,\n AgentStreamResult,\n AgentStrategy,\n} from '../execution/types.ts';\nimport type { Middleware, MiddlewareContext } from '../middleware/types.ts';\nimport type { Agent, AgentOptions } from './types.ts';\n\n/**\n * Create an agent instance.\n *\n * @param options - Agent configuration\n * @returns Agent instance\n *\n * @example\n * ```typescript\n * import { agent, AgentState } from '@providerprotocol/agents';\n * import { anthropic } from '@providerprotocol/ai/anthropic';\n *\n * const coder = agent({\n * model: anthropic('claude-sonnet-4-20250514'),\n * tools: [Bash, Read, Write],\n * system: 'You are a coding assistant.',\n * });\n *\n * const state = AgentState.initial();\n * const { turn, state: newState } = await coder.generate('Hello', state);\n * ```\n */\nexport function agent(options: AgentOptions): Agent {\n const {\n // UAP-specific options\n execution = loop(),\n middleware = [],\n strategy = {},\n checkpoints,\n sessionId: providedSessionId,\n _llmInstance,\n // LLM options (passthrough to UPP)\n model,\n params = {},\n config,\n tools = [],\n system,\n structure,\n toolStrategy,\n } = options;\n\n const agentId = generateUUID();\n // Generate sessionId (UUIDv4) if checkpoints provided but no sessionId\n // Per UAP spec Section 3.4: Session IDs MUST be UUIDv4\n const sessionId = checkpoints ? (providedSessionId ?? generateUUID()) : providedSessionId;\n\n // Create the LLM instance with full UPP passthrough (or use injected instance for testing)\n const llmInstance: LLMInstance = _llmInstance ?? llm({\n model,\n params,\n config,\n system,\n structure,\n tools,\n toolStrategy,\n });\n\n /**\n * Normalize input to a Message.\n */\n function normalizeInput(input: string | Message): Message {\n if (typeof input === 'string') {\n return new UserMessage(input);\n }\n return input;\n }\n\n /**\n * Run middleware before hooks.\n */\n async function runBeforeMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n ): Promise<MiddlewareContext> {\n let currentContext = context;\n\n for (const mw of middlewares) {\n if (mw.before) {\n const result = await mw.before(currentContext);\n if (result) {\n currentContext = result;\n }\n }\n }\n\n return currentContext;\n }\n\n /**\n * Run middleware after hooks (in reverse order).\n */\n async function runAfterMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n result: GenerateResult,\n ): Promise<GenerateResult> {\n let currentResult = result;\n\n // Run in reverse order\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const mw = middlewares[i];\n if (mw?.after) {\n currentResult = await mw.after(context, currentResult);\n }\n }\n\n return currentResult;\n }\n\n /**\n * Run middleware error hooks (in reverse order).\n */\n async function runErrorMiddleware(\n middlewares: Middleware[],\n context: MiddlewareContext,\n error: Error,\n ): Promise<GenerateResult | undefined> {\n // Run in reverse order\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const mw = middlewares[i];\n if (mw?.onError) {\n const result = await mw.onError(context, error);\n if (result) {\n return result;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Build execution context.\n */\n function buildExecutionContext(\n input: Message,\n state: AgentState,\n resolvedStrategy: AgentStrategy,\n signal?: AbortSignal,\n ): ExecutionContext {\n return {\n agent: { id: agentId, system },\n llm: llmInstance,\n input,\n state,\n tools,\n strategy: resolvedStrategy,\n signal,\n checkpoints,\n sessionId,\n };\n }\n\n const agentInstance: Agent = {\n id: agentId,\n model,\n tools,\n system,\n\n async generate(\n input: string | Message,\n state: AgentState,\n ): Promise<GenerateResult> {\n const normalizedInput = normalizeInput(input);\n\n // Create middleware context\n const middlewareContext: MiddlewareContext = {\n agent: { id: agentId, system },\n input: normalizedInput,\n state,\n metadata: new Map(),\n };\n\n try {\n // Run before middleware\n const processedContext = await runBeforeMiddleware(middleware, middlewareContext);\n\n // Build execution context\n const executionContext = buildExecutionContext(\n processedContext.input,\n processedContext.state,\n strategy,\n );\n\n // Execute strategy\n const result = await execution.execute(executionContext);\n\n // Run after middleware\n const finalResult = await runAfterMiddleware(\n middleware,\n processedContext,\n result,\n );\n\n return finalResult;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Try to recover with error middleware\n const recovered = await runErrorMiddleware(middleware, middlewareContext, err);\n if (recovered) {\n return recovered;\n }\n\n throw err;\n }\n },\n\n stream(\n input: string | Message,\n state: AgentState,\n ): AgentStreamResult {\n const normalizedInput = normalizeInput(input);\n\n // Create middleware context\n const middlewareContext: MiddlewareContext = {\n agent: { id: agentId, system },\n input: normalizedInput,\n state,\n metadata: new Map(),\n };\n\n // We need to run before middleware synchronously enough to get the context\n // but streaming is inherently async. We'll handle this by wrapping the stream.\n let aborted = false;\n const abortController = new AbortController();\n\n let resolveResult: (result: GenerateResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<GenerateResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const createStream = async function* () {\n try {\n // Run before middleware\n const processedContext = await runBeforeMiddleware(middleware, middlewareContext);\n\n // Build execution context\n const executionContext = buildExecutionContext(\n processedContext.input,\n processedContext.state,\n strategy,\n abortController.signal,\n );\n\n // Get the stream from the execution strategy\n const streamResult = execution.stream(executionContext);\n\n // Yield events from the stream\n for await (const event of streamResult) {\n if (aborted) {\n break;\n }\n yield event;\n }\n\n // Get the final result\n const result = await streamResult.result;\n\n // Run after middleware\n const finalResult = await runAfterMiddleware(\n middleware,\n processedContext,\n result,\n );\n\n resolveResult(finalResult);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Try to recover with error middleware\n const recovered = await runErrorMiddleware(middleware, middlewareContext, err);\n if (recovered) {\n resolveResult(recovered);\n return;\n }\n\n rejectResult(err);\n throw err;\n }\n };\n\n const iterator = createStream();\n\n return {\n [Symbol.asyncIterator]() {\n return iterator;\n },\n result: resultPromise,\n abort() {\n aborted = true;\n abortController.abort();\n },\n };\n },\n\n async ask(\n input: string | Message,\n state: AgentState,\n ): Promise<GenerateResult> {\n // Per UAP-1.0 Section 4.6: ask() is a convenience method for multi-turn execution.\n // The execution strategy handles adding input to state and appending response.\n // We delegate directly to generate() to:\n // 1. Preserve middleware before() modifications (e.g., context pruning via withContext)\n // 2. Preserve middleware after() modifications\n // 3. Avoid message duplication (strategy already adds input)\n // 4. Return the correctly built state from the execution pipeline\n return agentInstance.generate(input, state);\n },\n\n async query(input: string | Message): Promise<Turn> {\n const initialState = AgentState.initial();\n const result = await agentInstance.generate(input, initialState);\n return result.turn;\n },\n };\n\n return agentInstance;\n}\n\nexport type { Agent, AgentOptions } from './types.ts';\nexport type {\n GenerateResult,\n AgentStreamResult,\n AgentStreamEvent,\n UAPEventType,\n AgentStrategy,\n // Sub-agent event types (Section 8.7)\n SubagentEventType,\n SubagentEventBase,\n SubagentStartEvent,\n SubagentInnerEvent,\n SubagentEndEvent,\n SubagentEvent,\n OnSubagentEvent,\n} from '../execution/types.ts';\n","/**\n * Sub-agent tool creation utilities.\n *\n * Per UAP-1.0 Section 8.7, implementations SHOULD provide helper utilities\n * for creating sub-agent tools with event propagation.\n *\n * @example\n * ```typescript\n * import { agent } from '@providerprotocol/agents';\n * import { createSubAgentTool } from '@providerprotocol/agents/subagent';\n *\n * // Create a sub-agent\n * const explorer = agent({\n * model: anthropic('claude-haiku-4-20250514'),\n * tools: [Glob, Grep, Read],\n * system: 'You explore codebases.',\n * });\n *\n * // Wrap as a tool with event propagation\n * const explorerTool = createSubAgentTool({\n * agent: explorer,\n * name: 'explore_codebase',\n * description: 'Explore and find relevant code',\n * parameters: {\n * type: 'object',\n * properties: {\n * query: { type: 'string', description: 'What to find' },\n * },\n * required: ['query'],\n * },\n * buildPrompt: (params) => `Find: ${params.query}`,\n * subagentType: 'explorer',\n * });\n *\n * // Use in parent agent\n * const coder = agent({\n * model: anthropic('claude-sonnet-4-20250514'),\n * tools: [Bash, Write, explorerTool],\n * });\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { Tool, JSONSchema } from '@providerprotocol/ai';\nimport type { Agent } from '../agent/types.ts';\nimport type {\n ToolExecutionContext,\n SubagentEvent,\n SubagentStartEvent,\n SubagentEndEvent,\n} from '../execution/types.ts';\nimport { AgentState } from '../state/index.ts';\nimport { generateUUID } from '../utils/uuid.ts';\n\n/**\n * Options for creating a sub-agent tool.\n */\nexport interface CreateSubAgentToolOptions {\n /** The sub-agent to expose as a tool */\n agent: Agent;\n /** Tool name (must be unique within parent agent's tools) */\n name: string;\n /** Tool description for the model */\n description: string;\n /** JSON Schema for tool parameters */\n parameters: JSONSchema;\n /** Convert tool parameters to a prompt for the sub-agent */\n buildPrompt: (params: Record<string, unknown>) => string;\n /**\n * Identifier for the sub-agent type (used in events).\n * Defaults to the tool name.\n */\n subagentType?: string;\n /**\n * Whether to stream the sub-agent execution.\n * When true, inner events are forwarded to parent.\n * Default: true\n */\n stream?: boolean;\n}\n\n/**\n * Create a UPP Tool from a UAP Agent with full event propagation.\n *\n * Per UAP-1.0 Section 8.7, this helper:\n * 1. Emits `subagent_start` before execution begins\n * 2. Forwards inner events during streaming execution\n * 3. Emits `subagent_end` after completion (success or failure)\n * 4. Provides execution context to sub-agent for tracing\n *\n * The created tool accepts an optional `ToolExecutionContext` as a second\n * parameter, which is injected by `injectToolContext()` during execution.\n *\n * @param options - Configuration for the sub-agent tool\n * @returns A Tool that executes the sub-agent and propagates events\n *\n * @example\n * ```typescript\n * const summarizer = agent({\n * model: anthropic('claude-haiku-4-20250514'),\n * system: 'You summarize text concisely.',\n * });\n *\n * const summarizerTool = createSubAgentTool({\n * agent: summarizer,\n * name: 'summarize',\n * description: 'Summarize the given text',\n * parameters: {\n * type: 'object',\n * properties: {\n * text: { type: 'string', description: 'Text to summarize' },\n * maxLength: { type: 'number', description: 'Max summary length' },\n * },\n * required: ['text'],\n * },\n * buildPrompt: (params) =>\n * `Summarize this in ${params.maxLength ?? 100} words:\\n\\n${params.text}`,\n * subagentType: 'summarizer',\n * });\n * ```\n */\nexport function createSubAgentTool(options: CreateSubAgentToolOptions): Tool {\n const {\n agent,\n name,\n description,\n parameters,\n buildPrompt,\n subagentType = name,\n stream: shouldStream = true,\n } = options;\n\n return {\n name,\n description,\n parameters,\n run: async (\n params: Record<string, unknown>,\n context?: ToolExecutionContext,\n ): Promise<string> => {\n const subagentId = generateUUID();\n const toolCallId = context?.toolCallId ?? generateUUID();\n const emit = context?.onSubagentEvent;\n const prompt = buildPrompt(params);\n const startTime = Date.now();\n\n // Emit start event\n const startEvent: SubagentStartEvent = {\n type: 'subagent_start',\n subagentId,\n subagentType,\n parentToolCallId: toolCallId,\n prompt,\n timestamp: startTime,\n };\n emit?.(startEvent);\n\n try {\n if (shouldStream) {\n return await executeWithStreaming(\n agent,\n prompt,\n subagentId,\n subagentType,\n toolCallId,\n emit,\n );\n }\n return await executeWithoutStreaming(\n agent,\n prompt,\n subagentId,\n subagentType,\n toolCallId,\n emit,\n );\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n\n // Emit end event with error\n const endEvent: SubagentEndEvent = {\n type: 'subagent_end',\n subagentId,\n subagentType,\n parentToolCallId: toolCallId,\n success: false,\n error: err.message,\n timestamp: Date.now(),\n };\n emit?.(endEvent);\n\n throw err;\n }\n },\n };\n}\n\n/**\n * Execute sub-agent with streaming and forward events.\n */\nasync function executeWithStreaming(\n agent: Agent,\n prompt: string,\n subagentId: string,\n subagentType: string,\n toolCallId: string,\n emit?: (event: SubagentEvent) => void,\n): Promise<string> {\n const stream = agent.stream(prompt, AgentState.initial());\n\n // Forward inner events\n for await (const event of stream) {\n emit?.({\n type: 'subagent_event',\n subagentId,\n subagentType,\n parentToolCallId: toolCallId,\n innerEvent: event,\n });\n }\n\n const result = await stream.result;\n\n // Emit end event\n const endEvent: SubagentEndEvent = {\n type: 'subagent_end',\n subagentId,\n subagentType,\n parentToolCallId: toolCallId,\n success: true,\n result: result.turn.response.text,\n timestamp: Date.now(),\n toolExecutions: result.turn.toolExecutions?.map((te) => ({\n toolName: te.toolName,\n arguments: te.arguments as Record<string, unknown>,\n result: String(te.result),\n })),\n usage: result.turn.usage,\n };\n emit?.(endEvent);\n\n return result.turn.response.text;\n}\n\n/**\n * Execute sub-agent without streaming (simpler, but no inner events).\n */\nasync function executeWithoutStreaming(\n agent: Agent,\n prompt: string,\n subagentId: string,\n subagentType: string,\n toolCallId: string,\n emit?: (event: SubagentEvent) => void,\n): Promise<string> {\n const result = await agent.generate(prompt, AgentState.initial());\n\n // Emit end event\n const endEvent: SubagentEndEvent = {\n type: 'subagent_end',\n subagentId,\n subagentType,\n parentToolCallId: toolCallId,\n success: true,\n result: result.turn.response.text,\n timestamp: Date.now(),\n toolExecutions: result.turn.toolExecutions?.map((te) => ({\n toolName: te.toolName,\n arguments: te.arguments as Record<string, unknown>,\n result: String(te.result),\n })),\n usage: result.turn.usage,\n };\n emit?.(endEvent);\n\n return result.turn.response.text;\n}\n\n/**\n * Type for the run function of a sub-agent tool.\n * Accepts params and optional execution context.\n */\nexport type SubAgentToolRun = (\n params: Record<string, unknown>,\n context?: ToolExecutionContext,\n) => Promise<string>;\n"]}
@@ -1,9 +1,9 @@
1
- import { L as LoggingOptions, M as Middleware } from '../types-BiyEVOnf.js';
2
- export { a as MiddlewareContext } from '../types-BiyEVOnf.js';
1
+ import { L as LoggingOptions, M as Middleware } from '../types-DLqkZUjz.js';
2
+ export { a as MiddlewareContext } from '../types-DLqkZUjz.js';
3
3
  import '@providerprotocol/ai';
4
4
  import '../index-qsPwbY86.js';
5
5
  import '../types-2Vsthzyu.js';
6
- import '../types-D1egxttz.js';
6
+ import '../types-ClFW1Bjr.js';
7
7
  import '../types-DChRdQoX.js';
8
8
 
9
9
  /**
@@ -0,0 +1,189 @@
1
+ import { Tool, ToolCall } from '@providerprotocol/ai';
2
+ import { i as ExecutionContext, O as OnSubagentEvent, C as ContextAwareToolRun } from './types-ClFW1Bjr.js';
3
+
4
+ /**
5
+ * Options for tool context injection.
6
+ */
7
+ interface InjectToolContextOptions {
8
+ /** Callback for sub-agent events from tools */
9
+ onSubagentEvent?: OnSubagentEvent;
10
+ }
11
+ /**
12
+ * Wrap tools to inject execution context when they support it.
13
+ *
14
+ * Per UAP-1.0 Section 8.4, tools that accept a second parameter
15
+ * should receive execution context including agentId, stateId,
16
+ * and sub-agent event callbacks.
17
+ *
18
+ * This enables:
19
+ * - Sub-agent model/config inheritance
20
+ * - Execution hierarchy tracking
21
+ * - Sub-agent event propagation
22
+ *
23
+ * @param tools - Original tool array
24
+ * @param context - Execution context from the agent
25
+ * @param options - Additional options like event callbacks
26
+ * @returns Wrapped tools with context injection
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * // In execution strategy
31
+ * const wrappedTools = injectToolContext(tools, context, {
32
+ * onSubagentEvent: (event) => {
33
+ * // Handle sub-agent events
34
+ * yield { source: 'uap', uap: { type: event.type, ... } };
35
+ * },
36
+ * });
37
+ *
38
+ * // Pass wrapped tools to LLM
39
+ * const llmWithContext = llm({ model, tools: wrappedTools });
40
+ * ```
41
+ */
42
+ declare function injectToolContext(tools: Tool[], context: ExecutionContext, options?: InjectToolContextOptions): Tool[];
43
+ /**
44
+ * Check if a tool is context-aware (accepts second parameter).
45
+ *
46
+ * @param tool - Tool to check
47
+ * @returns true if tool.run accepts more than one parameter
48
+ */
49
+ declare function isContextAwareTool(tool: Tool): boolean;
50
+ /**
51
+ * Create a context-aware tool wrapper for existing tools.
52
+ * This is useful when you want to add context support to a tool
53
+ * that doesn't natively support it.
54
+ *
55
+ * @param tool - Original tool
56
+ * @param handler - Function that receives params and context, returns result
57
+ * @returns New tool with context support
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * const originalTool = { name: 'my_tool', run: async (p) => 'result', ... };
62
+ *
63
+ * const contextAware = withToolContext(originalTool, async (params, context) => {
64
+ * console.log('Agent ID:', context?.agentId);
65
+ * // Call original or do something with context
66
+ * return originalTool.run(params);
67
+ * });
68
+ * ```
69
+ */
70
+ declare function withToolContext(tool: Tool, handler: ContextAwareToolRun): Tool;
71
+
72
+ /**
73
+ * Execution group - a set of tool calls that can execute in parallel.
74
+ */
75
+ interface ExecutionGroup {
76
+ /** Tool calls in this group */
77
+ calls: ToolCall[];
78
+ /** Whether this group contains a sequential tool (acts as barrier) */
79
+ isBarrier: boolean;
80
+ }
81
+ /**
82
+ * Order tool calls into execution groups respecting dependencies.
83
+ *
84
+ * This function takes a list of tool calls and the available tools,
85
+ * then groups them for execution while respecting:
86
+ * 1. Tool-level `sequential` flag (creates execution barriers)
87
+ * 2. Tool-level `dependsOn` array (tool must wait for named tools)
88
+ * 3. Model-driven `after` array on tool calls (call must wait for specific calls)
89
+ *
90
+ * @param toolCalls - Tool calls from the model response
91
+ * @param tools - Tool definitions (may include dependency options)
92
+ * @returns Ordered array of execution groups
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * const groups = orderToolCalls(turn.response.toolCalls, agent.tools);
97
+ *
98
+ * for (const group of groups) {
99
+ * if (group.isBarrier) {
100
+ * // Execute sequentially
101
+ * for (const call of group.calls) {
102
+ * await executeTool(call);
103
+ * }
104
+ * } else {
105
+ * // Execute in parallel
106
+ * await Promise.all(group.calls.map(executeTool));
107
+ * }
108
+ * }
109
+ * ```
110
+ */
111
+ declare function orderToolCalls(toolCalls: ToolCall[], tools: Tool[]): ExecutionGroup[];
112
+ /**
113
+ * Check if any tools have execution dependencies defined.
114
+ *
115
+ * @param tools - Tool definitions to check
116
+ * @returns true if any tool has sequential or dependsOn set
117
+ */
118
+ declare function hasToolDependencies(tools: Tool[]): boolean;
119
+ /**
120
+ * Check if any tool calls have model-driven dependencies.
121
+ *
122
+ * @param toolCalls - Tool calls to check
123
+ * @returns true if any call has the `after` field set
124
+ */
125
+ declare function hasCallDependencies(toolCalls: ToolCall[]): boolean;
126
+ /**
127
+ * Result of executing a tool call.
128
+ */
129
+ interface ToolExecutionResult {
130
+ /** The tool call that was executed */
131
+ call: ToolCall;
132
+ /** The result from the tool */
133
+ result: unknown;
134
+ /** Whether the tool threw an error */
135
+ isError: boolean;
136
+ /** Error message if isError is true */
137
+ error?: string;
138
+ /** Execution duration in milliseconds */
139
+ duration: number;
140
+ }
141
+ /**
142
+ * Function type for executing a single tool call.
143
+ */
144
+ type ToolExecutor = (call: ToolCall, tool: Tool) => Promise<unknown>;
145
+ /**
146
+ * Execute tool calls respecting dependency ordering.
147
+ *
148
+ * This function takes tool calls, orders them using `orderToolCalls()`,
149
+ * and executes them respecting barriers (sequential tools) and
150
+ * dependencies (dependsOn, after).
151
+ *
152
+ * Per UAP-1.0 Sections 8.5 and 8.6:
153
+ * - Tools with `sequential: true` execute alone (barrier)
154
+ * - Tools with `dependsOn` wait for named tools to complete
155
+ * - Tool calls with `after` wait for specific call IDs to complete
156
+ *
157
+ * @param toolCalls - Tool calls from the model response
158
+ * @param tools - Tool definitions with potential dependencies
159
+ * @param executor - Function to execute a single tool call
160
+ * @returns Array of execution results in completion order
161
+ *
162
+ * @example
163
+ * ```typescript
164
+ * import { executeOrderedToolCalls } from '@providerprotocol/agents/execution';
165
+ *
166
+ * // Define tools with dependencies
167
+ * const readTool: ToolWithDependencies = {
168
+ * name: 'read_file',
169
+ * sequential: true, // Must complete before others
170
+ * run: async (params) => readFile(params.path),
171
+ * };
172
+ *
173
+ * const processTool: ToolWithDependencies = {
174
+ * name: 'process',
175
+ * dependsOn: ['read_file'], // Wait for read_file
176
+ * run: async (params) => process(params.data),
177
+ * };
178
+ *
179
+ * // Execute with ordering
180
+ * const results = await executeOrderedToolCalls(
181
+ * turn.response.toolCalls,
182
+ * [readTool, processTool],
183
+ * async (call, tool) => tool.run(call.arguments),
184
+ * );
185
+ * ```
186
+ */
187
+ declare function executeOrderedToolCalls(toolCalls: ToolCall[], tools: Tool[], executor: ToolExecutor): Promise<ToolExecutionResult[]>;
188
+
189
+ export { type ExecutionGroup as E, type InjectToolContextOptions as I, type ToolExecutionResult as T, isContextAwareTool as a, hasToolDependencies as b, type ToolExecutor as c, executeOrderedToolCalls as e, hasCallDependencies as h, injectToolContext as i, orderToolCalls as o, withToolContext as w };
@@ -1,6 +1,7 @@
1
1
  import { LLMInstance, Message, Tool, ToolCall, ToolExecution, Turn, StreamEvent, TokenUsage } from '@providerprotocol/ai';
2
2
  import { A as AgentState } from './index-qsPwbY86.js';
3
3
  import { C as CheckpointStore } from './types-DChRdQoX.js';
4
+ import { P as PlanStep } from './types-2Vsthzyu.js';
4
5
 
5
6
  /**
6
7
  * Result of agent generation.
@@ -145,6 +146,13 @@ interface PlanOptions {
145
146
  /** Schema for plan structure */
146
147
  planSchema?: Record<string, unknown>;
147
148
  }
149
+ /**
150
+ * Internal plan structure used by plan() strategy.
151
+ */
152
+ interface ExecutionPlan {
153
+ steps: PlanStep[];
154
+ currentStepIndex: number;
155
+ }
148
156
  /**
149
157
  * Tool dependency options for execution ordering.
150
158
  * These extend the base UPP Tool interface with UAP-specific fields.
@@ -266,5 +274,43 @@ type SubagentEvent = SubagentStartEvent | SubagentInnerEvent | SubagentEndEvent;
266
274
  * Tools that spawn sub-agents SHOULD accept this callback.
267
275
  */
268
276
  type OnSubagentEvent = (event: SubagentEvent) => void;
277
+ /**
278
+ * Context injected into tools during execution.
279
+ * Per UAP-1.0 Section 8.4, ExecutionStrategy MUST inject this context
280
+ * when invoking tools that accept a second parameter.
281
+ *
282
+ * @see UAP-1.0 Spec Section 8.4
283
+ */
284
+ interface ToolExecutionContext {
285
+ /** Agent instance ID */
286
+ agentId: string;
287
+ /** Current state snapshot ID */
288
+ stateId: string;
289
+ /** Tool call ID from the model response */
290
+ toolCallId: string;
291
+ /** Callback for sub-agent events */
292
+ onSubagentEvent?: OnSubagentEvent;
293
+ }
294
+ /**
295
+ * Type for a tool that accepts execution context as a second parameter.
296
+ * Tools can optionally accept this context for sub-agent inheritance
297
+ * and event propagation.
298
+ *
299
+ * @example
300
+ * ```typescript
301
+ * const contextAwareTool: Tool = {
302
+ * name: 'my_tool',
303
+ * description: 'Tool that uses execution context',
304
+ * parameters: { ... },
305
+ * run: async (params, context?: ToolExecutionContext) => {
306
+ * if (context?.onSubagentEvent) {
307
+ * // Can propagate sub-agent events
308
+ * }
309
+ * return 'result';
310
+ * },
311
+ * };
312
+ * ```
313
+ */
314
+ type ContextAwareToolRun = (params: Record<string, unknown>, context?: ToolExecutionContext) => Promise<unknown>;
269
315
 
270
- export type { AgentStrategy as A, ExecutionStrategy as E, GenerateResult as G, LoopOptions as L, OnSubagentEvent as O, PlanOptions as P, ReactOptions as R, SubagentEventType as S, ToolDependencyOptions as T, UAPEventType as U, AgentStreamResult as a, AgentStreamEvent as b, SubagentEventBase as c, SubagentStartEvent as d, SubagentInnerEvent as e, SubagentEndEvent as f, SubagentEvent as g, ExecutionContext as h, ExecutionResult as i, ToolWithDependencies as j, OrderedToolCall as k };
316
+ export type { AgentStrategy as A, ContextAwareToolRun as C, ExecutionStrategy as E, GenerateResult as G, LoopOptions as L, OnSubagentEvent as O, PlanOptions as P, ReactOptions as R, SubagentEventType as S, ToolExecutionContext as T, UAPEventType as U, AgentStreamResult as a, AgentStreamEvent as b, SubagentEventBase as c, SubagentStartEvent as d, SubagentInnerEvent as e, SubagentEndEvent as f, SubagentEvent as g, AgentRef as h, ExecutionContext as i, ExecutionPlan as j, ExecutionResult as k, OrderedToolCall as l, ToolDependencyOptions as m, ToolWithDependencies as n };
@@ -1,14 +1,7 @@
1
1
  import { Message } from '@providerprotocol/ai';
2
2
  import { A as AgentState } from './index-qsPwbY86.js';
3
- import { G as GenerateResult } from './types-D1egxttz.js';
3
+ import { h as AgentRef, G as GenerateResult } from './types-ClFW1Bjr.js';
4
4
 
5
- /**
6
- * Forward declaration of Agent for use in MiddlewareContext.
7
- */
8
- interface AgentRef {
9
- id: string;
10
- system?: string;
11
- }
12
5
  /**
13
6
  * Context passed to middleware functions.
14
7
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@providerprotocol/agents",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "Unified Agent Protocol (UAP) 1.0 implementation for @providerprotocol/ai",
5
5
  "type": "module",
6
6
  "author": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/execution/loop.ts"],"names":[],"mappings":"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","file":"chunk-4ESYN66B.js","sourcesContent":["import type { Turn, StreamEvent } from '@providerprotocol/ai';\nimport type {\n ExecutionStrategy,\n ExecutionContext,\n ExecutionResult,\n LoopOptions,\n AgentStreamResult,\n AgentStreamEvent,\n} from './types.ts';\n\nconst DEFAULT_LOOP_OPTIONS: Required<LoopOptions> = {\n maxIterations: Infinity,\n};\n\n/**\n * Create a loop execution strategy.\n * The simplest strategy - equivalent to UPP's tool loop behavior.\n *\n * Behavior:\n * 1. Send input to LLM\n * 2. If response has tool calls, execute tools and loop\n * 3. Continue until no tool calls or maxIterations reached\n * 4. Return final response as UPP Turn\n *\n * @param options - Loop configuration options\n * @returns ExecutionStrategy\n */\nexport function loop(options: LoopOptions = {}): ExecutionStrategy {\n const opts = { ...DEFAULT_LOOP_OPTIONS, ...options };\n\n return {\n name: 'loop',\n\n async execute(context: ExecutionContext): Promise<ExecutionResult> {\n const { llm, input, state, strategy, signal } = context;\n\n // Add input message to state and set agentId in metadata\n // This ensures checkpoints include the full conversation\n let currentState = state\n .withMessage(input)\n .withMetadata('agentId', context.agent.id);\n let iteration = 0;\n let finalTurn: Turn | undefined;\n\n // Messages for LLM generation (includes input we just added)\n const inputMessages = [...currentState.messages];\n\n while (true) {\n iteration++;\n currentState = currentState.withStep(iteration);\n\n // Check abort signal\n if (signal?.aborted) {\n throw new Error('Execution aborted');\n }\n\n // Call strategy hooks\n strategy.onStepStart?.(iteration, currentState);\n\n // Generate response - llm.generate uses rest params, pass messages array\n const turn = await llm.generate(inputMessages);\n finalTurn = turn;\n\n // Update state with messages from this turn\n currentState = currentState.withMessages(turn.messages);\n\n // Call action hook if there were tool calls\n if (turn.response.hasToolCalls) {\n strategy.onAct?.(iteration, turn.response.toolCalls ?? []);\n }\n\n // Call observe hook if there were tool executions\n if (turn.toolExecutions && turn.toolExecutions.length > 0) {\n strategy.onObserve?.(iteration, turn.toolExecutions);\n }\n\n // Call step end hook\n strategy.onStepEnd?.(iteration, { turn, state: currentState });\n\n // Save checkpoint after step completes (fire-and-forget, log errors)\n if (context.checkpoints && context.sessionId) {\n context.checkpoints.save(context.sessionId, currentState.toJSON()).catch((err) => {\n console.error('[UAP] Checkpoint save failed:', err);\n });\n }\n\n // Check stop condition\n const shouldStop = await strategy.stopCondition?.(currentState);\n if (shouldStop) {\n break;\n }\n\n // Check if there are more tool calls to process\n // UPP's llm.generate handles the tool loop internally,\n // so we only need one iteration unless we're doing multi-step\n if (!turn.response.hasToolCalls) {\n break;\n }\n\n // Check iteration limit\n if (opts.maxIterations !== Infinity && iteration >= opts.maxIterations) {\n break;\n }\n\n // For next iteration, use the updated messages\n inputMessages.length = 0;\n inputMessages.push(...currentState.messages);\n }\n\n if (!finalTurn) {\n throw new Error('No turn generated');\n }\n\n // Include sessionId in state metadata if checkpointing is enabled\n // Per UAP spec Section 3.4: sessionId MUST be included in state.metadata\n let finalState = currentState;\n if (context.sessionId) {\n finalState = currentState.withMetadata('sessionId', context.sessionId);\n }\n\n const result: ExecutionResult = {\n turn: finalTurn,\n state: finalState,\n };\n\n strategy.onComplete?.(result);\n\n return result;\n },\n\n stream(context: ExecutionContext): AgentStreamResult {\n const { llm, input, state, strategy, signal } = context;\n const agentId = context.agent.id;\n\n let aborted = false;\n const abortController = new AbortController();\n\n // Combine signals if one was provided\n if (signal) {\n signal.addEventListener('abort', () => abortController.abort());\n }\n\n let resolveResult: (result: ExecutionResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<ExecutionResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n async function* generateEvents(): AsyncGenerator<AgentStreamEvent> {\n // Add input message to state and set agentId in metadata\n // This ensures checkpoints include the full conversation\n let currentState = state\n .withMessage(input)\n .withMetadata('agentId', context.agent.id);\n let iteration = 0;\n let finalTurn: Turn | undefined;\n\n // Messages for LLM generation (includes input we just added)\n const inputMessages = [...currentState.messages];\n\n try {\n while (!aborted) {\n iteration++;\n currentState = currentState.withStep(iteration);\n\n if (abortController.signal.aborted) {\n throw new Error('Execution aborted');\n }\n\n strategy.onStepStart?.(iteration, currentState);\n\n // Emit step start event\n yield {\n source: 'uap',\n uap: {\n type: 'step_start',\n step: iteration,\n agentId,\n data: { iteration },\n },\n };\n\n // Stream the LLM response\n const streamResult = llm.stream(inputMessages);\n\n for await (const event of streamResult as AsyncIterable<StreamEvent>) {\n if (abortController.signal.aborted) {\n throw new Error('Execution aborted');\n }\n\n // Yield UPP events\n yield {\n source: 'upp',\n upp: event,\n };\n }\n\n // Get the final turn from the stream\n const turn = await streamResult.turn;\n finalTurn = turn;\n\n currentState = currentState.withMessages(turn.messages);\n\n if (turn.response.hasToolCalls) {\n strategy.onAct?.(iteration, turn.response.toolCalls ?? []);\n\n yield {\n source: 'uap',\n uap: {\n type: 'action',\n step: iteration,\n agentId,\n data: { toolCalls: turn.response.toolCalls },\n },\n };\n }\n\n if (turn.toolExecutions && turn.toolExecutions.length > 0) {\n strategy.onObserve?.(iteration, turn.toolExecutions);\n\n yield {\n source: 'uap',\n uap: {\n type: 'observation',\n step: iteration,\n agentId,\n data: { observations: turn.toolExecutions },\n },\n };\n }\n\n strategy.onStepEnd?.(iteration, { turn, state: currentState });\n\n // Save checkpoint after step completes (fire-and-forget, log errors)\n if (context.checkpoints && context.sessionId) {\n context.checkpoints.save(context.sessionId, currentState.toJSON()).catch((err) => {\n console.error('[UAP] Checkpoint save failed:', err);\n });\n }\n\n yield {\n source: 'uap',\n uap: {\n type: 'step_end',\n step: iteration,\n agentId,\n data: { iteration },\n },\n };\n\n const shouldStop = await strategy.stopCondition?.(currentState);\n if (shouldStop) {\n break;\n }\n\n if (!turn.response.hasToolCalls) {\n break;\n }\n\n if (opts.maxIterations !== Infinity && iteration >= opts.maxIterations) {\n break;\n }\n\n inputMessages.length = 0;\n inputMessages.push(...currentState.messages);\n }\n\n if (!finalTurn) {\n throw new Error('No turn generated');\n }\n\n // Include sessionId in state metadata if checkpointing is enabled\n // Per UAP spec Section 3.4: sessionId MUST be included in state.metadata\n let finalState = currentState;\n if (context.sessionId) {\n finalState = currentState.withMetadata('sessionId', context.sessionId);\n }\n\n const result: ExecutionResult = {\n turn: finalTurn,\n state: finalState,\n };\n\n strategy.onComplete?.(result);\n resolveResult(result);\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n strategy.onError?.(err, currentState);\n rejectResult(err);\n throw err;\n }\n }\n\n const iterator = generateEvents();\n\n return {\n [Symbol.asyncIterator]() {\n return iterator;\n },\n result: resultPromise,\n abort() {\n aborted = true;\n abortController.abort();\n },\n };\n },\n };\n}\n"]}