@runtypelabs/a2a-aisdk-example 0.2.3 → 0.3.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/time-executor.ts","../src/executor.ts","../src/default-skills.ts","../src/server.ts","../src/client.ts"],"sourcesContent":["/**\n * A2A Protocol Types\n *\n * Based on A2A Protocol v0.3\n * https://a2a-protocol.org/v0.3.0/specification/\n */\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Agent Card\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface AgentInterface {\n url: string\n protocolBinding: string\n protocolVersion: string\n tenant?: string\n}\n\nexport interface AgentCard {\n name: string\n description: string\n /** @deprecated Use supportedInterfaces */\n url?: string\n supportedInterfaces?: AgentInterface[]\n version: string\n /** @deprecated Use supportedInterfaces[].protocolVersion */\n protocolVersion?: string\n defaultInputModes: string[]\n defaultOutputModes: string[]\n iconUrl?: string\n provider?: {\n organization: string\n url?: string\n }\n capabilities: {\n streaming: boolean\n pushNotifications: boolean\n statefulness?: 'none' | 'session' | 'task'\n }\n skills: Skill[]\n authentication?: {\n type: 'none' | 'bearer' | 'api_key'\n bearerAuth?: {\n scopes: string[]\n }\n apiKeyAuth?: {\n headerName: string\n }\n }\n}\n\nexport interface Skill {\n id: string\n name: string\n description: string\n inputModes?: string[]\n outputModes?: string[]\n tags: string[]\n examples?: string[]\n inputSchema?: Record<string, unknown>\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// JSON-RPC\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface JsonRpcRequest {\n jsonrpc: '2.0'\n id?: string | number\n method: string\n params?: unknown\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: '2.0'\n id?: string | number\n result?: unknown\n error?: JsonRpcError\n}\n\nexport interface JsonRpcError {\n code: number\n message: string\n data?: unknown\n}\n\n// Standard JSON-RPC error codes\nexport const JSON_RPC_ERRORS = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n // A2A spec error codes\n TASK_NOT_FOUND: -32001,\n TASK_NOT_CANCELABLE: -32002,\n PUSH_NOTIFICATION_NOT_SUPPORTED: -32003,\n UNSUPPORTED_OPERATION: -32004,\n CONTENT_TYPE_NOT_SUPPORTED: -32005,\n INVALID_AGENT_RESPONSE: -32006,\n /** @deprecated Use TASK_NOT_CANCELABLE */\n SKILL_NOT_FOUND: -32002,\n /** @deprecated */\n UNAUTHORIZED: -32003,\n /** @deprecated */\n RATE_LIMITED: -32004,\n /** @deprecated */\n TASK_CANCELED: -32005,\n} as const\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Messages\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Internal message part representation.\n * `type` is used internally for routing; the A2A spec uses a oneOf model\n * where the presence of `text`, `data`, or `url` determines the kind.\n */\nexport interface MessagePart {\n type?: 'text' | 'file' | 'data'\n text?: string\n data?: unknown\n mimeType?: string\n mediaType?: string\n uri?: string\n url?: string\n filename?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface A2AMessage {\n role: 'user' | 'agent'\n messageId?: string\n parts: MessagePart[]\n contextId?: string\n taskId?: string\n metadata?: Record<string, unknown>\n referenceTaskIds?: string[]\n}\n\n/**\n * A2A spec SendMessageRequest (the params for message/send and message/stream)\n */\nexport interface SendMessageRequest {\n message: A2AMessage & { role: string }\n configuration?: {\n acceptedOutputModes?: string[]\n historyLength?: number\n blocking?: boolean\n }\n metadata?: Record<string, unknown>\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Tasks\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport type TaskState = 'submitted' | 'working' | 'completed' | 'failed' | 'canceled' | 'input-required' | 'rejected' | 'auth-required'\n/** @deprecated Use TaskState */\nexport type TaskStatus = TaskState\n\nexport interface TaskStatusObject {\n state: TaskState\n message?: A2AMessage\n timestamp?: string\n}\n\nexport interface Task {\n id: string\n contextId?: string\n status: TaskStatusObject | TaskState\n artifacts?: Artifact[]\n error?: { message: string }\n metadata?: Record<string, unknown>\n history?: A2AMessage[]\n}\n\nexport interface Artifact {\n artifactId?: string\n name?: string\n description?: string\n parts: MessagePart[]\n index?: number\n append?: boolean\n lastChunk?: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface TaskHistoryEntry {\n status: TaskStatus\n message: string\n timestamp: string\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Method Parameters\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface TasksSendParams {\n skill?: string\n message: A2AMessage & { role: string }\n contextId?: string\n pushNotification?: {\n url: string\n authentication?: {\n type: 'bearer' | 'api_key'\n token?: string\n headerName?: string\n }\n }\n metadata?: Record<string, unknown>\n configuration?: {\n acceptedOutputModes?: string[]\n historyLength?: number\n blocking?: boolean\n }\n}\n\nexport interface TasksGetParams {\n id?: string\n taskId?: string\n historyLength?: number\n includeHistory?: boolean\n}\n\nexport interface TasksCancelParams {\n id?: string\n taskId?: string\n reason?: string\n metadata?: Record<string, unknown>\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// SSE / Streaming Events (A2A Spec StreamResponse)\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface TaskStatusUpdateEvent {\n taskId: string\n contextId: string\n status: TaskStatusObject\n metadata?: Record<string, unknown>\n}\n\nexport interface TaskArtifactUpdateEvent {\n taskId: string\n contextId: string\n artifact: Artifact\n append?: boolean\n lastChunk?: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface StreamResponse {\n task?: Task\n message?: A2AMessage\n statusUpdate?: TaskStatusUpdateEvent\n artifactUpdate?: TaskArtifactUpdateEvent\n}\n\n/** @deprecated Use TaskStatusUpdateEvent */\nexport type TaskStatusEvent = TaskStatusUpdateEvent\n\n/** @deprecated Use TaskArtifactUpdateEvent */\nexport type TaskArtifactEvent = TaskArtifactUpdateEvent\n\nexport interface TaskErrorEvent {\n taskId: string\n error: {\n code: number\n message: string\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Agent Configuration\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface AgentConfig {\n name: string\n description?: string\n version?: string\n port?: number\n host?: string\n provider?: {\n organization: string\n url?: string\n }\n skills?: SkillConfig[]\n defaultInputModes?: Array<'text' | 'file' | 'data'>\n defaultOutputModes?: Array<'text' | 'file' | 'data'>\n llm?: LLMConfig\n}\n\nexport interface SkillConfig {\n id: string\n name: string\n description: string\n systemPrompt?: string\n inputSchema?: Record<string, unknown>\n tags?: string[]\n}\n\nexport interface LLMConfig {\n provider: 'openai' | 'anthropic'\n model: string\n /** Gateway model string (e.g. openai/gpt-5-nano) when using Vercel AI Gateway */\n gatewayModel?: string\n apiKey?: string\n temperature?: number\n maxOutputTokens?: number\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Executor Interface\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface ExecutorContext {\n taskId: string\n contextId?: string\n skill: SkillConfig\n message: A2AMessage\n metadata?: Record<string, unknown>\n}\n\nexport interface ExecutorResult {\n text: string\n artifacts?: Artifact[]\n}\n\nexport interface StreamCallbacks {\n onChunk: (text: string) => Promise<void>\n onComplete: () => Promise<void>\n onError: (error: Error) => Promise<void>\n}\n","/**\n * Deterministic Time Executor\n *\n * Computes temporal data using date-fns and the system clock.\n * No LLM generation — all results are deterministic.\n */\n\nimport {\n format,\n addDays,\n addWeeks,\n addMonths,\n addBusinessDays,\n differenceInDays,\n differenceInHours,\n differenceInMinutes,\n isWeekend,\n isBefore,\n parseISO,\n} from 'date-fns'\nimport { formatInTimeZone } from 'date-fns-tz'\nimport type { ExecutorContext, ExecutorResult, A2AMessage } from './types.js'\n\ninterface TimeToolResponse {\n result: Record<string, unknown>\n computed: {\n method: 'deterministic'\n source: 'system_clock' | 'date_arithmetic'\n }\n usage: string\n}\n\nfunction createResponse(\n result: Record<string, unknown>,\n source: 'system_clock' | 'date_arithmetic'\n): TimeToolResponse {\n return {\n result,\n computed: { method: 'deterministic', source },\n usage: 'Use this value directly. Do not recalculate.',\n }\n}\n\nfunction extractInput(message: A2AMessage): Record<string, unknown> {\n for (const part of message.parts) {\n if ((part.type === 'data' || part.data !== undefined) && part.data) {\n return part.data as Record<string, unknown>\n }\n if ((part.type === 'text' || part.text !== undefined) && part.text) {\n try {\n return JSON.parse(part.text)\n } catch {\n return { expression: part.text }\n }\n }\n }\n return {}\n}\n\nexport async function executeTimeSkill(context: ExecutorContext): Promise<ExecutorResult> {\n const input = extractInput(context.message)\n let response: TimeToolResponse\n\n switch (context.skill.id) {\n case 'time/now': {\n const tz = (input.timezone as string) || 'UTC'\n const now = new Date()\n response = createResponse(\n {\n timestamp: now.toISOString(),\n timezone: tz,\n formatted: formatInTimeZone(now, tz, \"yyyy-MM-dd'T'HH:mm:ssXXX\"),\n human: formatInTimeZone(now, tz, 'EEEE, MMMM d, yyyy h:mm a zzz'),\n day: formatInTimeZone(now, tz, 'EEEE'),\n offset: formatInTimeZone(now, tz, 'xxx'),\n },\n 'system_clock'\n )\n break\n }\n\n case 'time/day_of_week': {\n const dateStr = input.date as string\n if (!dateStr) throw new Error('Missing required field: date')\n const date = parseISO(dateStr)\n if (isNaN(date.getTime())) throw new Error(`Invalid date: ${dateStr}`)\n\n response = createResponse(\n {\n date: dateStr,\n day: format(date, 'EEEE'),\n // @snake-case-ok: A2A protocol response field\n day_index: date.getDay(),\n // @snake-case-ok: A2A protocol response field\n is_weekend: isWeekend(date),\n },\n 'date_arithmetic'\n )\n break\n }\n\n case 'time/add': {\n const baseStr = (input.date as string) || new Date().toISOString().split('T')[0]\n const base = parseISO(baseStr)\n if (isNaN(base.getTime())) throw new Error(`Invalid date: ${baseStr}`)\n\n let result = base\n if (input.days) result = addDays(result, input.days as number)\n if (input.weeks) result = addWeeks(result, input.weeks as number)\n if (input.months) result = addMonths(result, input.months as number)\n\n response = createResponse(\n {\n original: baseStr,\n computed: format(result, 'yyyy-MM-dd'),\n day: format(result, 'EEEE'),\n operation: { days: input.days, weeks: input.weeks, months: input.months },\n },\n 'date_arithmetic'\n )\n break\n }\n\n case 'time/business_days': {\n const baseStr = (input.date as string) || new Date().toISOString().split('T')[0]\n const days = input.days as number\n if (typeof days !== 'number') throw new Error('Missing required field: days')\n\n const base = parseISO(baseStr)\n if (isNaN(base.getTime())) throw new Error(`Invalid date: ${baseStr}`)\n\n const result = addBusinessDays(base, days)\n\n response = createResponse(\n {\n original: baseStr,\n computed: format(result, 'yyyy-MM-dd'),\n day: format(result, 'EEEE'),\n // @snake-case-ok: A2A protocol response field\n business_days_added: days,\n },\n 'date_arithmetic'\n )\n break\n }\n\n case 'time/diff': {\n const from = parseISO(input.from as string)\n const to = parseISO(input.to as string)\n if (isNaN(from.getTime())) throw new Error(`Invalid from date: ${input.from}`)\n if (isNaN(to.getTime())) throw new Error(`Invalid to date: ${input.to}`)\n\n const days = differenceInDays(to, from)\n const hours = differenceInHours(to, from)\n const minutes = differenceInMinutes(to, from)\n\n response = createResponse(\n {\n from: input.from,\n to: input.to,\n difference: { days, hours, minutes },\n human: `${Math.abs(days)} days`,\n },\n 'date_arithmetic'\n )\n break\n }\n\n case 'time/is_past': {\n const ts = input.timestamp as string\n if (!ts) throw new Error('Missing required field: timestamp')\n\n const check = parseISO(ts)\n if (isNaN(check.getTime())) throw new Error(`Invalid timestamp: ${ts}`)\n\n const now = new Date()\n\n response = createResponse(\n {\n timestamp: ts,\n // @snake-case-ok: A2A protocol response field\n is_past: isBefore(check, now),\n // @snake-case-ok: A2A protocol response field\n is_future: isBefore(now, check),\n // @snake-case-ok: A2A protocol response field\n checked_at: now.toISOString(),\n },\n 'system_clock'\n )\n break\n }\n\n case 'time/convert': {\n const ts = input.timestamp as string\n const toTz = input.to as string\n if (!ts) throw new Error('Missing required field: timestamp')\n if (!toTz) throw new Error('Missing required field: to (timezone)')\n\n const date = parseISO(ts)\n if (isNaN(date.getTime())) throw new Error(`Invalid timestamp: ${ts}`)\n\n response = createResponse(\n {\n original: ts,\n converted: formatInTimeZone(date, toTz, \"yyyy-MM-dd'T'HH:mm:ssXXX\"),\n timezone: toTz,\n human: formatInTimeZone(date, toTz, 'EEEE, MMMM d, yyyy h:mm a zzz'),\n },\n 'date_arithmetic'\n )\n break\n }\n\n case 'time/parse': {\n const expr = (input.expression as string)?.toLowerCase()\n const tz = (input.timezone as string) || 'UTC'\n const ref = input.reference ? parseISO(input.reference as string) : new Date()\n\n if (!expr) throw new Error('Missing required field: expression')\n\n let result: Date | null = null\n\n if (expr === 'today') {\n result = ref\n } else if (expr === 'tomorrow') {\n result = addDays(ref, 1)\n } else if (expr === 'yesterday') {\n result = addDays(ref, -1)\n } else if (expr.startsWith('next ')) {\n const dayName = expr.replace('next ', '').split(' ')[0]\n const days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']\n const targetDay = days.indexOf(dayName)\n if (targetDay >= 0) {\n let daysToAdd = targetDay - ref.getDay()\n if (daysToAdd <= 0) daysToAdd += 7\n result = addDays(ref, daysToAdd)\n }\n } else if (expr.includes('in ') && expr.includes(' day')) {\n const match = expr.match(/in (\\d+) days?/)\n if (match) result = addDays(ref, parseInt(match[1]))\n } else if (expr.includes('in ') && expr.includes(' week')) {\n const match = expr.match(/in (\\d+) weeks?/)\n if (match) result = addWeeks(ref, parseInt(match[1]))\n }\n\n if (!result) {\n throw new Error(\n `Could not parse expression: \"${expr}\". Supported: today, tomorrow, yesterday, next [day], in N days/weeks`\n )\n }\n\n response = createResponse(\n {\n expression: input.expression,\n resolved: format(result, 'yyyy-MM-dd'),\n day: format(result, 'EEEE'),\n timezone: tz,\n // @snake-case-ok: A2A protocol response field\n reference_used: ref.toISOString(),\n },\n 'date_arithmetic'\n )\n break\n }\n\n default:\n throw new Error(`Unknown time skill: ${context.skill.id}`)\n }\n\n const text = JSON.stringify(response, null, 2)\n return {\n text,\n artifacts: [\n {\n name: 'response',\n parts: [{ type: 'text', text }],\n },\n ],\n }\n}\n","/**\n * Agent Executor\n *\n * Executes tasks using the Vercel AI SDK for LLM integration.\n * Supports both streaming and non-streaming responses.\n */\n\nimport { streamText, generateText, tool, jsonSchema, stepCountIs, type Tool } from 'ai'\nimport { createGateway } from '@ai-sdk/gateway'\nimport { createOpenAI } from '@ai-sdk/openai'\nimport { createAnthropic } from '@ai-sdk/anthropic'\nimport { executeTimeSkill } from './time-executor.js'\nimport type {\n ExecutorContext,\n ExecutorResult,\n StreamCallbacks,\n LLMConfig,\n SkillConfig,\n} from './types.js'\n\n/**\n * Default system prompts for built-in skills\n */\nconst DEFAULT_SYSTEM_PROMPTS: Record<string, string> = {\n chat: `You are a helpful AI assistant. Respond concisely and accurately to the user's questions.`,\n analyze: `You are an analytical AI assistant. Analyze the provided input and give detailed insights.`,\n summarize: `You are a summarization assistant. Provide clear, concise summaries of the provided content.`,\n code: `You are a coding assistant. Help with code-related questions, provide examples, and explain concepts clearly.`,\n}\n\nconst CHAT_SKILL_ID = 'chat'\nconst TOOL_STOP_CONDITION = stepCountIs(5)\nconst TOOL_TAG = 'tool'\nconst LLM_TAG = 'llm'\n\n/**\n * Extract text content from A2A message parts.\n * Handles both legacy format ({type: 'text', text}) and spec format ({text}).\n */\nfunction extractTextFromMessage(message: ExecutorContext['message']): string {\n return message.parts\n .filter((p) => (p.type === 'text' || p.text !== undefined) && p.text)\n .map((p) => p.text)\n .join('\\n')\n}\n\n/**\n * Create LLM provider based on configuration.\n * Uses Vercel AI Gateway when AI_GATEWAY_API_KEY is set, with fallback to direct providers.\n */\nfunction createLLMProvider(config: LLMConfig) {\n const gatewayKey = process.env.AI_GATEWAY_API_KEY\n\n if (gatewayKey) {\n const gateway = createGateway({ apiKey: gatewayKey })\n const modelId = config.gatewayModel || `${config.provider}/${config.model}`\n return gateway(modelId)\n }\n\n const apiKey = config.apiKey || process.env[`${config.provider.toUpperCase()}_API_KEY`]\n\n if (!apiKey) {\n throw new Error(\n `API key not provided. Set AI_GATEWAY_API_KEY for Vercel AI Gateway, or ${config.provider.toUpperCase()}_API_KEY for direct provider access.`\n )\n }\n\n switch (config.provider) {\n case 'openai':\n return createOpenAI({ apiKey })(config.model)\n case 'anthropic':\n return createAnthropic({ apiKey })(config.model)\n default:\n throw new Error(`Unsupported LLM provider: ${config.provider}`)\n }\n}\n\n/**\n * Get system prompt for a skill\n */\nfunction getSystemPrompt(skill: SkillConfig): string {\n if (skill.systemPrompt) {\n return skill.systemPrompt\n }\n return DEFAULT_SYSTEM_PROMPTS[skill.id] || DEFAULT_SYSTEM_PROMPTS.chat\n}\n\nfunction sanitizeToolName(skillId: string): string {\n let name = skillId.replace(/[^a-zA-Z0-9_]/g, '_').toLowerCase()\n if (!name) {\n name = 'tool'\n }\n if (/^[0-9]/.test(name)) {\n name = `tool_${name}`\n }\n return name\n}\n\nfunction makeUniqueToolName(skillId: string, usedNames: Set<string>): string {\n const baseName = sanitizeToolName(skillId)\n if (!usedNames.has(baseName)) {\n usedNames.add(baseName)\n return baseName\n }\n\n let counter = 1\n let candidate = `${baseName}_${counter}`\n while (usedNames.has(candidate)) {\n counter += 1\n candidate = `${baseName}_${counter}`\n }\n usedNames.add(candidate)\n return candidate\n}\n\nfunction toToolInput(params: unknown): Record<string, unknown> {\n if (params && typeof params === 'object' && !Array.isArray(params)) {\n return params as Record<string, unknown>\n }\n return { input: params }\n}\n\nfunction parseToolResult(text: string): unknown {\n try {\n return JSON.parse(text)\n } catch {\n return { text }\n }\n}\n\nasync function executeCatalogToolSkill(\n parentContext: ExecutorContext,\n skill: SkillConfig,\n params: unknown\n): Promise<unknown> {\n if (skill.id.startsWith('time/')) {\n const toolContext: ExecutorContext = {\n taskId: `${parentContext.taskId}_tool_${skill.id}`,\n contextId: parentContext.contextId,\n skill,\n message: {\n role: 'user',\n parts: [{ type: 'data', data: toToolInput(params) }],\n },\n metadata: parentContext.metadata,\n }\n const result = await executeTimeSkill(toolContext)\n return parseToolResult(result.text)\n }\n\n throw new Error(`Unsupported tool skill: ${skill.id}`)\n}\n\nfunction buildChatTools(\n context: ExecutorContext,\n skillsCatalog?: SkillConfig[]\n): Record<string, Tool> {\n if (context.skill.id !== CHAT_SKILL_ID || !skillsCatalog || skillsCatalog.length === 0) {\n return {}\n }\n\n const tools: Record<string, Tool> = {}\n const usedNames = new Set<string>()\n\n for (const skill of skillsCatalog) {\n if (skill.id === context.skill.id) {\n continue\n }\n\n const tags = skill.tags ?? []\n if (!tags.includes(TOOL_TAG) || tags.includes(LLM_TAG)) {\n continue\n }\n if (!skill.id.startsWith('time/')) {\n continue\n }\n\n const toolName = makeUniqueToolName(skill.id, usedNames)\n const schema = skill.inputSchema ?? {\n type: 'object',\n properties: {},\n additionalProperties: true,\n }\n\n tools[toolName] = tool({\n description: skill.description || `Execute ${skill.name}`,\n inputSchema: jsonSchema(schema),\n execute: async (params) => executeCatalogToolSkill(context, skill, params),\n })\n }\n\n return tools\n}\n\n/**\n * Execute a task without streaming\n */\nexport async function executeTask(\n context: ExecutorContext,\n llmConfig: LLMConfig,\n skillsCatalog?: SkillConfig[]\n): Promise<ExecutorResult> {\n const model = createLLMProvider(llmConfig)\n const userMessage = extractTextFromMessage(context.message)\n const systemPrompt = getSystemPrompt(context.skill)\n const chatTools = buildChatTools(context, skillsCatalog)\n const hasChatTools = Object.keys(chatTools).length > 0\n\n const result = await generateText({\n model,\n system: systemPrompt,\n prompt: userMessage,\n temperature: llmConfig.temperature ?? 0.7,\n maxOutputTokens: llmConfig.maxOutputTokens ?? 4096,\n ...(hasChatTools ? { tools: chatTools, stopWhen: TOOL_STOP_CONDITION } : {}),\n })\n\n return {\n text: result.text,\n artifacts: [\n {\n name: 'response',\n parts: [{ type: 'text', text: result.text }],\n },\n ],\n }\n}\n\n/**\n * Execute a task with streaming\n */\nexport async function executeTaskStreaming(\n context: ExecutorContext,\n llmConfig: LLMConfig,\n callbacks: StreamCallbacks,\n skillsCatalog?: SkillConfig[]\n): Promise<void> {\n const model = createLLMProvider(llmConfig)\n const userMessage = extractTextFromMessage(context.message)\n const systemPrompt = getSystemPrompt(context.skill)\n const chatTools = buildChatTools(context, skillsCatalog)\n const hasChatTools = Object.keys(chatTools).length > 0\n\n const result = streamText({\n model,\n system: systemPrompt,\n prompt: userMessage,\n temperature: llmConfig.temperature ?? 0.7,\n maxOutputTokens: llmConfig.maxOutputTokens ?? 4096,\n ...(hasChatTools ? { tools: chatTools, stopWhen: TOOL_STOP_CONDITION } : {}),\n onError: async ({ error }) => {\n await callbacks.onError(error instanceof Error ? error : new Error(String(error)))\n },\n })\n\n for await (const chunk of result.textStream) {\n await callbacks.onChunk(chunk)\n }\n\n await callbacks.onComplete()\n}\n\n/**\n * Simple executor for testing (no LLM, just echoes)\n */\nexport async function executeEcho(context: ExecutorContext): Promise<ExecutorResult> {\n const userMessage = extractTextFromMessage(context.message)\n\n return {\n text: `Echo from ${context.skill.name}: ${userMessage}`,\n artifacts: [\n {\n name: 'response',\n parts: [{ type: 'text', text: `Echo from ${context.skill.name}: ${userMessage}` }],\n },\n ],\n }\n}\n\n/**\n * Simple streaming executor for testing\n */\nexport async function executeEchoStreaming(\n context: ExecutorContext,\n callbacks: StreamCallbacks\n): Promise<void> {\n const userMessage = extractTextFromMessage(context.message)\n const response = `Echo from ${context.skill.name}: ${userMessage}`\n\n try {\n // Simulate streaming by sending word by word\n const words = response.split(' ')\n for (let i = 0; i < words.length; i++) {\n const chunk = (i === 0 ? '' : ' ') + words[i]\n await callbacks.onChunk(chunk)\n // Small delay to simulate streaming\n await new Promise((resolve) => setTimeout(resolve, 50))\n }\n await callbacks.onComplete()\n } catch (error) {\n await callbacks.onError(error instanceof Error ? error : new Error(String(error)))\n }\n}\n","/**\n * Default Skills Configuration\n *\n * Shared skill definitions for A2A agents. Import these in your agent\n * configuration to avoid duplication across different deployment targets.\n */\n\nimport type { SkillConfig, LLMConfig } from './types.js'\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Default Skills\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Default skills available to A2A agents.\n * Includes deterministic time tools and LLM-powered skills.\n */\nexport const DEFAULT_SKILLS: SkillConfig[] = [\n // Time tools (deterministic — no LLM)\n {\n id: 'time/now',\n name: 'Current Time',\n description: 'Returns current UTC time with optional timezone conversion',\n inputSchema: {\n type: 'object',\n properties: {\n timezone: { type: 'string', description: 'IANA timezone name (e.g. America/New_York)' },\n },\n additionalProperties: false,\n },\n tags: ['deterministic', 'time', 'tool'],\n },\n {\n id: 'time/parse',\n name: 'Parse Date Expression',\n description: 'Converts \"next Tuesday at 3pm\" to ISO timestamp',\n inputSchema: {\n type: 'object',\n properties: {\n expression: { type: 'string', description: 'Natural language date expression' },\n timezone: { type: 'string', description: 'IANA timezone name (default: UTC)' },\n reference: { type: 'string', description: 'Reference ISO timestamp', format: 'date-time' },\n },\n required: ['expression'],\n additionalProperties: false,\n },\n tags: ['deterministic', 'time', 'tool'],\n },\n {\n id: 'time/convert',\n name: 'Convert Timezone',\n description: 'Converts a timestamp between timezones',\n inputSchema: {\n type: 'object',\n properties: {\n timestamp: { type: 'string', description: 'ISO timestamp to convert', format: 'date-time' },\n to: { type: 'string', description: 'Target IANA timezone name' },\n },\n required: ['timestamp', 'to'],\n additionalProperties: false,\n },\n tags: ['deterministic', 'time', 'tool'],\n },\n {\n id: 'time/add',\n name: 'Date Arithmetic',\n description: 'Add days, weeks, or months to a date',\n inputSchema: {\n type: 'object',\n properties: {\n date: { type: 'string', description: 'Base ISO date (defaults to today)' },\n days: { type: 'number', description: 'Days to add (can be negative)' },\n weeks: { type: 'number', description: 'Weeks to add (can be negative)' },\n months: { type: 'number', description: 'Months to add (can be negative)' },\n },\n additionalProperties: false,\n },\n tags: ['deterministic', 'time', 'tool'],\n },\n {\n id: 'time/diff',\n name: 'Date Difference',\n description: 'Calculate duration between two dates',\n inputSchema: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Start ISO timestamp', format: 'date-time' },\n to: { type: 'string', description: 'End ISO timestamp', format: 'date-time' },\n },\n required: ['from', 'to'],\n additionalProperties: false,\n },\n tags: ['deterministic', 'time', 'tool'],\n },\n {\n id: 'time/day_of_week',\n name: 'Day of Week',\n description: 'Returns the day of the week for a given date',\n inputSchema: {\n type: 'object',\n properties: {\n date: { type: 'string', description: 'ISO date string' },\n },\n required: ['date'],\n additionalProperties: false,\n },\n tags: ['deterministic', 'time', 'tool'],\n },\n {\n id: 'time/is_past',\n name: 'Is Past',\n description: 'Checks whether a timestamp is in the past',\n inputSchema: {\n type: 'object',\n properties: {\n timestamp: { type: 'string', description: 'ISO timestamp to check', format: 'date-time' },\n },\n required: ['timestamp'],\n additionalProperties: false,\n },\n tags: ['deterministic', 'time', 'tool'],\n },\n {\n id: 'time/business_days',\n name: 'Business Days',\n description: 'Add or subtract business days from a date',\n inputSchema: {\n type: 'object',\n properties: {\n date: { type: 'string', description: 'Base ISO date (defaults to today)' },\n days: { type: 'number', description: 'Business days to add/subtract' },\n },\n required: ['days'],\n additionalProperties: false,\n },\n tags: ['deterministic', 'time', 'tool'],\n },\n // LLM-powered skills\n {\n id: 'chat',\n name: 'Chat',\n description: 'General conversational AI assistant',\n systemPrompt: 'You are a helpful AI assistant. Respond concisely and accurately.',\n tags: ['llm'],\n },\n {\n id: 'echo',\n name: 'Echo',\n description: 'Echoes back the input (for testing)',\n tags: ['testing'],\n },\n {\n id: 'analyze',\n name: 'Analyze',\n description: 'Analyzes provided content and gives insights',\n systemPrompt: 'You are an analytical AI. Analyze the input and provide detailed insights.',\n tags: ['llm'],\n },\n]\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Default LLM Configuration\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Default LLM configuration for A2A agents.\n */\nexport const DEFAULT_LLM_CONFIG: LLMConfig = {\n provider: 'openai',\n model: 'gpt-5-nano',\n gatewayModel: 'openai/gpt-5-nano',\n temperature: 0.7,\n maxOutputTokens: 4096,\n}\n","/**\n * A2A Protocol Server\n *\n * Express server implementing the A2A (Agent-to-Agent) protocol v0.3.\n * Provides agent card discovery and JSON-RPC task execution endpoints.\n *\n * Supports both legacy method names (tasks/send, tasks/sendSubscribe) and\n * spec-compliant names (message/send, message/stream, SendMessage, etc.).\n */\n\nimport express, { type Request, type Response, type Application } from 'express'\nimport { v4 as uuidv4 } from 'uuid'\nimport type {\n AgentCard,\n AgentConfig,\n SkillConfig,\n LLMConfig,\n JsonRpcRequest,\n TasksGetParams,\n TasksCancelParams,\n TaskHistoryEntry,\n ExecutorContext,\n A2AMessage,\n MessagePart,\n TaskState,\n} from './types.js'\nimport { JSON_RPC_ERRORS } from './types.js'\nimport {\n executeTask,\n executeTaskStreaming,\n executeEcho,\n executeEchoStreaming,\n} from './executor.js'\nimport { executeTimeSkill } from './time-executor.js'\nimport { DEFAULT_SKILLS, DEFAULT_LLM_CONFIG } from './default-skills.js'\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════════\n\nconst A2A_PROTOCOL_VERSION = '0.3'\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Message Normalization (accept both legacy and spec formats)\n// ═══════════════════════════════════════════════════════════════════════════════\n\nfunction normalizePart(part: Record<string, unknown>): MessagePart {\n if (part.type) return part as unknown as MessagePart\n if (part.text !== undefined) return { type: 'text', text: part.text as string, mediaType: part.mediaType as string | undefined }\n if (part.data !== undefined) return { type: 'data', data: part.data, mediaType: part.mediaType as string | undefined }\n if (part.url !== undefined || part.raw !== undefined) return { type: 'file', uri: (part.url ?? part.uri) as string | undefined, mimeType: part.mediaType as string | undefined }\n return part as unknown as MessagePart\n}\n\nfunction normalizeRole(role: string): 'user' | 'agent' {\n if (role === 'ROLE_USER' || role === 'user') return 'user'\n if (role === 'ROLE_AGENT' || role === 'agent') return 'agent'\n return 'user'\n}\n\nfunction normalizeMessage(msg: Record<string, unknown>): A2AMessage {\n const raw = msg as { role?: string; parts?: Array<Record<string, unknown>>; messageId?: string; contextId?: string; taskId?: string; metadata?: Record<string, unknown> }\n return {\n role: normalizeRole(raw.role || 'user'),\n messageId: raw.messageId as string | undefined,\n parts: (raw.parts || []).map(normalizePart),\n contextId: raw.contextId as string | undefined,\n taskId: raw.taskId as string | undefined,\n metadata: raw.metadata,\n }\n}\n\n/**\n * Extract params from either legacy (TasksSendParams with skill field)\n * or spec (SendMessageRequest with message.contextId) formats.\n */\nfunction extractSendParams(params: Record<string, unknown>): {\n skillId: string | undefined\n message: A2AMessage\n contextId: string | undefined\n metadata: Record<string, unknown> | undefined\n} {\n const rawMessage = (params.message || {}) as Record<string, unknown>\n const message = normalizeMessage(rawMessage)\n const metadata = params.metadata as Record<string, unknown> | undefined\n const skillId = (params.skill as string | undefined)\n ?? (metadata?.skill as string | undefined)\n const contextId = (params.contextId as string | undefined) ?? message.contextId\n return { skillId, message, contextId, metadata }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Spec-compliant output formatting\n// ═══════════════════════════════════════════════════════════════════════════════\n\nfunction toSpecPart(part: MessagePart): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n if (part.type === 'text' || part.text !== undefined) out.text = part.text ?? ''\n else if (part.type === 'data' || part.data !== undefined) out.data = part.data\n else if (part.type === 'file') { out.url = part.uri ?? part.url; out.mediaType = part.mimeType ?? part.mediaType }\n if (part.mediaType || part.mimeType) out.mediaType = part.mediaType ?? part.mimeType\n if (part.metadata) out.metadata = part.metadata\n return out\n}\n\nfunction toSpecArtifact(a: { name?: string; parts: MessagePart[]; artifactId?: string }) {\n return {\n artifactId: a.artifactId ?? uuidv4(),\n name: a.name,\n parts: a.parts.map(toSpecPart),\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// In-Memory Storage\n// ═══════════════════════════════════════════════════════════════════════════════\n\ninterface StoredTask {\n id: string\n contextId: string\n status: TaskState\n skillId: string\n requestMessage: A2AMessage\n artifacts: Array<{ name?: string; parts: MessagePart[]; artifactId?: string }>\n error?: { message: string }\n metadata?: Record<string, unknown>\n history: TaskHistoryEntry[]\n}\n\nconst tasks = new Map<string, StoredTask>()\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Helper Functions\n// ═══════════════════════════════════════════════════════════════════════════════\n\nfunction generateTaskId(): string {\n return `task_${Date.now()}_${uuidv4().substring(0, 8)}`\n}\n\nfunction jsonRpcSuccess(id: string | number | undefined, result: unknown) {\n return { jsonrpc: '2.0' as const, id, result }\n}\n\nfunction jsonRpcError(id: string | number | undefined, code: number, message: string, data?: unknown) {\n return { jsonrpc: '2.0' as const, id, error: { code, message, data } }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Server Creation\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface A2AServerOptions {\n config: AgentConfig\n llmConfig?: LLMConfig\n echoMode?: boolean // Use echo executor instead of LLM (for testing)\n}\n\nexport interface A2AServer {\n app: Application\n start: () => Promise<void>\n stop: () => Promise<void>\n}\n\nexport function createA2AServer(options: A2AServerOptions): A2AServer {\n const { config, llmConfig = DEFAULT_LLM_CONFIG, echoMode = false } = options\n\n const app = express()\n app.use(express.json())\n\n // CORS headers (including OPTIONS preflight for all paths)\n app.use((req, res, next) => {\n res.header('Access-Control-Allow-Origin', '*')\n res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')\n res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-API-Key')\n if (req.method === 'OPTIONS') {\n res.sendStatus(204)\n return\n }\n next()\n })\n\n const port = config.port || 9999\n const host = config.host || 'localhost'\n const skills = config.skills || DEFAULT_SKILLS\n\n const agentUrl = `http://${host}:${port}/a2a`\n\n // Build agent card (includes both legacy and spec fields for compatibility)\n const agentCard: AgentCard = {\n name: config.name,\n description: config.description || `A2A Agent: ${config.name}`,\n url: agentUrl,\n supportedInterfaces: [\n {\n url: agentUrl,\n protocolBinding: 'JSONRPC',\n protocolVersion: A2A_PROTOCOL_VERSION,\n },\n ],\n version: config.version || '1.0.0',\n protocolVersion: A2A_PROTOCOL_VERSION,\n defaultInputModes: config.defaultInputModes || ['text/plain', 'application/json'],\n defaultOutputModes: config.defaultOutputModes || ['text/plain', 'application/json'],\n provider: config.provider || {\n organization: 'Runtype',\n url: 'https://runtype.com',\n },\n capabilities: {\n streaming: true,\n pushNotifications: false,\n },\n skills: skills.map((s) => ({\n id: s.id,\n name: s.name,\n description: s.description,\n tags: s.tags ?? [],\n examples: [],\n })),\n }\n\n // ═══════════════════════════════════════════════════════════════════════════════\n // Routes\n // ═══════════════════════════════════════════════════════════════════════════════\n\n const agentCardHandler = (_req: Request, res: Response) => {\n res.setHeader('Cache-Control', 'public, max-age=3600')\n res.json(agentCard)\n }\n\n // Agent Card discovery (both legacy and spec paths)\n app.get('/.well-known/agent.json', agentCardHandler)\n app.get('/.well-known/agent-card.json', agentCardHandler)\n\n // Health check\n app.get('/health', (_req: Request, res: Response) => {\n res.json({ status: 'healthy', timestamp: new Date().toISOString() })\n })\n\n // A2A JSON-RPC endpoint\n app.post('/a2a', async (req: Request, res: Response) => {\n const body = req.body as JsonRpcRequest\n\n // Validate JSON-RPC structure\n if (body.jsonrpc !== '2.0' || !body.method) {\n res.json(jsonRpcError(body?.id, JSON_RPC_ERRORS.INVALID_REQUEST, 'Invalid JSON-RPC request'))\n return\n }\n\n const { id, method, params } = body\n\n console.log(`[A2A] ${method}`, params ? JSON.stringify(params).substring(0, 100) : '')\n\n try {\n switch (method) {\n case 'tasks/send':\n case 'message/send':\n case 'SendMessage':\n await handleTasksSend(req, res, id, params as Record<string, unknown>, skills, llmConfig, echoMode)\n break\n\n case 'tasks/sendSubscribe':\n case 'message/stream':\n case 'SendStreamingMessage':\n await handleTasksSendSubscribe(req, res, id, params as Record<string, unknown>, skills, llmConfig, echoMode)\n break\n\n case 'tasks/get':\n case 'GetTask':\n handleTasksGet(res, id, params as TasksGetParams)\n break\n\n case 'tasks/cancel':\n case 'CancelTask':\n handleTasksCancel(res, id, params as TasksCancelParams)\n break\n\n case 'tasks/resubscribe':\n case 'SubscribeToTask':\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.UNSUPPORTED_OPERATION, 'SubscribeToTask is not supported'))\n break\n\n case 'ping':\n res.json(jsonRpcSuccess(id, { pong: true }))\n break\n\n default:\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.METHOD_NOT_FOUND, `Method not found: ${method}`))\n }\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`[A2A] Error in ${method}:`, errorMessage)\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.INTERNAL_ERROR, errorMessage))\n }\n })\n\n // ═══════════════════════════════════════════════════════════════════════════════\n // Server Lifecycle\n // ═══════════════════════════════════════════════════════════════════════════════\n\n let server: ReturnType<Application['listen']> | null = null\n\n return {\n app,\n start: () =>\n new Promise((resolve) => {\n server = app.listen(port, () => {\n console.log('═══════════════════════════════════════════════════════════════════')\n console.log(`A2A Agent Server: ${config.name}`)\n console.log('═══════════════════════════════════════════════════════════════════')\n console.log('')\n console.log(` Agent Card: http://${host}:${port}/.well-known/agent-card.json`)\n console.log(` A2A Endpoint: http://${host}:${port}/a2a`)\n console.log(` Health Check: http://${host}:${port}/health`)\n console.log('')\n console.log(' Skills:')\n for (const skill of skills) {\n console.log(` - ${skill.id}: ${skill.description}`)\n }\n console.log('')\n console.log(` Mode: ${echoMode ? 'Echo (testing)' : `LLM (${llmConfig.provider}/${llmConfig.model})`}`)\n console.log('')\n console.log('═══════════════════════════════════════════════════════════════════')\n console.log('')\n resolve()\n })\n }),\n stop: () =>\n new Promise((resolve, reject) => {\n if (server) {\n server.close((err) => {\n if (err) reject(err)\n else resolve()\n })\n } else {\n resolve()\n }\n }),\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Method Handlers\n// ═══════════════════════════════════════════════════════════════════════════════\n\nfunction resolveSkill(skillId: string | undefined, skills: SkillConfig[], echoMode: boolean): SkillConfig {\n if (skillId) {\n const found = skills.find((s) => s.id === skillId)\n if (found) return found\n }\n if (echoMode) return skills.find((s) => s.id === 'echo') || skills[0]\n return skills.find((s) => s.id === 'chat') || skills[0]\n}\n\nasync function handleTasksSend(\n _req: Request,\n res: Response,\n id: string | number | undefined,\n params: Record<string, unknown>,\n skills: SkillConfig[],\n llmConfig: LLMConfig,\n echoMode: boolean\n) {\n const { skillId, message, contextId, metadata } = extractSendParams(params)\n const skill = resolveSkill(skillId, skills, echoMode)\n const resolvedContextId = contextId || uuidv4()\n\n const taskId = generateTaskId()\n const task: StoredTask = {\n id: taskId,\n contextId: resolvedContextId,\n status: 'submitted',\n skillId: skill.id,\n requestMessage: message,\n artifacts: [],\n metadata,\n history: [{ status: 'submitted', message: 'Task created', timestamp: new Date().toISOString() }],\n }\n tasks.set(taskId, task)\n\n task.status = 'working'\n task.history.push({ status: 'working', message: 'Execution started', timestamp: new Date().toISOString() })\n\n try {\n const context: ExecutorContext = {\n taskId,\n contextId: resolvedContextId,\n skill,\n message,\n metadata,\n }\n\n let result\n if (skill.id.startsWith('time/')) {\n result = await executeTimeSkill(context)\n } else if (echoMode || skill.id === 'echo') {\n result = await executeEcho(context)\n } else {\n result = await executeTask(context, llmConfig, skills)\n }\n\n task.status = 'completed'\n task.artifacts = result.artifacts || []\n task.history.push({ status: 'completed', message: 'Task completed', timestamp: new Date().toISOString() })\n\n res.json(\n jsonRpcSuccess(id, {\n task: {\n id: taskId,\n contextId: resolvedContextId,\n status: { state: 'completed', timestamp: new Date().toISOString() },\n artifacts: task.artifacts.map(toSpecArtifact),\n metadata,\n },\n })\n )\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n task.status = 'failed'\n task.error = { message: errorMessage }\n task.history.push({ status: 'failed', message: errorMessage, timestamp: new Date().toISOString() })\n\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.INTERNAL_ERROR, `Task execution failed: ${errorMessage}`))\n }\n}\n\nasync function handleTasksSendSubscribe(\n _req: Request,\n res: Response,\n id: string | number | undefined,\n params: Record<string, unknown>,\n skills: SkillConfig[],\n llmConfig: LLMConfig,\n echoMode: boolean\n) {\n const { skillId, message, contextId, metadata } = extractSendParams(params)\n const skill = resolveSkill(skillId, skills, echoMode)\n const resolvedContextId = contextId || uuidv4()\n\n const taskId = generateTaskId()\n const task: StoredTask = {\n id: taskId,\n contextId: resolvedContextId,\n status: 'submitted',\n skillId: skill.id,\n requestMessage: message,\n artifacts: [],\n metadata,\n history: [{ status: 'submitted', message: 'Task created', timestamp: new Date().toISOString() }],\n }\n tasks.set(taskId, task)\n\n // SSE headers MUST be set before any response writing\n res.setHeader('Content-Type', 'text/event-stream')\n res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate')\n res.setHeader('Connection', 'keep-alive')\n res.setHeader('X-Accel-Buffering', 'no')\n\n /**\n * Send a JSON-RPC wrapped StreamResponse as an SSE data line.\n * Per A2A spec: each SSE event data is a JSON-RPC Response containing a StreamResponse.\n */\n const sendStreamResponse = (result: Record<string, unknown>) => {\n const rpcResponse = { jsonrpc: '2.0' as const, id, result }\n res.write(`data: ${JSON.stringify(rpcResponse)}\\n\\n`)\n }\n\n // Send initial Task object\n sendStreamResponse({\n task: {\n id: taskId,\n contextId: resolvedContextId,\n status: { state: 'submitted', timestamp: new Date().toISOString() },\n },\n })\n\n task.status = 'working'\n task.history.push({ status: 'working', message: 'Execution started', timestamp: new Date().toISOString() })\n sendStreamResponse({\n statusUpdate: {\n taskId,\n contextId: resolvedContextId,\n status: { state: 'working', timestamp: new Date().toISOString() },\n },\n })\n\n try {\n const context: ExecutorContext = {\n taskId,\n contextId: resolvedContextId,\n skill,\n message,\n metadata,\n }\n\n const artifactId = uuidv4()\n let isFirstChunk = true\n let fullText = ''\n\n const callbacks = {\n onChunk: async (text: string) => {\n fullText += text\n sendStreamResponse({\n artifactUpdate: {\n taskId,\n contextId: resolvedContextId,\n artifact: {\n artifactId,\n name: 'response',\n parts: [{ text }],\n },\n append: !isFirstChunk,\n lastChunk: false,\n },\n })\n isFirstChunk = false\n },\n onComplete: async () => {\n sendStreamResponse({\n artifactUpdate: {\n taskId,\n contextId: resolvedContextId,\n artifact: {\n artifactId,\n name: 'response',\n parts: [{ text: '' }],\n },\n append: true,\n lastChunk: true,\n },\n })\n\n task.status = 'completed'\n task.artifacts = [{ artifactId, name: 'response', parts: [{ type: 'text', text: fullText }] }]\n task.history.push({ status: 'completed', message: 'Task completed', timestamp: new Date().toISOString() })\n\n sendStreamResponse({\n statusUpdate: {\n taskId,\n contextId: resolvedContextId,\n status: { state: 'completed', timestamp: new Date().toISOString() },\n },\n })\n res.end()\n },\n onError: async (error: Error) => {\n task.status = 'failed'\n task.error = { message: error.message }\n task.history.push({ status: 'failed', message: error.message, timestamp: new Date().toISOString() })\n\n sendStreamResponse({\n statusUpdate: {\n taskId,\n contextId: resolvedContextId,\n status: {\n state: 'failed',\n message: { role: 'agent', parts: [{ text: error.message }] },\n timestamp: new Date().toISOString(),\n },\n },\n })\n res.end()\n },\n }\n\n if (skill.id.startsWith('time/')) {\n const timeResult = await executeTimeSkill(context)\n await callbacks.onChunk(timeResult.text)\n await callbacks.onComplete()\n } else if (echoMode || skill.id === 'echo') {\n await executeEchoStreaming(context, callbacks)\n } else {\n await executeTaskStreaming(context, llmConfig, callbacks, skills)\n }\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n task.status = 'failed'\n task.error = { message: errorMessage }\n task.history.push({ status: 'failed', message: errorMessage, timestamp: new Date().toISOString() })\n\n sendStreamResponse({\n statusUpdate: {\n taskId,\n contextId: resolvedContextId,\n status: {\n state: 'failed',\n message: { role: 'agent', parts: [{ text: errorMessage }] },\n timestamp: new Date().toISOString(),\n },\n },\n })\n res.end()\n }\n}\n\nfunction handleTasksGet(res: Response, id: string | number | undefined, params: TasksGetParams) {\n const resolvedTaskId = params.id || params.taskId\n if (!resolvedTaskId) {\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.INVALID_PARAMS, 'Missing task id'))\n return\n }\n\n const task = tasks.get(resolvedTaskId)\n if (!task) {\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.TASK_NOT_FOUND, `Task not found: ${resolvedTaskId}`))\n return\n }\n\n const result: Record<string, unknown> = {\n task: {\n id: task.id,\n contextId: task.contextId,\n status: { state: task.status, timestamp: new Date().toISOString() },\n artifacts: task.artifacts.map(toSpecArtifact),\n metadata: task.metadata,\n },\n }\n\n res.json(jsonRpcSuccess(id, result))\n}\n\nfunction handleTasksCancel(res: Response, id: string | number | undefined, params: TasksCancelParams) {\n const resolvedTaskId = params.id || params.taskId\n if (!resolvedTaskId) {\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.INVALID_PARAMS, 'Missing task id'))\n return\n }\n\n const task = tasks.get(resolvedTaskId)\n if (!task) {\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.TASK_NOT_FOUND, `Task not found: ${resolvedTaskId}`))\n return\n }\n\n if (['completed', 'failed', 'canceled'].includes(task.status)) {\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.TASK_NOT_CANCELABLE, `Task cannot be canceled: already ${task.status}`))\n return\n }\n\n task.status = 'canceled'\n task.history.push({\n status: 'canceled',\n message: params.reason || 'Canceled by request',\n timestamp: new Date().toISOString(),\n })\n\n res.json(jsonRpcSuccess(id, {\n task: {\n id: resolvedTaskId,\n contextId: task.contextId,\n status: { state: 'canceled', timestamp: new Date().toISOString() },\n },\n }))\n}\n","/**\n * A2A Client\n *\n * Client for testing A2A protocol endpoints, including Runtype's A2A surfaces.\n * Supports both legacy (tasks/send) and spec-compliant (message/send) method names.\n */\n\nimport type {\n AgentCard,\n JsonRpcRequest,\n JsonRpcResponse,\n TasksSendParams,\n Task,\n Artifact,\n TaskStatusUpdateEvent,\n JsonRpcError,\n} from './types.js'\n\nexport interface A2AClientOptions {\n /** Base URL of the A2A endpoint (with or without /a2a suffix) */\n baseUrl: string\n /** API key for authentication (optional) */\n apiKey?: string\n /** Custom headers to include in requests */\n headers?: Record<string, string>\n}\n\nexport interface StreamEvent {\n type: 'status' | 'artifact' | 'error'\n data: unknown\n}\n\nexport class A2AClient {\n private baseUrl: string\n private rpcUrl: string\n private agentCardUrl: string\n private apiKey?: string\n private headers: Record<string, string>\n\n constructor(options: A2AClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, '')\n const isA2aBase = this.baseUrl.endsWith('/a2a')\n this.rpcUrl = isA2aBase ? this.baseUrl : `${this.baseUrl}/a2a`\n this.agentCardUrl = `${this.baseUrl}/.well-known/agent-card.json`\n this.apiKey = options.apiKey\n this.headers = options.headers || {}\n }\n\n async getAgentCard(): Promise<AgentCard> {\n const response = await fetch(this.agentCardUrl, {\n headers: this.getHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch agent card: ${response.status} ${response.statusText}`)\n }\n\n return response.json() as Promise<AgentCard>\n }\n\n async sendTask(params: TasksSendParams): Promise<Task> {\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: `req_${Date.now()}`,\n method: 'message/send',\n params: this.toSendMessageRequest(params),\n }\n\n const response = await this.sendJsonRpc(request)\n\n if (response.error) {\n throw new Error(`A2A error: ${response.error.message} (code: ${response.error.code})`)\n }\n\n return (response.result as { task: Task }).task\n }\n\n async sendTaskStreaming(\n params: TasksSendParams,\n callbacks: {\n onStatus?: (status: string, data: TaskStatusUpdateEvent) => void\n onArtifact?: (artifact: Artifact) => void\n onError?: (error: JsonRpcError) => void\n onChunk?: (text: string) => void\n }\n ): Promise<void> {\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: `req_${Date.now()}`,\n method: 'message/stream',\n params: this.toSendMessageRequest(params),\n }\n\n const response = await fetch(this.rpcUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.getHeaders(),\n },\n body: JSON.stringify(request),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error('No response body')\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const payload = JSON.parse(line.substring(6))\n\n // Handle JSON-RPC wrapped StreamResponse\n const result = payload.result || payload\n\n if (result.statusUpdate) {\n const state = result.statusUpdate.status?.state || result.statusUpdate.status\n callbacks.onStatus?.(state, result.statusUpdate)\n } else if (result.artifactUpdate) {\n const artifact = result.artifactUpdate.artifact\n callbacks.onArtifact?.(artifact)\n if (artifact?.parts) {\n for (const part of artifact.parts) {\n const text = part.text ?? (part.type === 'text' ? part.text : undefined)\n if (text) callbacks.onChunk?.(text)\n }\n }\n } else if (result.task) {\n const state = result.task.status?.state || result.task.status\n if (state) callbacks.onStatus?.(state, result.task)\n } else if (result.error || payload.error) {\n callbacks.onError?.(result.error || payload.error)\n }\n }\n }\n }\n\n async getTask(taskId: string, historyLength?: number): Promise<Task> {\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: `req_${Date.now()}`,\n method: 'GetTask',\n params: { id: taskId, historyLength },\n }\n\n const response = await this.sendJsonRpc(request)\n\n if (response.error) {\n throw new Error(`A2A error: ${response.error.message} (code: ${response.error.code})`)\n }\n\n return (response.result as { task: Task }).task\n }\n\n async cancelTask(taskId: string, reason?: string): Promise<Task> {\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: `req_${Date.now()}`,\n method: 'CancelTask',\n params: { id: taskId, metadata: reason ? { reason } : undefined },\n }\n\n const response = await this.sendJsonRpc(request)\n\n if (response.error) {\n throw new Error(`A2A error: ${response.error.message} (code: ${response.error.code})`)\n }\n\n return (response.result as { task: Task }).task\n }\n\n /**\n * Convert legacy TasksSendParams to spec SendMessageRequest format\n */\n private toSendMessageRequest(params: TasksSendParams): Record<string, unknown> {\n return {\n message: {\n messageId: `msg_${Date.now()}`,\n role: 'user',\n parts: params.message.parts,\n contextId: params.contextId,\n taskId: params.message.taskId,\n },\n metadata: {\n ...params.metadata,\n ...(params.skill ? { skill: params.skill } : {}),\n },\n }\n }\n\n private async sendJsonRpc(request: JsonRpcRequest): Promise<JsonRpcResponse> {\n const response = await fetch(this.rpcUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.getHeaders(),\n },\n body: JSON.stringify(request),\n })\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n return response.json() as Promise<JsonRpcResponse>\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = { ...this.headers }\n\n if (this.apiKey) {\n if (this.apiKey.startsWith('a2a_')) {\n headers['Authorization'] = `Bearer ${this.apiKey}`\n } else {\n headers['X-API-Key'] = this.apiKey\n }\n }\n\n return headers\n }\n}\n\n/**\n * Create a client for testing a Runtype A2A surface\n */\nexport function createRuntypeA2AClient(options: {\n productId: string\n surfaceId: string\n apiKey: string\n environment?: 'production' | 'staging' | 'local'\n}): A2AClient {\n const { productId, surfaceId, apiKey, environment = 'production' } = options\n\n const baseUrls = {\n production: 'https://api.runtype.com',\n staging: 'https://api.runtype-staging.com',\n local: 'http://localhost:8787',\n }\n\n const baseUrl = `${baseUrls[environment]}/v1/products/${productId}/surfaces/${surfaceId}/a2a`\n\n return new A2AClient({\n baseUrl,\n apiKey,\n })\n}\n"],"mappings":"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","names":[]}
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  A2AClient,
4
4
  createA2AServer,
5
5
  createRuntypeA2AClient
6
- } from "./chunk-OLB7ZZNY.js";
6
+ } from "./chunk-EY4P4D5Y.js";
7
7
 
8
8
  // src/cli.ts
9
9
  import { Command } from "commander";
package/dist/index.d.ts CHANGED
@@ -4,16 +4,25 @@ import { Application } from 'express';
4
4
  * A2A Protocol Types
5
5
  *
6
6
  * Based on A2A Protocol v0.3
7
- * https://a2aproject.github.io/A2A/specification/
7
+ * https://a2a-protocol.org/v0.3.0/specification/
8
8
  */
9
+ interface AgentInterface {
10
+ url: string;
11
+ protocolBinding: string;
12
+ protocolVersion: string;
13
+ tenant?: string;
14
+ }
9
15
  interface AgentCard {
10
16
  name: string;
11
17
  description: string;
12
- url: string;
18
+ /** @deprecated Use supportedInterfaces */
19
+ url?: string;
20
+ supportedInterfaces?: AgentInterface[];
13
21
  version: string;
14
- protocolVersion: string;
15
- defaultInputModes: Array<'text' | 'file' | 'data'>;
16
- defaultOutputModes: Array<'text' | 'file' | 'data'>;
22
+ /** @deprecated Use supportedInterfaces[].protocolVersion */
23
+ protocolVersion?: string;
24
+ defaultInputModes: string[];
25
+ defaultOutputModes: string[];
17
26
  iconUrl?: string;
18
27
  provider?: {
19
28
  organization: string;
@@ -22,7 +31,7 @@ interface AgentCard {
22
31
  capabilities: {
23
32
  streaming: boolean;
24
33
  pushNotifications: boolean;
25
- statefulness: 'none' | 'session' | 'task';
34
+ statefulness?: 'none' | 'session' | 'task';
26
35
  };
27
36
  skills: Skill[];
28
37
  authentication?: {
@@ -39,9 +48,10 @@ interface Skill {
39
48
  id: string;
40
49
  name: string;
41
50
  description: string;
42
- inputModes: Array<'text' | 'file' | 'data'>;
43
- outputModes: Array<'text' | 'file' | 'data'>;
51
+ inputModes?: string[];
52
+ outputModes?: string[];
44
53
  tags: string[];
54
+ examples?: string[];
45
55
  inputSchema?: Record<string, unknown>;
46
56
  }
47
57
  interface JsonRpcRequest {
@@ -68,39 +78,87 @@ declare const JSON_RPC_ERRORS: {
68
78
  readonly INVALID_PARAMS: -32602;
69
79
  readonly INTERNAL_ERROR: -32603;
70
80
  readonly TASK_NOT_FOUND: -32001;
81
+ readonly TASK_NOT_CANCELABLE: -32002;
82
+ readonly PUSH_NOTIFICATION_NOT_SUPPORTED: -32003;
83
+ readonly UNSUPPORTED_OPERATION: -32004;
84
+ readonly CONTENT_TYPE_NOT_SUPPORTED: -32005;
85
+ readonly INVALID_AGENT_RESPONSE: -32006;
86
+ /** @deprecated Use TASK_NOT_CANCELABLE */
71
87
  readonly SKILL_NOT_FOUND: -32002;
88
+ /** @deprecated */
72
89
  readonly UNAUTHORIZED: -32003;
90
+ /** @deprecated */
73
91
  readonly RATE_LIMITED: -32004;
92
+ /** @deprecated */
74
93
  readonly TASK_CANCELED: -32005;
75
94
  };
95
+ /**
96
+ * Internal message part representation.
97
+ * `type` is used internally for routing; the A2A spec uses a oneOf model
98
+ * where the presence of `text`, `data`, or `url` determines the kind.
99
+ */
76
100
  interface MessagePart {
77
- type: 'text' | 'file' | 'data';
101
+ type?: 'text' | 'file' | 'data';
78
102
  text?: string;
79
103
  data?: unknown;
80
104
  mimeType?: string;
105
+ mediaType?: string;
81
106
  uri?: string;
107
+ url?: string;
108
+ filename?: string;
109
+ metadata?: Record<string, unknown>;
82
110
  }
83
111
  interface A2AMessage {
84
112
  role: 'user' | 'agent';
113
+ messageId?: string;
85
114
  parts: MessagePart[];
115
+ contextId?: string;
116
+ taskId?: string;
117
+ metadata?: Record<string, unknown>;
118
+ referenceTaskIds?: string[];
119
+ }
120
+ /**
121
+ * A2A spec SendMessageRequest (the params for message/send and message/stream)
122
+ */
123
+ interface SendMessageRequest {
124
+ message: A2AMessage & {
125
+ role: string;
126
+ };
127
+ configuration?: {
128
+ acceptedOutputModes?: string[];
129
+ historyLength?: number;
130
+ blocking?: boolean;
131
+ };
132
+ metadata?: Record<string, unknown>;
133
+ }
134
+ type TaskState = 'submitted' | 'working' | 'completed' | 'failed' | 'canceled' | 'input-required' | 'rejected' | 'auth-required';
135
+ /** @deprecated Use TaskState */
136
+ type TaskStatus = TaskState;
137
+ interface TaskStatusObject {
138
+ state: TaskState;
139
+ message?: A2AMessage;
140
+ timestamp?: string;
86
141
  }
87
- type TaskStatus = 'submitted' | 'working' | 'completed' | 'failed' | 'canceled';
88
142
  interface Task {
89
143
  id: string;
90
144
  contextId?: string;
91
- status: TaskStatus;
145
+ status: TaskStatusObject | TaskState;
92
146
  artifacts?: Artifact[];
93
147
  error?: {
94
148
  message: string;
95
149
  };
96
150
  metadata?: Record<string, unknown>;
151
+ history?: A2AMessage[];
97
152
  }
98
153
  interface Artifact {
99
- name: string;
154
+ artifactId?: string;
155
+ name?: string;
156
+ description?: string;
100
157
  parts: MessagePart[];
101
158
  index?: number;
102
159
  append?: boolean;
103
160
  lastChunk?: boolean;
161
+ metadata?: Record<string, unknown>;
104
162
  }
105
163
  interface TaskHistoryEntry {
106
164
  status: TaskStatus;
@@ -108,8 +166,10 @@ interface TaskHistoryEntry {
108
166
  timestamp: string;
109
167
  }
110
168
  interface TasksSendParams {
111
- skill: string;
112
- message: A2AMessage;
169
+ skill?: string;
170
+ message: A2AMessage & {
171
+ role: string;
172
+ };
113
173
  contextId?: string;
114
174
  pushNotification?: {
115
175
  url: string;
@@ -120,26 +180,48 @@ interface TasksSendParams {
120
180
  };
121
181
  };
122
182
  metadata?: Record<string, unknown>;
183
+ configuration?: {
184
+ acceptedOutputModes?: string[];
185
+ historyLength?: number;
186
+ blocking?: boolean;
187
+ };
123
188
  }
124
189
  interface TasksGetParams {
125
- taskId: string;
190
+ id?: string;
191
+ taskId?: string;
192
+ historyLength?: number;
126
193
  includeHistory?: boolean;
127
194
  }
128
195
  interface TasksCancelParams {
129
- taskId: string;
196
+ id?: string;
197
+ taskId?: string;
130
198
  reason?: string;
199
+ metadata?: Record<string, unknown>;
131
200
  }
132
- interface TaskStatusEvent {
201
+ interface TaskStatusUpdateEvent {
133
202
  taskId: string;
134
- contextId?: string;
135
- status: TaskStatus;
136
- message?: string;
137
- final?: boolean;
203
+ contextId: string;
204
+ status: TaskStatusObject;
205
+ metadata?: Record<string, unknown>;
138
206
  }
139
- interface TaskArtifactEvent {
207
+ interface TaskArtifactUpdateEvent {
140
208
  taskId: string;
209
+ contextId: string;
141
210
  artifact: Artifact;
211
+ append?: boolean;
212
+ lastChunk?: boolean;
213
+ metadata?: Record<string, unknown>;
142
214
  }
215
+ interface StreamResponse {
216
+ task?: Task;
217
+ message?: A2AMessage;
218
+ statusUpdate?: TaskStatusUpdateEvent;
219
+ artifactUpdate?: TaskArtifactUpdateEvent;
220
+ }
221
+ /** @deprecated Use TaskStatusUpdateEvent */
222
+ type TaskStatusEvent = TaskStatusUpdateEvent;
223
+ /** @deprecated Use TaskArtifactUpdateEvent */
224
+ type TaskArtifactEvent = TaskArtifactUpdateEvent;
143
225
  interface TaskErrorEvent {
144
226
  taskId: string;
145
227
  error: {
@@ -199,8 +281,11 @@ interface StreamCallbacks {
199
281
  /**
200
282
  * A2A Protocol Server
201
283
  *
202
- * Express server implementing the A2A (Agent-to-Agent) protocol.
284
+ * Express server implementing the A2A (Agent-to-Agent) protocol v0.3.
203
285
  * Provides agent card discovery and JSON-RPC task execution endpoints.
286
+ *
287
+ * Supports both legacy method names (tasks/send, tasks/sendSubscribe) and
288
+ * spec-compliant names (message/send, message/stream, SendMessage, etc.).
204
289
  */
205
290
 
206
291
  interface A2AServerOptions {
@@ -219,6 +304,7 @@ declare function createA2AServer(options: A2AServerOptions): A2AServer;
219
304
  * A2A Client
220
305
  *
221
306
  * Client for testing A2A protocol endpoints, including Runtype's A2A surfaces.
307
+ * Supports both legacy (tasks/send) and spec-compliant (message/send) method names.
222
308
  */
223
309
 
224
310
  interface A2AClientOptions {
@@ -236,38 +322,21 @@ declare class A2AClient {
236
322
  private apiKey?;
237
323
  private headers;
238
324
  constructor(options: A2AClientOptions);
239
- /**
240
- * Get the agent card for discovery
241
- */
242
325
  getAgentCard(): Promise<AgentCard>;
243
- /**
244
- * Send a task and wait for completion (synchronous)
245
- */
246
326
  sendTask(params: TasksSendParams): Promise<Task>;
247
- /**
248
- * Send a task with streaming (SSE)
249
- */
250
327
  sendTaskStreaming(params: TasksSendParams, callbacks: {
251
- onStatus?: (status: string, data: TaskStatusEvent) => void;
328
+ onStatus?: (status: string, data: TaskStatusUpdateEvent) => void;
252
329
  onArtifact?: (artifact: Artifact) => void;
253
330
  onError?: (error: JsonRpcError) => void;
254
331
  onChunk?: (text: string) => void;
255
332
  }): Promise<void>;
256
- /**
257
- * Get task status
258
- */
259
- getTask(taskId: string, includeHistory?: boolean): Promise<Task>;
260
- /**
261
- * Cancel a task
262
- */
333
+ getTask(taskId: string, historyLength?: number): Promise<Task>;
263
334
  cancelTask(taskId: string, reason?: string): Promise<Task>;
264
335
  /**
265
- * Send a JSON-RPC request
336
+ * Convert legacy TasksSendParams to spec SendMessageRequest format
266
337
  */
338
+ private toSendMessageRequest;
267
339
  private sendJsonRpc;
268
- /**
269
- * Get headers for requests
270
- */
271
340
  private getHeaders;
272
341
  }
273
342
  /**
@@ -330,4 +399,4 @@ declare const DEFAULT_SKILLS: SkillConfig[];
330
399
  */
331
400
  declare const DEFAULT_LLM_CONFIG: LLMConfig;
332
401
 
333
- export { A2AClient, type A2AClientOptions, type A2AMessage, type A2AServer, type A2AServerOptions, type AgentCard, type AgentConfig, type Artifact, DEFAULT_LLM_CONFIG, DEFAULT_SKILLS, type ExecutorContext, type ExecutorResult, JSON_RPC_ERRORS, type JsonRpcError, type JsonRpcRequest, type JsonRpcResponse, type LLMConfig, type MessagePart, type Skill, type SkillConfig, type StreamCallbacks, type Task, type TaskArtifactEvent, type TaskErrorEvent, type TaskHistoryEntry, type TaskStatus, type TaskStatusEvent, type TasksCancelParams, type TasksGetParams, type TasksSendParams, createA2AServer, createRuntypeA2AClient, executeEcho, executeEchoStreaming, executeTask, executeTaskStreaming, executeTimeSkill };
402
+ export { A2AClient, type A2AClientOptions, type A2AMessage, type A2AServer, type A2AServerOptions, type AgentCard, type AgentConfig, type AgentInterface, type Artifact, DEFAULT_LLM_CONFIG, DEFAULT_SKILLS, type ExecutorContext, type ExecutorResult, JSON_RPC_ERRORS, type JsonRpcError, type JsonRpcRequest, type JsonRpcResponse, type LLMConfig, type MessagePart, type SendMessageRequest, type Skill, type SkillConfig, type StreamCallbacks, type StreamResponse, type Task, type TaskArtifactEvent, type TaskArtifactUpdateEvent, type TaskErrorEvent, type TaskHistoryEntry, type TaskState, type TaskStatus, type TaskStatusEvent, type TaskStatusObject, type TaskStatusUpdateEvent, type TasksCancelParams, type TasksGetParams, type TasksSendParams, createA2AServer, createRuntypeA2AClient, executeEcho, executeEchoStreaming, executeTask, executeTaskStreaming, executeTimeSkill };
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  executeTask,
12
12
  executeTaskStreaming,
13
13
  executeTimeSkill
14
- } from "./chunk-OLB7ZZNY.js";
14
+ } from "./chunk-EY4P4D5Y.js";
15
15
  export {
16
16
  A2AClient,
17
17
  DEFAULT_LLM_CONFIG,
@@ -2,9 +2,10 @@ interface Skill {
2
2
  id: string;
3
3
  name: string;
4
4
  description: string;
5
- inputModes: Array<'text' | 'file' | 'data'>;
6
- outputModes: Array<'text' | 'file' | 'data'>;
5
+ inputModes?: string[];
6
+ outputModes?: string[];
7
7
  tags: string[];
8
+ examples?: string[];
8
9
  inputSchema?: Record<string, unknown>;
9
10
  }
10
11
  interface SkillConfig {
@@ -64,10 +65,10 @@ interface VercelA2AConfig {
64
65
  };
65
66
  /** URL where the agent is deployed (for agent card) */
66
67
  agentUrl?: string;
67
- /** Default input modes for agent card */
68
- defaultInputModes?: Array<'text' | 'file' | 'data'>;
69
- /** Default output modes for agent card */
70
- defaultOutputModes?: Array<'text' | 'file' | 'data'>;
68
+ /** Default input modes for agent card (MIME types) */
69
+ defaultInputModes?: string[];
70
+ /** Default output modes for agent card (MIME types) */
71
+ defaultOutputModes?: string[];
71
72
  /** Run in echo mode (no LLM, for testing) */
72
73
  echoMode?: boolean;
73
74
  /** LLM configuration (required unless echoMode is true) */
@@ -93,7 +94,7 @@ declare function toAgentCardSkills(skills: SkillConfig[]): Skill[];
93
94
  * Vercel A2A Request Handlers
94
95
  *
95
96
  * Stateless request handlers for Vercel serverless/edge functions.
96
- * These handlers implement the A2A protocol using Web standard Request/Response APIs.
97
+ * These handlers implement the A2A protocol v0.3 using Web standard Request/Response APIs.
97
98
  */
98
99
 
99
100
  /**