@runtypelabs/a2a-aisdk-example 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # @runtypelabs/a2a-agent-example
1
+ # @runtypelabs/a2a-aisdk-example
2
2
 
3
3
  Reference A2A agent implementation with **deterministic time tools** and LLM-powered chat.
4
4
 
@@ -19,7 +19,7 @@ This agent includes deterministic time skills that compute answers from the syst
19
19
 
20
20
  ```bash
21
21
  # Using CLI
22
- npx a2a-agent-example serve --echo
22
+ npx @runtypelabs/a2a-aisdk-example serve --echo
23
23
  ```
24
24
 
25
25
  This starts a server at:
@@ -51,26 +51,42 @@ curl -X POST http://localhost:9999/a2a \
51
51
 
52
52
  ```bash
53
53
  # OpenAI
54
- OPENAI_API_KEY=sk-xxx npx a2a-agent-example serve
54
+ OPENAI_API_KEY=sk-xxx npx @runtypelabs/a2a-aisdk-example serve
55
55
 
56
56
  # Anthropic
57
- ANTHROPIC_API_KEY=sk-xxx npx a2a-agent-example serve --provider anthropic --model claude-3-haiku-20240307
57
+ ANTHROPIC_API_KEY=sk-xxx npx @runtypelabs/a2a-aisdk-example serve --provider anthropic --model claude-3-haiku-20240307
58
58
  ```
59
59
 
60
60
  ### Test an A2A Endpoint
61
61
 
62
+ The server must be running first. Use two terminals:
63
+
64
+ **Terminal 1** — start the server:
65
+
62
66
  ```bash
63
- # Test local server
64
- npx a2a-agent-example test http://localhost:9999
67
+ # Echo mode (no API key needed)
68
+ npx @runtypelabs/a2a-aisdk-example serve --echo
65
69
 
66
- # Test with streaming
67
- npx a2a-agent-example test http://localhost:9999 --stream --skill chat --message "What is AI?"
70
+ # Or with LLM (requires OPENAI_API_KEY or ANTHROPIC_API_KEY)
71
+ OPENAI_API_KEY=sk-xxx npx @runtypelabs/a2a-aisdk-example serve
68
72
  ```
69
73
 
74
+ **Terminal 2** — run the test:
75
+
76
+ ```bash
77
+ # Test echo (works with echo mode)
78
+ npx @runtypelabs/a2a-aisdk-example test http://localhost:9999
79
+
80
+ # Test with streaming (chat requires LLM mode + API key)
81
+ npx @runtypelabs/a2a-aisdk-example test http://localhost:9999 --stream --skill chat --message "What is AI?"
82
+ ```
83
+
84
+ > Run `npx @runtypelabs/a2a-aisdk-example --help` to see all commands and options.
85
+
70
86
  ### Test Runtype A2A Surface
71
87
 
72
88
  ```bash
73
- npx a2a-agent-example test-runtype \
89
+ npx @runtypelabs/a2a-aisdk-example test-runtype \
74
90
  --product-id prod_xxx \
75
91
  --surface-id surf_xxx \
76
92
  --api-key a2a_xxx \
@@ -108,7 +124,7 @@ Time tools return structured responses with a `computed.method: "deterministic"`
108
124
  Example prompt that triggers tool use from `chat`:
109
125
 
110
126
  ```bash
111
- npx a2a-agent-example test http://localhost:9999 \
127
+ npx @runtypelabs/a2a-aisdk-example test http://localhost:9999 \
112
128
  --skill chat \
113
129
  --message "What day of the week is 2026-02-09 in UTC?"
114
130
  ```
@@ -120,7 +136,7 @@ npx a2a-agent-example test http://localhost:9999 \
120
136
  1. Start the A2A server:
121
137
 
122
138
  ```bash
123
- npx a2a-agent-example serve --echo --port 9999
139
+ npx @runtypelabs/a2a-aisdk-example serve --echo --port 9999
124
140
  ```
125
141
 
126
142
  2. In Runtype Dashboard:
@@ -138,7 +154,7 @@ npx a2a-agent-example test http://localhost:9999 \
138
154
  3. Generate an API key for the surface
139
155
  4. Test with the CLI:
140
156
  ```bash
141
- npx a2a-agent-example test-runtype \
157
+ npx @runtypelabs/a2a-aisdk-example test-runtype \
142
158
  --product-id prod_xxx \
143
159
  --surface-id surf_xxx \
144
160
  --api-key a2a_xxx \
@@ -150,7 +166,7 @@ npx a2a-agent-example test http://localhost:9999 \
150
166
  ### Create a Server
151
167
 
152
168
  ```typescript
153
- import { createA2AServer } from '@runtypelabs/a2a-agent-example'
169
+ import { createA2AServer } from '@runtypelabs/a2a-aisdk-example'
154
170
 
155
171
  const server = createA2AServer({
156
172
  config: {
@@ -176,7 +192,7 @@ process.on('SIGINT', async () => {
176
192
  ### Create a Client
177
193
 
178
194
  ```typescript
179
- import { A2AClient } from '@runtypelabs/a2a-agent-example'
195
+ import { A2AClient } from '@runtypelabs/a2a-aisdk-example'
180
196
 
181
197
  const client = new A2AClient({
182
198
  baseUrl: 'http://localhost:9999',
@@ -204,7 +220,7 @@ console.log('Response:', task.artifacts?.[0]?.parts?.[0]?.text)
204
220
  ### Test Runtype Surface
205
221
 
206
222
  ```typescript
207
- import { createRuntypeA2AClient } from '@runtypelabs/a2a-agent-example'
223
+ import { createRuntypeA2AClient } from '@runtypelabs/a2a-aisdk-example'
208
224
 
209
225
  const client = createRuntypeA2AClient({
210
226
  productId: 'prod_xxx',
@@ -231,10 +247,12 @@ await client.sendTaskStreaming(
231
247
 
232
248
  ## CLI Reference
233
249
 
250
+ Run `npx @runtypelabs/a2a-aisdk-example --help` for all commands and options.
251
+
234
252
  ### `serve` - Start A2A Server
235
253
 
236
254
  ```
237
- Usage: a2a-agent-example serve [options]
255
+ Usage: a2a-aisdk-example serve [options]
238
256
 
239
257
  Options:
240
258
  -p, --port <port> Port to listen on (default: "9999")
@@ -249,7 +267,7 @@ Options:
249
267
  ### `test` - Test A2A Endpoint
250
268
 
251
269
  ```
252
- Usage: a2a-agent-example test [options] <url>
270
+ Usage: a2a-aisdk-example test [options] <url>
253
271
 
254
272
  Arguments:
255
273
  url Base URL of the A2A endpoint
@@ -264,7 +282,7 @@ Options:
264
282
  ### `test-runtype` - Test Runtype A2A Surface
265
283
 
266
284
  ```
267
- Usage: a2a-agent-example test-runtype [options]
285
+ Usage: a2a-aisdk-example test-runtype [options]
268
286
 
269
287
  Options:
270
288
  --product-id <id> Runtype product ID (required)
@@ -312,7 +330,7 @@ Install the package and use the Vercel handlers:
312
330
 
313
331
  ```typescript
314
332
  // app/api/a2a/route.ts
315
- import { createA2AHandler } from '@runtypelabs/a2a-agent-example/vercel'
333
+ import { createA2AHandler } from '@runtypelabs/a2a-aisdk-example/vercel'
316
334
 
317
335
  export const POST = createA2AHandler({
318
336
  name: 'My Agent',
@@ -320,7 +338,7 @@ export const POST = createA2AHandler({
320
338
  })
321
339
 
322
340
  // app/.well-known/agent.json/route.ts
323
- import { createAgentCardHandler } from '@runtypelabs/a2a-agent-example/vercel'
341
+ import { createAgentCardHandler } from '@runtypelabs/a2a-aisdk-example/vercel'
324
342
 
325
343
  export const GET = createAgentCardHandler({
326
344
  name: 'My Agent',
@@ -621,15 +621,16 @@ function createA2AServer(options) {
621
621
  const { config, llmConfig = DEFAULT_LLM_CONFIG, echoMode = false } = options;
622
622
  const app = express();
623
623
  app.use(express.json());
624
- app.use((_req, res, next) => {
624
+ app.use((req, res, next) => {
625
625
  res.header("Access-Control-Allow-Origin", "*");
626
626
  res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
627
627
  res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-API-Key");
628
+ if (req.method === "OPTIONS") {
629
+ res.sendStatus(204);
630
+ return;
631
+ }
628
632
  next();
629
633
  });
630
- app.options("*", (_req, res) => {
631
- res.sendStatus(204);
632
- });
633
634
  const port = config.port || 9999;
634
635
  const host = config.host || "localhost";
635
636
  const skills = config.skills || DEFAULT_SKILLS;
@@ -1150,4 +1151,4 @@ export {
1150
1151
  A2AClient,
1151
1152
  createRuntypeA2AClient
1152
1153
  };
1153
- //# sourceMappingURL=chunk-OLB7ZZNY.js.map
1154
+ //# sourceMappingURL=chunk-FTWT3LGM.js.map
@@ -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://a2aproject.github.io/A2A/specification/\n */\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Agent Card\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface AgentCard {\n name: string\n description: string\n url: string\n version: string\n protocolVersion: string\n defaultInputModes: Array<'text' | 'file' | 'data'>\n defaultOutputModes: Array<'text' | 'file' | 'data'>\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: Array<'text' | 'file' | 'data'>\n outputModes: Array<'text' | 'file' | 'data'>\n tags: 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 // Custom A2A errors\n TASK_NOT_FOUND: -32001,\n SKILL_NOT_FOUND: -32002,\n UNAUTHORIZED: -32003,\n RATE_LIMITED: -32004,\n TASK_CANCELED: -32005,\n} as const\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Messages\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface MessagePart {\n type: 'text' | 'file' | 'data'\n text?: string\n data?: unknown\n mimeType?: string\n uri?: string\n}\n\nexport interface A2AMessage {\n role: 'user' | 'agent'\n parts: MessagePart[]\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Tasks\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport type TaskStatus = 'submitted' | 'working' | 'completed' | 'failed' | 'canceled'\n\nexport interface Task {\n id: string\n contextId?: string\n status: TaskStatus\n artifacts?: Artifact[]\n error?: { message: string }\n metadata?: Record<string, unknown>\n}\n\nexport interface Artifact {\n name: string\n parts: MessagePart[]\n index?: number\n append?: boolean\n lastChunk?: boolean\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\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}\n\nexport interface TasksGetParams {\n taskId: string\n includeHistory?: boolean\n}\n\nexport interface TasksCancelParams {\n taskId: string\n reason?: string\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// SSE Events\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface TaskStatusEvent {\n taskId: string\n contextId?: string\n status: TaskStatus\n message?: string\n final?: boolean\n}\n\nexport interface TaskArtifactEvent {\n taskId: string\n artifact: Artifact\n}\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) {\n return part.data as Record<string, unknown>\n }\n if (part.type === 'text' && 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 */\nfunction extractTextFromMessage(message: ExecutorContext['message']): string {\n return message.parts\n .filter((p) => p.type === 'text' && 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.\n * Provides agent card discovery and JSON-RPC task execution endpoints.\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 Task,\n TasksSendParams,\n TasksGetParams,\n TasksCancelParams,\n TaskHistoryEntry,\n ExecutorContext,\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 { DEFAULT_SKILLS, DEFAULT_LLM_CONFIG } from './default-skills.js'\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════════\n\nconst A2A_PROTOCOL_VERSION = '0.3'\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// In-Memory Storage\n// ═══════════════════════════════════════════════════════════════════════════════\n\ninterface StoredTask extends Task {\n skillId: string\n requestMessage: A2AMessage\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 // Build agent card\n const agentCard: AgentCard = {\n name: config.name,\n description: config.description || `A2A Agent: ${config.name}`,\n url: `http://${host}:${port}/a2a`,\n version: config.version || '1.0.0',\n protocolVersion: A2A_PROTOCOL_VERSION,\n defaultInputModes: config.defaultInputModes || ['text', 'data'],\n defaultOutputModes: config.defaultOutputModes || ['text', 'data'],\n provider: config.provider || {\n organization: 'Runtype',\n url: 'https://runtype.com',\n },\n capabilities: {\n streaming: true,\n pushNotifications: false,\n statefulness: 'task',\n },\n skills: skills.map((s) => ({\n id: s.id,\n name: s.name,\n description: s.description,\n inputModes: ['text', 'data'],\n outputModes: ['text', 'data'],\n tags: s.tags ?? [],\n inputSchema: s.inputSchema,\n })),\n authentication: {\n type: 'none',\n },\n }\n\n // ═══════════════════════════════════════════════════════════════════════════════\n // Routes\n // ═══════════════════════════════════════════════════════════════════════════════\n\n // Agent Card discovery\n app.get('/.well-known/agent.json', (_req: Request, res: Response) => {\n res.setHeader('Cache-Control', 'public, max-age=3600')\n res.json(agentCard)\n })\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 await handleTasksSend(req, res, id, params as TasksSendParams, skills, llmConfig, echoMode)\n break\n\n case 'tasks/sendSubscribe':\n await handleTasksSendSubscribe(req, res, id, params as TasksSendParams, skills, llmConfig, echoMode)\n break\n\n case 'tasks/get':\n handleTasksGet(res, id, params as TasksGetParams)\n break\n\n case 'tasks/cancel':\n handleTasksCancel(res, id, params as TasksCancelParams)\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.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\nasync function handleTasksSend(\n _req: Request,\n res: Response,\n id: string | number | undefined,\n params: TasksSendParams,\n skills: SkillConfig[],\n llmConfig: LLMConfig,\n echoMode: boolean\n) {\n const { skill: skillId, message, contextId, metadata } = params\n\n // Find skill\n const skill = skills.find((s) => s.id === skillId)\n if (!skill) {\n res.json(\n jsonRpcError(id, JSON_RPC_ERRORS.SKILL_NOT_FOUND, `Skill not found: ${skillId}`, {\n availableSkills: skills.map((s) => s.id),\n })\n )\n return\n }\n\n // Create task\n const taskId = generateTaskId()\n const task: StoredTask = {\n id: taskId,\n contextId,\n status: 'submitted',\n skillId,\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 // Update to working\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,\n skill,\n message,\n metadata,\n }\n\n // Execute task — route by skill type\n let result\n if (skillId.startsWith('time/')) {\n result = await executeTimeSkill(context)\n } else if (echoMode || skillId === 'echo') {\n result = await executeEcho(context)\n } else {\n result = await executeTask(context, llmConfig, skills)\n }\n\n // Update task\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,\n status: 'completed',\n artifacts: task.artifacts,\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: TasksSendParams,\n skills: SkillConfig[],\n llmConfig: LLMConfig,\n echoMode: boolean\n) {\n const { skill: skillId, message, contextId, metadata } = params\n\n // Find skill\n const skill = skills.find((s) => s.id === skillId)\n if (!skill) {\n res.json(\n jsonRpcError(id, JSON_RPC_ERRORS.SKILL_NOT_FOUND, `Skill not found: ${skillId}`, {\n availableSkills: skills.map((s) => s.id),\n })\n )\n return\n }\n\n // Create task\n const taskId = generateTaskId()\n const task: StoredTask = {\n id: taskId,\n contextId,\n status: 'submitted',\n skillId,\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 // Set SSE headers\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 const sendEvent = (event: string, data: unknown) => {\n res.write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`)\n }\n\n // Send initial status\n sendEvent('task/status', { taskId, contextId, status: 'submitted' })\n\n // Update to working\n task.status = 'working'\n task.history.push({ status: 'working', message: 'Execution started', timestamp: new Date().toISOString() })\n sendEvent('task/status', { taskId, contextId, status: 'working' })\n\n try {\n const context: ExecutorContext = {\n taskId,\n contextId,\n skill,\n message,\n metadata,\n }\n\n let artifactIndex = 0\n let fullText = ''\n\n const callbacks = {\n onChunk: async (text: string) => {\n fullText += text\n sendEvent('task/artifact', {\n taskId,\n artifact: {\n name: 'response',\n parts: [{ type: 'text', text }],\n index: artifactIndex,\n append: artifactIndex > 0,\n lastChunk: false,\n },\n })\n artifactIndex++\n },\n onComplete: async () => {\n // Send final artifact marker\n sendEvent('task/artifact', {\n taskId,\n artifact: {\n name: 'response',\n parts: [{ type: 'text', text: '' }],\n index: artifactIndex,\n append: true,\n lastChunk: true,\n },\n })\n\n // Update task\n task.status = 'completed'\n task.artifacts = [{ name: 'response', parts: [{ type: 'text', text: fullText }] }]\n task.history.push({ status: 'completed', message: 'Task completed', timestamp: new Date().toISOString() })\n\n sendEvent('task/status', { taskId, contextId, status: 'completed', final: true })\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 sendEvent('task/error', { taskId, error: { code: -32603, message: error.message } })\n sendEvent('task/status', { taskId, contextId, status: 'failed', message: error.message, final: true })\n res.end()\n },\n }\n\n // Execute — time skills return immediately, others stream\n if (skillId.startsWith('time/')) {\n const timeResult = await executeTimeSkill(context)\n await callbacks.onChunk(timeResult.text)\n await callbacks.onComplete()\n } else if (echoMode || skillId === '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 sendEvent('task/error', { taskId, error: { code: -32603, message: errorMessage } })\n sendEvent('task/status', { taskId, contextId, status: 'failed', message: errorMessage, final: true })\n res.end()\n }\n}\n\nfunction handleTasksGet(res: Response, id: string | number | undefined, params: TasksGetParams) {\n const { taskId, includeHistory } = params\n\n const task = tasks.get(taskId)\n if (!task) {\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.TASK_NOT_FOUND, `Task not found: ${taskId}`))\n return\n }\n\n const result: {\n task: {\n id: string\n contextId?: string\n status: string\n artifacts?: Array<{ name: string; parts: Array<{ type: string; text?: string }> }>\n metadata?: Record<string, unknown>\n error?: { message: string }\n history?: TaskHistoryEntry[]\n }\n } = {\n task: {\n id: task.id,\n contextId: task.contextId,\n status: task.status,\n artifacts: task.artifacts,\n metadata: task.metadata,\n },\n }\n\n if (task.error) {\n result.task.error = task.error\n }\n\n if (includeHistory) {\n result.task.history = task.history\n }\n\n res.json(jsonRpcSuccess(id, result))\n}\n\nfunction handleTasksCancel(res: Response, id: string | number | undefined, params: TasksCancelParams) {\n const { taskId, reason } = params\n\n const task = tasks.get(taskId)\n if (!task) {\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.TASK_NOT_FOUND, `Task not found: ${taskId}`))\n return\n }\n\n if (['completed', 'failed', 'canceled'].includes(task.status)) {\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.TASK_CANCELED, `Task cannot be canceled: already ${task.status}`))\n return\n }\n\n task.status = 'canceled'\n task.history.push({\n status: 'canceled',\n message: reason || 'Canceled by request',\n timestamp: new Date().toISOString(),\n })\n\n res.json(jsonRpcSuccess(id, { task: { id: taskId, status: 'canceled' } }))\n}\n","/**\n * A2A Client\n *\n * Client for testing A2A protocol endpoints, including Runtype's A2A surfaces.\n */\n\nimport type {\n AgentCard,\n JsonRpcRequest,\n JsonRpcResponse,\n TasksSendParams,\n Task,\n Artifact,\n TaskStatusEvent,\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.json`\n this.apiKey = options.apiKey\n this.headers = options.headers || {}\n }\n\n /**\n * Get the agent card for discovery\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 /**\n * Send a task and wait for completion (synchronous)\n */\n async sendTask(params: TasksSendParams): Promise<Task> {\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: `req_${Date.now()}`,\n method: 'tasks/send',\n 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 /**\n * Send a task with streaming (SSE)\n */\n async sendTaskStreaming(\n params: TasksSendParams,\n callbacks: {\n onStatus?: (status: string, data: TaskStatusEvent) => 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: 'tasks/sendSubscribe',\n params,\n }\n\n const response = await fetch(`${this.baseUrl}/a2a`, {\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\n // Parse SSE events\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n let currentEvent = ''\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n currentEvent = line.substring(7)\n } else if (line.startsWith('data: ')) {\n const data = JSON.parse(line.substring(6))\n\n switch (currentEvent) {\n case 'task/status':\n callbacks.onStatus?.(data.status, data)\n break\n case 'task/artifact':\n callbacks.onArtifact?.(data.artifact)\n // Extract text for convenience\n if (data.artifact?.parts) {\n for (const part of data.artifact.parts) {\n if (part.type === 'text' && part.text) {\n callbacks.onChunk?.(part.text)\n }\n }\n }\n break\n case 'task/error':\n callbacks.onError?.(data.error)\n break\n }\n }\n }\n }\n }\n\n /**\n * Get task status\n */\n async getTask(taskId: string, includeHistory = false): Promise<Task> {\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: `req_${Date.now()}`,\n method: 'tasks/get',\n params: { taskId, includeHistory },\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 * Cancel a task\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: 'tasks/cancel',\n params: { taskId, reason },\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 * Send a JSON-RPC request\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 /**\n * Get headers for requests\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-FTWT3LGM.js";
7
7
 
8
8
  // src/cli.ts
9
9
  import { Command } from "commander";
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-FTWT3LGM.js";
15
15
  export {
16
16
  A2AClient,
17
17
  DEFAULT_LLM_CONFIG,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runtypelabs/a2a-aisdk-example",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "description": "Example A2A (Agent-to-Agent) protocol server for testing and reference implementation",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1 +0,0 @@
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://a2aproject.github.io/A2A/specification/\n */\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Agent Card\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface AgentCard {\n name: string\n description: string\n url: string\n version: string\n protocolVersion: string\n defaultInputModes: Array<'text' | 'file' | 'data'>\n defaultOutputModes: Array<'text' | 'file' | 'data'>\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: Array<'text' | 'file' | 'data'>\n outputModes: Array<'text' | 'file' | 'data'>\n tags: 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 // Custom A2A errors\n TASK_NOT_FOUND: -32001,\n SKILL_NOT_FOUND: -32002,\n UNAUTHORIZED: -32003,\n RATE_LIMITED: -32004,\n TASK_CANCELED: -32005,\n} as const\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Messages\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface MessagePart {\n type: 'text' | 'file' | 'data'\n text?: string\n data?: unknown\n mimeType?: string\n uri?: string\n}\n\nexport interface A2AMessage {\n role: 'user' | 'agent'\n parts: MessagePart[]\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Tasks\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport type TaskStatus = 'submitted' | 'working' | 'completed' | 'failed' | 'canceled'\n\nexport interface Task {\n id: string\n contextId?: string\n status: TaskStatus\n artifacts?: Artifact[]\n error?: { message: string }\n metadata?: Record<string, unknown>\n}\n\nexport interface Artifact {\n name: string\n parts: MessagePart[]\n index?: number\n append?: boolean\n lastChunk?: boolean\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\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}\n\nexport interface TasksGetParams {\n taskId: string\n includeHistory?: boolean\n}\n\nexport interface TasksCancelParams {\n taskId: string\n reason?: string\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// SSE Events\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface TaskStatusEvent {\n taskId: string\n contextId?: string\n status: TaskStatus\n message?: string\n final?: boolean\n}\n\nexport interface TaskArtifactEvent {\n taskId: string\n artifact: Artifact\n}\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) {\n return part.data as Record<string, unknown>\n }\n if (part.type === 'text' && 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 */\nfunction extractTextFromMessage(message: ExecutorContext['message']): string {\n return message.parts\n .filter((p) => p.type === 'text' && 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.\n * Provides agent card discovery and JSON-RPC task execution endpoints.\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 Task,\n TasksSendParams,\n TasksGetParams,\n TasksCancelParams,\n TaskHistoryEntry,\n ExecutorContext,\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 { DEFAULT_SKILLS, DEFAULT_LLM_CONFIG } from './default-skills.js'\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════════\n\nconst A2A_PROTOCOL_VERSION = '0.3'\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// In-Memory Storage\n// ═══════════════════════════════════════════════════════════════════════════════\n\ninterface StoredTask extends Task {\n skillId: string\n requestMessage: A2AMessage\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\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 next()\n })\n\n app.options('*', (_req, res) => {\n res.sendStatus(204)\n })\n\n const port = config.port || 9999\n const host = config.host || 'localhost'\n const skills = config.skills || DEFAULT_SKILLS\n\n // Build agent card\n const agentCard: AgentCard = {\n name: config.name,\n description: config.description || `A2A Agent: ${config.name}`,\n url: `http://${host}:${port}/a2a`,\n version: config.version || '1.0.0',\n protocolVersion: A2A_PROTOCOL_VERSION,\n defaultInputModes: config.defaultInputModes || ['text', 'data'],\n defaultOutputModes: config.defaultOutputModes || ['text', 'data'],\n provider: config.provider || {\n organization: 'Runtype',\n url: 'https://runtype.com',\n },\n capabilities: {\n streaming: true,\n pushNotifications: false,\n statefulness: 'task',\n },\n skills: skills.map((s) => ({\n id: s.id,\n name: s.name,\n description: s.description,\n inputModes: ['text', 'data'],\n outputModes: ['text', 'data'],\n tags: s.tags ?? [],\n inputSchema: s.inputSchema,\n })),\n authentication: {\n type: 'none',\n },\n }\n\n // ═══════════════════════════════════════════════════════════════════════════════\n // Routes\n // ═══════════════════════════════════════════════════════════════════════════════\n\n // Agent Card discovery\n app.get('/.well-known/agent.json', (_req: Request, res: Response) => {\n res.setHeader('Cache-Control', 'public, max-age=3600')\n res.json(agentCard)\n })\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 await handleTasksSend(req, res, id, params as TasksSendParams, skills, llmConfig, echoMode)\n break\n\n case 'tasks/sendSubscribe':\n await handleTasksSendSubscribe(req, res, id, params as TasksSendParams, skills, llmConfig, echoMode)\n break\n\n case 'tasks/get':\n handleTasksGet(res, id, params as TasksGetParams)\n break\n\n case 'tasks/cancel':\n handleTasksCancel(res, id, params as TasksCancelParams)\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.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\nasync function handleTasksSend(\n _req: Request,\n res: Response,\n id: string | number | undefined,\n params: TasksSendParams,\n skills: SkillConfig[],\n llmConfig: LLMConfig,\n echoMode: boolean\n) {\n const { skill: skillId, message, contextId, metadata } = params\n\n // Find skill\n const skill = skills.find((s) => s.id === skillId)\n if (!skill) {\n res.json(\n jsonRpcError(id, JSON_RPC_ERRORS.SKILL_NOT_FOUND, `Skill not found: ${skillId}`, {\n availableSkills: skills.map((s) => s.id),\n })\n )\n return\n }\n\n // Create task\n const taskId = generateTaskId()\n const task: StoredTask = {\n id: taskId,\n contextId,\n status: 'submitted',\n skillId,\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 // Update to working\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,\n skill,\n message,\n metadata,\n }\n\n // Execute task — route by skill type\n let result\n if (skillId.startsWith('time/')) {\n result = await executeTimeSkill(context)\n } else if (echoMode || skillId === 'echo') {\n result = await executeEcho(context)\n } else {\n result = await executeTask(context, llmConfig, skills)\n }\n\n // Update task\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,\n status: 'completed',\n artifacts: task.artifacts,\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: TasksSendParams,\n skills: SkillConfig[],\n llmConfig: LLMConfig,\n echoMode: boolean\n) {\n const { skill: skillId, message, contextId, metadata } = params\n\n // Find skill\n const skill = skills.find((s) => s.id === skillId)\n if (!skill) {\n res.json(\n jsonRpcError(id, JSON_RPC_ERRORS.SKILL_NOT_FOUND, `Skill not found: ${skillId}`, {\n availableSkills: skills.map((s) => s.id),\n })\n )\n return\n }\n\n // Create task\n const taskId = generateTaskId()\n const task: StoredTask = {\n id: taskId,\n contextId,\n status: 'submitted',\n skillId,\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 // Set SSE headers\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 const sendEvent = (event: string, data: unknown) => {\n res.write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`)\n }\n\n // Send initial status\n sendEvent('task/status', { taskId, contextId, status: 'submitted' })\n\n // Update to working\n task.status = 'working'\n task.history.push({ status: 'working', message: 'Execution started', timestamp: new Date().toISOString() })\n sendEvent('task/status', { taskId, contextId, status: 'working' })\n\n try {\n const context: ExecutorContext = {\n taskId,\n contextId,\n skill,\n message,\n metadata,\n }\n\n let artifactIndex = 0\n let fullText = ''\n\n const callbacks = {\n onChunk: async (text: string) => {\n fullText += text\n sendEvent('task/artifact', {\n taskId,\n artifact: {\n name: 'response',\n parts: [{ type: 'text', text }],\n index: artifactIndex,\n append: artifactIndex > 0,\n lastChunk: false,\n },\n })\n artifactIndex++\n },\n onComplete: async () => {\n // Send final artifact marker\n sendEvent('task/artifact', {\n taskId,\n artifact: {\n name: 'response',\n parts: [{ type: 'text', text: '' }],\n index: artifactIndex,\n append: true,\n lastChunk: true,\n },\n })\n\n // Update task\n task.status = 'completed'\n task.artifacts = [{ name: 'response', parts: [{ type: 'text', text: fullText }] }]\n task.history.push({ status: 'completed', message: 'Task completed', timestamp: new Date().toISOString() })\n\n sendEvent('task/status', { taskId, contextId, status: 'completed', final: true })\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 sendEvent('task/error', { taskId, error: { code: -32603, message: error.message } })\n sendEvent('task/status', { taskId, contextId, status: 'failed', message: error.message, final: true })\n res.end()\n },\n }\n\n // Execute — time skills return immediately, others stream\n if (skillId.startsWith('time/')) {\n const timeResult = await executeTimeSkill(context)\n await callbacks.onChunk(timeResult.text)\n await callbacks.onComplete()\n } else if (echoMode || skillId === '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 sendEvent('task/error', { taskId, error: { code: -32603, message: errorMessage } })\n sendEvent('task/status', { taskId, contextId, status: 'failed', message: errorMessage, final: true })\n res.end()\n }\n}\n\nfunction handleTasksGet(res: Response, id: string | number | undefined, params: TasksGetParams) {\n const { taskId, includeHistory } = params\n\n const task = tasks.get(taskId)\n if (!task) {\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.TASK_NOT_FOUND, `Task not found: ${taskId}`))\n return\n }\n\n const result: {\n task: {\n id: string\n contextId?: string\n status: string\n artifacts?: Array<{ name: string; parts: Array<{ type: string; text?: string }> }>\n metadata?: Record<string, unknown>\n error?: { message: string }\n history?: TaskHistoryEntry[]\n }\n } = {\n task: {\n id: task.id,\n contextId: task.contextId,\n status: task.status,\n artifacts: task.artifacts,\n metadata: task.metadata,\n },\n }\n\n if (task.error) {\n result.task.error = task.error\n }\n\n if (includeHistory) {\n result.task.history = task.history\n }\n\n res.json(jsonRpcSuccess(id, result))\n}\n\nfunction handleTasksCancel(res: Response, id: string | number | undefined, params: TasksCancelParams) {\n const { taskId, reason } = params\n\n const task = tasks.get(taskId)\n if (!task) {\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.TASK_NOT_FOUND, `Task not found: ${taskId}`))\n return\n }\n\n if (['completed', 'failed', 'canceled'].includes(task.status)) {\n res.json(jsonRpcError(id, JSON_RPC_ERRORS.TASK_CANCELED, `Task cannot be canceled: already ${task.status}`))\n return\n }\n\n task.status = 'canceled'\n task.history.push({\n status: 'canceled',\n message: reason || 'Canceled by request',\n timestamp: new Date().toISOString(),\n })\n\n res.json(jsonRpcSuccess(id, { task: { id: taskId, status: 'canceled' } }))\n}\n","/**\n * A2A Client\n *\n * Client for testing A2A protocol endpoints, including Runtype's A2A surfaces.\n */\n\nimport type {\n AgentCard,\n JsonRpcRequest,\n JsonRpcResponse,\n TasksSendParams,\n Task,\n Artifact,\n TaskStatusEvent,\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.json`\n this.apiKey = options.apiKey\n this.headers = options.headers || {}\n }\n\n /**\n * Get the agent card for discovery\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 /**\n * Send a task and wait for completion (synchronous)\n */\n async sendTask(params: TasksSendParams): Promise<Task> {\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: `req_${Date.now()}`,\n method: 'tasks/send',\n 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 /**\n * Send a task with streaming (SSE)\n */\n async sendTaskStreaming(\n params: TasksSendParams,\n callbacks: {\n onStatus?: (status: string, data: TaskStatusEvent) => 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: 'tasks/sendSubscribe',\n params,\n }\n\n const response = await fetch(`${this.baseUrl}/a2a`, {\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\n // Parse SSE events\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n let currentEvent = ''\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n currentEvent = line.substring(7)\n } else if (line.startsWith('data: ')) {\n const data = JSON.parse(line.substring(6))\n\n switch (currentEvent) {\n case 'task/status':\n callbacks.onStatus?.(data.status, data)\n break\n case 'task/artifact':\n callbacks.onArtifact?.(data.artifact)\n // Extract text for convenience\n if (data.artifact?.parts) {\n for (const part of data.artifact.parts) {\n if (part.type === 'text' && part.text) {\n callbacks.onChunk?.(part.text)\n }\n }\n }\n break\n case 'task/error':\n callbacks.onError?.(data.error)\n break\n }\n }\n }\n }\n }\n\n /**\n * Get task status\n */\n async getTask(taskId: string, includeHistory = false): Promise<Task> {\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: `req_${Date.now()}`,\n method: 'tasks/get',\n params: { taskId, includeHistory },\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 * Cancel a task\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: 'tasks/cancel',\n params: { taskId, reason },\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 * Send a JSON-RPC request\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 /**\n * Get headers for requests\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":[]}