@runtypelabs/timely-a2a 0.3.3

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/vercel/handlers.ts","../../src/types.ts","../../src/executor.ts","../../src/time-executor.ts","../../src/default-skills.ts","../../src/vercel/config.ts"],"sourcesContent":["/**\n * Vercel A2A Request Handlers\n *\n * Stateless request handlers for Vercel serverless/edge functions.\n * These handlers implement the A2A protocol v0.3 using Web standard Request/Response APIs.\n */\n\nimport { v4 as uuidv4 } from 'uuid'\nimport type {\n AgentCard,\n JsonRpcRequest,\n ExecutorContext,\n LLMConfig,\n SkillConfig,\n MessagePart,\n A2AMessage,\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 { resolveConfig, toAgentCardSkills, type VercelA2AConfig } from './config.js'\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════════\n\nconst A2A_PROTOCOL_VERSION = '0.3'\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Helpers\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(\n id: string | number | undefined,\n code: number,\n message: string,\n data?: unknown\n) {\n return { jsonrpc: '2.0' as const, id, error: { code, message, data } }\n}\n\nfunction jsonResponse(data: unknown, status = 200): Response {\n return new Response(JSON.stringify(data), {\n status,\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization, X-API-Key',\n },\n })\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Message normalization (accept both legacy and spec Part 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\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\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\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 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// Agent Card Handler\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Create a handler for the agent card endpoint (GET /.well-known/agent.json)\n *\n * @example\n * ```typescript\n * // app/.well-known/agent.json/route.ts (Next.js App Router)\n * import { createAgentCardHandler } from '@runtypelabs/timely-a2a/vercel'\n *\n * export const GET = createAgentCardHandler({\n * name: 'My Agent',\n * echoMode: true,\n * })\n * ```\n */\nexport function createAgentCardHandler(config: VercelA2AConfig) {\n const resolved = resolveConfig(config)\n const agentUrl = resolved.agentUrl || '/api/a2a'\n\n const agentCard: AgentCard = {\n name: resolved.name,\n description: resolved.description,\n url: agentUrl,\n supportedInterfaces: [\n {\n url: agentUrl,\n protocolBinding: 'JSONRPC',\n protocolVersion: A2A_PROTOCOL_VERSION,\n },\n ],\n version: resolved.version,\n protocolVersion: A2A_PROTOCOL_VERSION,\n defaultInputModes: resolved.defaultInputModes,\n defaultOutputModes: resolved.defaultOutputModes,\n provider: resolved.provider,\n capabilities: {\n streaming: true,\n pushNotifications: false,\n },\n skills: toAgentCardSkills(resolved.skills),\n }\n\n return async function handler(_request: Request): Promise<Response> {\n return new Response(JSON.stringify(agentCard), {\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'public, max-age=3600',\n 'Access-Control-Allow-Origin': '*',\n },\n })\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// A2A JSON-RPC Handler\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Create a handler for the A2A JSON-RPC endpoint (POST /api/a2a)\n *\n * Gateway models (provider/model format like 'alibaba/qwen3.5-flash') require\n * AI_GATEWAY_API_KEY to be set in the environment.\n *\n * @example\n * ```typescript\n * // app/api/a2a/route.ts (Next.js App Router)\n * import { createA2AHandler } from '@runtypelabs/timely-a2a/vercel'\n *\n * export const POST = createA2AHandler({\n * name: 'My Agent',\n * llmConfig: { provider: 'openai', model: 'alibaba/qwen3.5-flash' },\n * })\n * ```\n */\nexport function createA2AHandler(config: VercelA2AConfig) {\n const resolved = resolveConfig(config)\n const { skills, llmConfig, echoMode } = resolved\n\n return async function handler(request: Request): Promise<Response> {\n // Handle CORS preflight\n if (request.method === 'OPTIONS') {\n return new Response(null, {\n status: 204,\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Authorization, X-API-Key',\n },\n })\n }\n\n let body: JsonRpcRequest\n try {\n body = (await request.json()) as JsonRpcRequest\n } catch {\n return jsonResponse(\n jsonRpcError(undefined, JSON_RPC_ERRORS.PARSE_ERROR, 'Invalid JSON'),\n 400\n )\n }\n\n // Validate JSON-RPC structure\n if (body.jsonrpc !== '2.0' || !body.method) {\n return jsonResponse(\n jsonRpcError(body?.id, JSON_RPC_ERRORS.INVALID_REQUEST, 'Invalid JSON-RPC request')\n )\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 return await handleTasksSend(id, params as Record<string, unknown>, skills, llmConfig, echoMode)\n\n case 'tasks/sendSubscribe':\n case 'message/stream':\n case 'SendStreamingMessage':\n return await handleTasksSendSubscribe(\n id,\n params as Record<string, unknown>,\n skills,\n llmConfig,\n echoMode\n )\n\n case 'tasks/get':\n case 'GetTask':\n return jsonResponse(\n jsonRpcError(\n id,\n JSON_RPC_ERRORS.TASK_NOT_FOUND,\n 'Task state not available in serverless mode. Use message/stream for streaming.'\n )\n )\n\n case 'tasks/cancel':\n case 'CancelTask':\n return jsonResponse(\n jsonRpcError(\n id,\n JSON_RPC_ERRORS.TASK_NOT_FOUND,\n 'Task cancellation not available in serverless mode.'\n )\n )\n\n case 'ping':\n return jsonResponse(jsonRpcSuccess(id, { pong: true }))\n\n default:\n return jsonResponse(\n jsonRpcError(id, JSON_RPC_ERRORS.METHOD_NOT_FOUND, `Method not found: ${method}`)\n )\n }\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`[A2A] Error in ${method}:`, errorMessage)\n return jsonResponse(jsonRpcError(id, JSON_RPC_ERRORS.INTERNAL_ERROR, errorMessage))\n }\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Method Handlers\n// ═══════════════════════════════════════════════════════════════════════════════\n\nasync function handleTasksSend(\n id: string | number | undefined,\n params: Record<string, unknown>,\n skills: SkillConfig[],\n llmConfig: LLMConfig,\n echoMode: boolean\n): Promise<Response> {\n const { skillId, message, contextId, metadata } = extractSendParams(params)\n const skill = resolveSkill(skillId, skills, echoMode)\n const resolvedContextId = contextId || uuidv4()\n const taskId = generateTaskId()\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 return jsonResponse(\n jsonRpcSuccess(id, {\n task: {\n id: taskId,\n contextId: resolvedContextId,\n status: { state: 'completed', timestamp: new Date().toISOString() },\n artifacts: (result.artifacts || []).map(toSpecArtifact),\n metadata,\n },\n })\n )\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n return jsonResponse(\n jsonRpcError(id, JSON_RPC_ERRORS.INTERNAL_ERROR, `Task execution failed: ${errorMessage}`)\n )\n }\n}\n\nasync function handleTasksSendSubscribe(\n id: string | number | undefined,\n params: Record<string, unknown>,\n skills: SkillConfig[],\n llmConfig: LLMConfig,\n echoMode: boolean\n): Promise<Response> {\n const { skillId, message, contextId, metadata } = extractSendParams(params)\n const skill = resolveSkill(skillId, skills, echoMode)\n const resolvedContextId = contextId || uuidv4()\n const taskId = generateTaskId()\n\n const stream = new ReadableStream({\n async start(controller) {\n const encoder = new TextEncoder()\n\n const sendStreamResponse = (result: Record<string, unknown>) => {\n const rpcResponse = { jsonrpc: '2.0' as const, id, result }\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(rpcResponse)}\\n\\n`))\n }\n\n sendStreamResponse({\n task: {\n id: taskId,\n contextId: resolvedContextId,\n status: { state: 'submitted', timestamp: new Date().toISOString() },\n },\n })\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\n const callbacks = {\n onChunk: async (text: string) => {\n sendStreamResponse({\n artifactUpdate: {\n taskId,\n contextId: resolvedContextId,\n artifact: { artifactId, name: 'response', parts: [{ text }] },\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: { artifactId, name: 'response', parts: [{ text: '' }] },\n append: true,\n lastChunk: true,\n },\n })\n sendStreamResponse({\n statusUpdate: {\n taskId,\n contextId: resolvedContextId,\n status: { state: 'completed', timestamp: new Date().toISOString() },\n },\n })\n controller.close()\n },\n onError: async (error: Error) => {\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 controller.close()\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 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 controller.close()\n }\n },\n })\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n 'Access-Control-Allow-Origin': '*',\n },\n })\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Utility: Combined Handler\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Create both handlers with shared configuration\n *\n * @example\n * ```typescript\n * const { agentCardHandler, a2aHandler } = createHandlers({\n * name: 'My Agent',\n * echoMode: true,\n * })\n * ```\n */\nexport function createHandlers(config: VercelA2AConfig) {\n return {\n agentCardHandler: createAgentCardHandler(config),\n a2aHandler: createA2AHandler(config),\n }\n}\n","/**\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. alibaba/qwen3.5-flash) 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 * 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 Timely, a time-focused AI assistant. You help with time, date, timezone, and scheduling questions. Use the available time tools to provide accurate answers. If asked about topics unrelated to time, dates, timezones, or scheduling, politely explain that you specialize in time-related queries and suggest rephrasing the question in a time-related context.`,\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 * Vercel AI Gateway is the primary path (set AI_GATEWAY_API_KEY).\n * Falls back to direct provider SDKs (openai/anthropic) for non-gateway models.\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 =\n config.gatewayModel ||\n (config.model.includes('/') ? config.model : `${config.provider}/${config.model}`)\n return gateway(modelId)\n }\n\n // Gateway-format models (e.g. alibaba/qwen3.5-flash) require the AI Gateway\n if (config.model.includes('/')) {\n throw new Error(\n `Model \"${config.model}\" requires Vercel AI Gateway. Set AI_GATEWAY_API_KEY to use gateway models, or use a direct provider model (e.g., --model gpt-4o-mini --provider openai).`\n )\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 * 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 * 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: 'Time Chat',\n description: 'Conversational assistant for time, date, timezone, and scheduling questions',\n systemPrompt:\n 'You are Timely, a time-focused AI assistant. You help with time, date, timezone, and scheduling questions. Use the available time tools to provide accurate answers. If asked about topics unrelated to time, dates, timezones, or scheduling, politely explain that you specialize in time-related queries and suggest rephrasing the question in a time-related context.',\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\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: 'alibaba/qwen3.5-flash',\n gatewayModel: 'alibaba/qwen3.5-flash',\n temperature: 0.7,\n maxOutputTokens: 4096,\n}\n","/**\n * Vercel A2A Configuration\n *\n * Configuration types and helpers for deploying A2A agents to Vercel.\n */\n\nimport type { SkillConfig, LLMConfig, Skill } from '../types.js'\nimport { DEFAULT_SKILLS, DEFAULT_LLM_CONFIG } from '../default-skills.js'\n\n// Re-export for convenience\nexport { DEFAULT_SKILLS, DEFAULT_LLM_CONFIG }\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Configuration Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface VercelA2AConfig {\n /** Agent name displayed in the agent card */\n name: string\n\n /** Agent description */\n description?: string\n\n /** Agent version (default: \"1.0.0\") */\n version?: string\n\n /** Custom skills (defaults to time/*, chat, echo) */\n skills?: SkillConfig[]\n\n /** Provider information */\n provider?: {\n organization: string\n url?: string\n }\n\n /** URL where the agent is deployed (for agent card) */\n agentUrl?: string\n\n /** Default input modes for agent card (MIME types) */\n defaultInputModes?: string[]\n\n /** Default output modes for agent card (MIME types) */\n defaultOutputModes?: string[]\n\n /** Run in echo mode (no LLM, for testing) */\n echoMode?: boolean\n\n /** LLM configuration (required unless echoMode is true) */\n llmConfig?: LLMConfig\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Configuration Helpers\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Resolve configuration with defaults\n */\nexport function resolveConfig(config: VercelA2AConfig): Required<\n Pick<\n VercelA2AConfig,\n 'name' | 'description' | 'version' | 'skills' | 'echoMode' | 'defaultInputModes' | 'defaultOutputModes'\n >\n> & {\n provider: { organization: string; url?: string }\n llmConfig: LLMConfig\n agentUrl?: string\n} {\n return {\n name: config.name,\n description: config.description || `A2A Agent: ${config.name}`,\n version: config.version || '1.0.0',\n skills: config.skills || DEFAULT_SKILLS,\n provider: config.provider || { organization: 'Runtype', url: 'https://runtype.com' },\n defaultInputModes: config.defaultInputModes || ['text/plain', 'application/json'],\n defaultOutputModes: config.defaultOutputModes || ['text/plain', 'application/json'],\n echoMode: config.echoMode ?? false,\n llmConfig: config.llmConfig || DEFAULT_LLM_CONFIG,\n agentUrl: config.agentUrl,\n }\n}\n\n/**\n * Convert SkillConfig to A2A Skill format for agent card\n */\nexport function toAgentCardSkills(skills: SkillConfig[]): Skill[] {\n return skills.map((s) => ({\n id: s.id,\n name: s.name,\n description: s.description,\n tags: s.tags ?? [],\n examples: [],\n }))\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "@runtypelabs/timely-a2a",
3
+ "version": "0.3.3",
4
+ "description": "Timely - Time-focused A2A agent with deterministic time tools and LLM-powered time chat",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "bin": {
10
+ "timely-a2a": "./dist/cli.js"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js",
16
+ "default": "./dist/index.js"
17
+ },
18
+ "./vercel": {
19
+ "types": "./dist/vercel/index.d.ts",
20
+ "import": "./dist/vercel/index.js",
21
+ "default": "./dist/vercel/index.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsup",
30
+ "dev": "tsup --watch",
31
+ "start": "node dist/cli.js",
32
+ "test:e2e": "tsx src/e2e-test.ts",
33
+ "clean": "rm -rf dist",
34
+ "changeset": "changeset",
35
+ "version-packages": "changeset version",
36
+ "release": "changeset publish",
37
+ "prepublishOnly": "pnpm run clean && pnpm run build",
38
+ "typecheck": "tsc --noEmit"
39
+ },
40
+ "keywords": [
41
+ "a2a",
42
+ "agent-to-agent",
43
+ "ai-agent",
44
+ "llm",
45
+ "ai-sdk",
46
+ "runtype",
47
+ "vercel",
48
+ "serverless"
49
+ ],
50
+ "author": "Runtype",
51
+ "license": "MIT",
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "https://github.com/runtypelabs/timely-a2a"
55
+ },
56
+ "homepage": "https://github.com/runtypelabs/timely-a2a",
57
+ "bugs": {
58
+ "url": "https://github.com/runtypelabs/timely-a2a/issues"
59
+ },
60
+ "engines": {
61
+ "node": ">=18.0.0"
62
+ },
63
+ "packageManager": "pnpm@10.28.0",
64
+ "publishConfig": {
65
+ "access": "public"
66
+ },
67
+ "dependencies": {
68
+ "@ai-sdk/anthropic": "^3.0.46",
69
+ "@ai-sdk/gateway": "^1.0.0",
70
+ "@ai-sdk/openai": "^3.0.30",
71
+ "ai": "^6.0.0",
72
+ "commander": "^12.1.0",
73
+ "date-fns": "^3.6.0",
74
+ "date-fns-tz": "^3.1.3",
75
+ "express": "^5.2.1",
76
+ "uuid": "^11.1.0"
77
+ },
78
+ "devDependencies": {
79
+ "@changesets/cli": "^2.29.8",
80
+ "@types/express": "^5.0.6",
81
+ "@types/node": "^22.15.21",
82
+ "@types/uuid": "^10.0.0",
83
+ "tsup": "^8.5.0",
84
+ "tsx": "^4.21.0",
85
+ "typescript": "^5.8.3"
86
+ }
87
+ }