@machinemetrics/agent-event-protocol 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-WZD2VBMM.js → chunk-H5AXHRSE.js} +4 -2
- package/dist/chunk-H5AXHRSE.js.map +1 -0
- package/dist/{chunk-RSG7CUUT.js → chunk-VDBWUNSK.js} +2 -2
- package/dist/core.cjs +3 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +761 -176
- package/dist/core.d.ts +761 -176
- package/dist/core.js +1 -1
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/sse.cjs +3 -1
- package/dist/sse.cjs.map +1 -1
- package/dist/sse.d.cts +1 -1
- package/dist/sse.d.ts +1 -1
- package/dist/sse.js +2 -2
- package/dist/{types-CttB5bnC.d.cts → types--3D3jbpT.d.cts} +6 -2
- package/dist/{types-CttB5bnC.d.ts → types--3D3jbpT.d.ts} +6 -2
- package/package.json +10 -10
- package/dist/chunk-WZD2VBMM.js.map +0 -1
- /package/dist/{chunk-RSG7CUUT.js.map → chunk-VDBWUNSK.js.map} +0 -0
package/dist/core.js
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -65,7 +65,8 @@ var AssistantContentBlockSchema = import_zod.z.discriminatedUnion("type", [
|
|
|
65
65
|
toolCallId: import_zod.z.string(),
|
|
66
66
|
tool: import_zod.z.string(),
|
|
67
67
|
status: import_zod.z.enum(["success", "error"]),
|
|
68
|
-
summary: import_zod.z.string().optional()
|
|
68
|
+
summary: import_zod.z.string().optional(),
|
|
69
|
+
output: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional()
|
|
69
70
|
})
|
|
70
71
|
]);
|
|
71
72
|
var InputMessageSchema = import_zod.z.object({
|
|
@@ -154,6 +155,7 @@ var ToolResultEventSchema = import_zod.z.object({
|
|
|
154
155
|
tool: import_zod.z.string().optional(),
|
|
155
156
|
status: import_zod.z.enum(["success", "error"]).optional(),
|
|
156
157
|
summary: import_zod.z.string().optional(),
|
|
158
|
+
output: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional(),
|
|
157
159
|
timestamp: import_zod.z.string()
|
|
158
160
|
});
|
|
159
161
|
var DoneEventSchema = import_zod.z.object({
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/schemas.ts","../src/core/constants.ts","../src/sse/encode.ts","../src/sse/parse.ts"],"sourcesContent":["export * from './core/index.js';\nexport * from './sse/index.js';\n","import { z } from 'zod';\n\n/**\n * Zod schema for validating user content blocks.\n * Currently only supports text; extensible for multimodal.\n */\nexport const UserContentBlockSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n});\n\n/**\n * Zod schema for validating assistant content blocks.\n * Discriminated union supporting text, thinking, tool_use, and tool_result.\n */\nexport const AssistantContentBlockSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('text'), text: z.string() }),\n z.object({ type: z.literal('thinking'), text: z.string() }),\n z.object({\n type: z.literal('tool_use'),\n toolCallId: z.string(),\n tool: z.string(),\n args: z.record(z.string(), z.unknown()),\n }),\n z.object({\n type: z.literal('tool_result'),\n toolCallId: z.string(),\n tool: z.string(),\n status: z.enum(['success', 'error']),\n summary: z.string().optional(),\n }),\n]);\n\n/**\n * Zod schema for validating input messages.\n */\nexport const InputMessageSchema = z.object({\n content: z.array(UserContentBlockSchema),\n});\n\n/**\n * Zod schema for validating action results from continuation events.\n */\nexport const ActionResultSchema = z.object({\n actionId: z.string(),\n kind: z.string(),\n status: z.enum(['success', 'error']),\n data: z.unknown().optional(),\n error: z.string().optional(),\n});\n\n/**\n * Zod schema for validating agent request payloads.\n * Context object uses passthrough() to allow additional fields.\n */\nexport const AgentRequestSchema = z.object({\n messages: z.array(InputMessageSchema),\n threadId: z.string().optional(),\n context: z\n .object({\n actionResults: z.array(ActionResultSchema).optional(),\n })\n .passthrough()\n .optional(),\n});\n\n/**\n * Zod schema for event lifecycle stages.\n */\nexport const EventStageSchema = z.enum(['start', 'delta', 'stop']);\n\n/**\n * Zod schema for protocol error codes.\n */\nexport const ErrorCodeSchema = z.enum([\n 'auth_failed',\n 'thread_not_found',\n 'thread_access_denied',\n 'invalid_message_format',\n 'message_too_large',\n 'rate_limit_exceeded',\n 'stream_timeout',\n 'agent_error',\n 'tool_error',\n 'internal_error',\n 'invalid_action_id',\n]);\n\n/**\n * Zod schema for stream finish reasons.\n */\nexport const FinishReasonSchema = z.enum(['stop', 'length', 'error', 'action_required']);\n\n/**\n * Zod schema for metadata events.\n * First event in every stream, provides identifiers.\n */\nexport const MetadataEventSchema = z.object({\n event: z.literal('metadata'),\n requestId: z.string(),\n threadId: z.string(),\n agentId: z.string(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for text streaming events.\n * Validates the stage lifecycle with appropriate optional fields per stage.\n */\nexport const TextEventSchema = z.object({\n event: z.literal('text'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for thinking/reasoning events.\n * Structure mirrors TextEventSchema.\n */\nexport const ThinkingEventSchema = z.object({\n event: z.literal('thinking'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for tool call events.\n * Args are optional (only present on stop stage).\n */\nexport const ToolCallEventSchema = z.object({\n event: z.literal('tool_call'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n toolCallId: z.string().optional(),\n tool: z.string().optional(),\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for tool result events.\n * Status and summary only present on stop stage.\n */\nexport const ToolResultEventSchema = z.object({\n event: z.literal('tool_result'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n toolCallId: z.string().optional(),\n tool: z.string().optional(),\n status: z.enum(['success', 'error']).optional(),\n summary: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for done events.\n * Terminal event with complete content array.\n */\nexport const DoneEventSchema = z.object({\n event: z.literal('done'),\n requestId: z.string(),\n messageId: z.string(),\n threadId: z.string(),\n content: z.array(AssistantContentBlockSchema),\n usage: z\n .object({\n promptTokens: z.number(),\n completionTokens: z.number(),\n })\n .optional(),\n finishReason: FinishReasonSchema,\n traceId: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for error events.\n * Terminal event with error details and retry guidance.\n */\nexport const ErrorEventSchema = z.object({\n event: z.literal('error'),\n requestId: z.string(),\n message: z.string(),\n code: ErrorCodeSchema.optional(),\n retryable: z.boolean().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for aborted events.\n * Terminal event acknowledging client cancellation.\n */\nexport const AbortedEventSchema = z.object({\n event: z.literal('aborted'),\n requestId: z.string(),\n messageId: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for continuation events.\n * Signals client action required before stream can continue.\n */\nexport const ContinuationEventSchema = z.object({\n event: z.literal('continuation'),\n requestId: z.string(),\n actionId: z.string(),\n kind: z.string(),\n payload: z.record(z.string(), z.unknown()),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for all protocol events.\n * Discriminated union on the `event` field for efficient parsing.\n */\nexport const AgentEventSchema = z.discriminatedUnion('event', [\n MetadataEventSchema,\n TextEventSchema,\n ThinkingEventSchema,\n ToolCallEventSchema,\n ToolResultEventSchema,\n DoneEventSchema,\n ErrorEventSchema,\n AbortedEventSchema,\n ContinuationEventSchema,\n]);\n","/**\n * Current protocol version.\n * Additive changes (new events, optional fields) don't require version bump.\n * Breaking changes require new endpoint version (v2, v3, etc).\n */\nexport const PROTOCOL_VERSION = '1.0.0';\n\n/**\n * All valid event type identifiers in the protocol.\n * Used for discriminated union parsing and validation.\n */\nexport const EVENT_TYPES = [\n 'metadata',\n 'text',\n 'thinking',\n 'tool_call',\n 'tool_result',\n 'done',\n 'error',\n 'aborted',\n 'continuation',\n] as const;\n\n/**\n * Event type identifier.\n * Union of all valid event type strings.\n */\nexport type EventType = (typeof EVENT_TYPES)[number];\n","/**\n * Encodes an event and data payload into SSE wire format.\n *\n * Output format: `event: {event}\\ndata: {json}\\n\\n`\n *\n * The data object is JSON serialized. Newlines in string values are escaped\n * by JSON.stringify, ensuring valid SSE format.\n *\n * @param event - Event type identifier (e.g., 'text', 'done', 'error')\n * @param data - Event payload object to serialize as JSON\n * @returns SSE-formatted string ready for streaming\n */\nexport function encodeSSE(event: string, data: object): string {\n return `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('encodeSSE', () => {\n it('formats SSE event correctly', () => {\n const result = encodeSSE('metadata', {\n event: 'metadata',\n requestId: 'req-1',\n threadId: 'th-1',\n agentId: 'test-agent',\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toBe(\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n',\n );\n });\n\n it('handles special characters in data', () => {\n const result = encodeSSE('text', {\n event: 'text',\n requestId: 'req-1',\n messageId: 'msg-1',\n blockId: 'b1',\n stage: 'delta',\n delta: 'Hello\\nWorld',\n deltaIndex: 0,\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toContain('Hello\\\\nWorld');\n expect(result).toMatch(/^event: text\\ndata: .+\\n\\n$/);\n });\n\n it('handles unicode characters', () => {\n const result = encodeSSE('text', {\n event: 'text',\n requestId: 'req-1',\n messageId: 'msg-1',\n blockId: 'b1',\n stage: 'delta',\n delta: '你好世界 🌍',\n deltaIndex: 0,\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toContain('你好世界 🌍');\n });\n\n it('handles empty object data', () => {\n const result = encodeSSE('custom', {});\n expect(result).toBe('event: custom\\ndata: {}\\n\\n');\n });\n });\n}\n","import { AgentEventSchema } from '../core/schemas.js';\nimport type { AgentEvent } from '../core/types.js';\n\n/**\n * Result of parsing a single SSE event.\n * On success, contains a validated AgentEvent.\n * On failure, contains the error message and the raw parsed data.\n */\nexport type ParsedEvent =\n | { success: true; event: AgentEvent }\n | { success: false; error: string; raw: unknown };\n\n/**\n * Result of parsing an SSE chunk.\n * Contains successfully parsed events and any incomplete data to buffer for the next chunk.\n */\nexport type ParseResult = {\n /** Array of parsed events (may include failures with error details). */\n events: ParsedEvent[];\n /** Incomplete data at end of chunk; prepend to next chunk before parsing. */\n remainder: string;\n};\n\n/**\n * Parses an SSE chunk into validated protocol events.\n *\n * Handles partial chunks by returning unparsed data as remainder.\n * The remainder should be prepended to the next chunk before parsing.\n *\n * Each SSE block is validated against AgentEventSchema. Invalid events\n * are returned with success: false and error details.\n *\n * SSE comments (lines starting with ':') are ignored, including heartbeats.\n *\n * @param chunk - Raw SSE data (may contain multiple events or partial data)\n * @returns Object with parsed events array and remainder string for buffering\n */\nexport function parseSSEChunk(chunk: string): ParseResult {\n const events: ParsedEvent[] = [];\n const blocks = chunk.split('\\n\\n');\n\n for (let i = 0; i < blocks.length - 1; i++) {\n const block = blocks[i]!;\n const parsed = parseBlock(block);\n if (parsed !== null) {\n events.push(parsed);\n }\n }\n\n const lastBlock = blocks[blocks.length - 1] ?? '';\n const remainder = lastBlock;\n\n return { events, remainder };\n}\n\n/**\n * Parses a single SSE block into a ParsedEvent.\n * Returns null for blocks without data (e.g., comment-only blocks).\n */\nfunction parseBlock(block: string): ParsedEvent | null {\n const lines = block.split('\\n');\n let eventType: string | null = null;\n let data: string | null = null;\n\n for (const line of lines) {\n if (line.startsWith(':')) {\n continue;\n }\n if (line.startsWith('event: ')) {\n eventType = line.slice(7);\n continue;\n }\n if (line.startsWith('data: ')) {\n data = line.slice(6);\n continue;\n }\n }\n\n if (data === null) {\n return null;\n }\n\n return parseAndValidate(data, eventType);\n}\n\n/**\n * Parses JSON data and validates against AgentEventSchema.\n * Checks that the event type in data matches the SSE event header if present.\n */\nfunction parseAndValidate(data: string, eventType: string | null): ParsedEvent {\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return { success: false, error: 'Invalid JSON', raw: data };\n }\n\n const result = AgentEventSchema.safeParse(parsed);\n if (result.success) {\n if (eventType !== null && result.data.event !== eventType) {\n return {\n success: false,\n error: `Event type mismatch: header says '${eventType}', data says '${result.data.event}'`,\n raw: parsed,\n };\n }\n return { success: true, event: result.data };\n }\n\n return {\n success: false,\n error: result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; '),\n raw: parsed,\n };\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('parseSSEChunk', () => {\n it('parses a single complete event', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n if (result.events[0]?.success) {\n expect(result.events[0].event.event).toBe('metadata');\n expect(result.events[0].event.requestId).toBe('req-1');\n }\n expect(result.remainder).toBe('');\n });\n\n it('parses multiple events in one chunk', () => {\n const chunk =\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n' +\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"delta\",\"delta\":\"Hello\",\"deltaIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.001Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(2);\n expect(result.events[0]?.success).toBe(true);\n expect(result.events[1]?.success).toBe(true);\n if (result.events[0]?.success && result.events[1]?.success) {\n expect(result.events[0].event.event).toBe('text');\n expect(result.events[1].event.event).toBe('text');\n }\n expect(result.remainder).toBe('');\n });\n\n it('returns remainder for partial event', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n' +\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"request';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n expect(result.remainder).toContain('event: text');\n expect(result.remainder).toContain('data: {\"event\":\"text\",\"request');\n });\n\n it('ignores SSE comments', () => {\n const chunk =\n ': heartbeat\\n' +\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n });\n\n it('returns error for invalid JSON', () => {\n const chunk = 'event: text\\n' + 'data: {invalid json}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toBe('Invalid JSON');\n }\n });\n\n it('returns error for invalid event schema', () => {\n const chunk = 'event: text\\n' + 'data: {\"event\":\"text\",\"invalidField\":\"value\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toContain('requestId');\n }\n });\n\n it('returns error for event type mismatch', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toContain('mismatch');\n }\n });\n\n it('handles data without event line', () => {\n const chunk =\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n });\n\n it('handles empty chunk', () => {\n const result = parseSSEChunk('');\n expect(result.events).toHaveLength(0);\n expect(result.remainder).toBe('');\n });\n\n it('buffers partial chunks correctly across calls', () => {\n const part1 = 'event: text\\ndata: {\"event\":\"text\",\"requestId\":\"req-1\",';\n const part2 =\n '\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result1 = parseSSEChunk(part1);\n expect(result1.events).toHaveLength(0);\n expect(result1.remainder).not.toBe('');\n\n const result2 = parseSSEChunk(result1.remainder + part2);\n expect(result2.events).toHaveLength(1);\n expect(result2.events[0]?.success).toBe(true);\n });\n });\n}\n"],"mappings":"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","names":["import_meta"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/schemas.ts","../src/core/constants.ts","../src/sse/encode.ts","../src/sse/parse.ts"],"sourcesContent":["export * from './core/index.js';\nexport * from './sse/index.js';\n","import { z } from 'zod';\n\n/**\n * Zod schema for validating user content blocks.\n * Currently only supports text; extensible for multimodal.\n */\nexport const UserContentBlockSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n});\n\n/**\n * Zod schema for validating assistant content blocks.\n * Discriminated union supporting text, thinking, tool_use, and tool_result.\n */\nexport const AssistantContentBlockSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('text'), text: z.string() }),\n z.object({ type: z.literal('thinking'), text: z.string() }),\n z.object({\n type: z.literal('tool_use'),\n toolCallId: z.string(),\n tool: z.string(),\n args: z.record(z.string(), z.unknown()),\n }),\n z.object({\n type: z.literal('tool_result'),\n toolCallId: z.string(),\n tool: z.string(),\n status: z.enum(['success', 'error']),\n summary: z.string().optional(),\n output: z.record(z.string(), z.unknown()).optional(),\n }),\n]);\n\n/**\n * Zod schema for validating input messages.\n */\nexport const InputMessageSchema = z.object({\n content: z.array(UserContentBlockSchema),\n});\n\n/**\n * Zod schema for validating action results from continuation events.\n */\nexport const ActionResultSchema = z.object({\n actionId: z.string(),\n kind: z.string(),\n status: z.enum(['success', 'error']),\n data: z.unknown().optional(),\n error: z.string().optional(),\n});\n\n/**\n * Zod schema for validating agent request payloads.\n * Context object uses passthrough() to allow additional fields.\n */\nexport const AgentRequestSchema = z.object({\n messages: z.array(InputMessageSchema),\n threadId: z.string().optional(),\n context: z\n .object({\n actionResults: z.array(ActionResultSchema).optional(),\n })\n .passthrough()\n .optional(),\n});\n\n/**\n * Zod schema for event lifecycle stages.\n */\nexport const EventStageSchema = z.enum(['start', 'delta', 'stop']);\n\n/**\n * Zod schema for protocol error codes.\n */\nexport const ErrorCodeSchema = z.enum([\n 'auth_failed',\n 'thread_not_found',\n 'thread_access_denied',\n 'invalid_message_format',\n 'message_too_large',\n 'rate_limit_exceeded',\n 'stream_timeout',\n 'agent_error',\n 'tool_error',\n 'internal_error',\n 'invalid_action_id',\n]);\n\n/**\n * Zod schema for stream finish reasons.\n */\nexport const FinishReasonSchema = z.enum(['stop', 'length', 'error', 'action_required']);\n\n/**\n * Zod schema for metadata events.\n * First event in every stream, provides identifiers.\n */\nexport const MetadataEventSchema = z.object({\n event: z.literal('metadata'),\n requestId: z.string(),\n threadId: z.string(),\n agentId: z.string(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for text streaming events.\n * Validates the stage lifecycle with appropriate optional fields per stage.\n */\nexport const TextEventSchema = z.object({\n event: z.literal('text'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for thinking/reasoning events.\n * Structure mirrors TextEventSchema.\n */\nexport const ThinkingEventSchema = z.object({\n event: z.literal('thinking'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for tool call events.\n * Args are optional (only present on stop stage).\n */\nexport const ToolCallEventSchema = z.object({\n event: z.literal('tool_call'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n toolCallId: z.string().optional(),\n tool: z.string().optional(),\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for tool result events.\n * Status and summary only present on stop stage.\n */\nexport const ToolResultEventSchema = z.object({\n event: z.literal('tool_result'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n toolCallId: z.string().optional(),\n tool: z.string().optional(),\n status: z.enum(['success', 'error']).optional(),\n summary: z.string().optional(),\n output: z.record(z.string(), z.unknown()).optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for done events.\n * Terminal event with complete content array.\n */\nexport const DoneEventSchema = z.object({\n event: z.literal('done'),\n requestId: z.string(),\n messageId: z.string(),\n threadId: z.string(),\n content: z.array(AssistantContentBlockSchema),\n usage: z\n .object({\n promptTokens: z.number(),\n completionTokens: z.number(),\n })\n .optional(),\n finishReason: FinishReasonSchema,\n traceId: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for error events.\n * Terminal event with error details and retry guidance.\n */\nexport const ErrorEventSchema = z.object({\n event: z.literal('error'),\n requestId: z.string(),\n message: z.string(),\n code: ErrorCodeSchema.optional(),\n retryable: z.boolean().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for aborted events.\n * Terminal event acknowledging client cancellation.\n */\nexport const AbortedEventSchema = z.object({\n event: z.literal('aborted'),\n requestId: z.string(),\n messageId: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for continuation events.\n * Signals client action required before stream can continue.\n */\nexport const ContinuationEventSchema = z.object({\n event: z.literal('continuation'),\n requestId: z.string(),\n actionId: z.string(),\n kind: z.string(),\n payload: z.record(z.string(), z.unknown()),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for all protocol events.\n * Discriminated union on the `event` field for efficient parsing.\n */\nexport const AgentEventSchema = z.discriminatedUnion('event', [\n MetadataEventSchema,\n TextEventSchema,\n ThinkingEventSchema,\n ToolCallEventSchema,\n ToolResultEventSchema,\n DoneEventSchema,\n ErrorEventSchema,\n AbortedEventSchema,\n ContinuationEventSchema,\n]);\n","/**\n * Current protocol version.\n * Additive changes (new events, optional fields) don't require version bump.\n * Breaking changes require new endpoint version (v2, v3, etc).\n */\nexport const PROTOCOL_VERSION = '1.0.0';\n\n/**\n * All valid event type identifiers in the protocol.\n * Used for discriminated union parsing and validation.\n */\nexport const EVENT_TYPES = [\n 'metadata',\n 'text',\n 'thinking',\n 'tool_call',\n 'tool_result',\n 'done',\n 'error',\n 'aborted',\n 'continuation',\n] as const;\n\n/**\n * Event type identifier.\n * Union of all valid event type strings.\n */\nexport type EventType = (typeof EVENT_TYPES)[number];\n","/**\n * Encodes an event and data payload into SSE wire format.\n *\n * Output format: `event: {event}\\ndata: {json}\\n\\n`\n *\n * The data object is JSON serialized. Newlines in string values are escaped\n * by JSON.stringify, ensuring valid SSE format.\n *\n * @param event - Event type identifier (e.g., 'text', 'done', 'error')\n * @param data - Event payload object to serialize as JSON\n * @returns SSE-formatted string ready for streaming\n */\nexport function encodeSSE(event: string, data: object): string {\n return `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('encodeSSE', () => {\n it('formats SSE event correctly', () => {\n const result = encodeSSE('metadata', {\n event: 'metadata',\n requestId: 'req-1',\n threadId: 'th-1',\n agentId: 'test-agent',\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toBe(\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n',\n );\n });\n\n it('handles special characters in data', () => {\n const result = encodeSSE('text', {\n event: 'text',\n requestId: 'req-1',\n messageId: 'msg-1',\n blockId: 'b1',\n stage: 'delta',\n delta: 'Hello\\nWorld',\n deltaIndex: 0,\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toContain('Hello\\\\nWorld');\n expect(result).toMatch(/^event: text\\ndata: .+\\n\\n$/);\n });\n\n it('handles unicode characters', () => {\n const result = encodeSSE('text', {\n event: 'text',\n requestId: 'req-1',\n messageId: 'msg-1',\n blockId: 'b1',\n stage: 'delta',\n delta: '你好世界 🌍',\n deltaIndex: 0,\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toContain('你好世界 🌍');\n });\n\n it('handles empty object data', () => {\n const result = encodeSSE('custom', {});\n expect(result).toBe('event: custom\\ndata: {}\\n\\n');\n });\n });\n}\n","import { AgentEventSchema } from '../core/schemas.js';\nimport type { AgentEvent } from '../core/types.js';\n\n/**\n * Result of parsing a single SSE event.\n * On success, contains a validated AgentEvent.\n * On failure, contains the error message and the raw parsed data.\n */\nexport type ParsedEvent =\n | { success: true; event: AgentEvent }\n | { success: false; error: string; raw: unknown };\n\n/**\n * Result of parsing an SSE chunk.\n * Contains successfully parsed events and any incomplete data to buffer for the next chunk.\n */\nexport type ParseResult = {\n /** Array of parsed events (may include failures with error details). */\n events: ParsedEvent[];\n /** Incomplete data at end of chunk; prepend to next chunk before parsing. */\n remainder: string;\n};\n\n/**\n * Parses an SSE chunk into validated protocol events.\n *\n * Handles partial chunks by returning unparsed data as remainder.\n * The remainder should be prepended to the next chunk before parsing.\n *\n * Each SSE block is validated against AgentEventSchema. Invalid events\n * are returned with success: false and error details.\n *\n * SSE comments (lines starting with ':') are ignored, including heartbeats.\n *\n * @param chunk - Raw SSE data (may contain multiple events or partial data)\n * @returns Object with parsed events array and remainder string for buffering\n */\nexport function parseSSEChunk(chunk: string): ParseResult {\n const events: ParsedEvent[] = [];\n const blocks = chunk.split('\\n\\n');\n\n for (let i = 0; i < blocks.length - 1; i++) {\n const block = blocks[i]!;\n const parsed = parseBlock(block);\n if (parsed !== null) {\n events.push(parsed);\n }\n }\n\n const lastBlock = blocks[blocks.length - 1] ?? '';\n const remainder = lastBlock;\n\n return { events, remainder };\n}\n\n/**\n * Parses a single SSE block into a ParsedEvent.\n * Returns null for blocks without data (e.g., comment-only blocks).\n */\nfunction parseBlock(block: string): ParsedEvent | null {\n const lines = block.split('\\n');\n let eventType: string | null = null;\n let data: string | null = null;\n\n for (const line of lines) {\n if (line.startsWith(':')) {\n continue;\n }\n if (line.startsWith('event: ')) {\n eventType = line.slice(7);\n continue;\n }\n if (line.startsWith('data: ')) {\n data = line.slice(6);\n continue;\n }\n }\n\n if (data === null) {\n return null;\n }\n\n return parseAndValidate(data, eventType);\n}\n\n/**\n * Parses JSON data and validates against AgentEventSchema.\n * Checks that the event type in data matches the SSE event header if present.\n */\nfunction parseAndValidate(data: string, eventType: string | null): ParsedEvent {\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return { success: false, error: 'Invalid JSON', raw: data };\n }\n\n const result = AgentEventSchema.safeParse(parsed);\n if (result.success) {\n if (eventType !== null && result.data.event !== eventType) {\n return {\n success: false,\n error: `Event type mismatch: header says '${eventType}', data says '${result.data.event}'`,\n raw: parsed,\n };\n }\n return { success: true, event: result.data };\n }\n\n return {\n success: false,\n error: result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; '),\n raw: parsed,\n };\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('parseSSEChunk', () => {\n it('parses a single complete event', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n if (result.events[0]?.success) {\n expect(result.events[0].event.event).toBe('metadata');\n expect(result.events[0].event.requestId).toBe('req-1');\n }\n expect(result.remainder).toBe('');\n });\n\n it('parses multiple events in one chunk', () => {\n const chunk =\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n' +\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"delta\",\"delta\":\"Hello\",\"deltaIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.001Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(2);\n expect(result.events[0]?.success).toBe(true);\n expect(result.events[1]?.success).toBe(true);\n if (result.events[0]?.success && result.events[1]?.success) {\n expect(result.events[0].event.event).toBe('text');\n expect(result.events[1].event.event).toBe('text');\n }\n expect(result.remainder).toBe('');\n });\n\n it('returns remainder for partial event', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n' +\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"request';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n expect(result.remainder).toContain('event: text');\n expect(result.remainder).toContain('data: {\"event\":\"text\",\"request');\n });\n\n it('ignores SSE comments', () => {\n const chunk =\n ': heartbeat\\n' +\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n });\n\n it('returns error for invalid JSON', () => {\n const chunk = 'event: text\\n' + 'data: {invalid json}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toBe('Invalid JSON');\n }\n });\n\n it('returns error for invalid event schema', () => {\n const chunk = 'event: text\\n' + 'data: {\"event\":\"text\",\"invalidField\":\"value\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toContain('requestId');\n }\n });\n\n it('returns error for event type mismatch', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toContain('mismatch');\n }\n });\n\n it('handles data without event line', () => {\n const chunk =\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n });\n\n it('handles empty chunk', () => {\n const result = parseSSEChunk('');\n expect(result.events).toHaveLength(0);\n expect(result.remainder).toBe('');\n });\n\n it('buffers partial chunks correctly across calls', () => {\n const part1 = 'event: text\\ndata: {\"event\":\"text\",\"requestId\":\"req-1\",';\n const part2 =\n '\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result1 = parseSSEChunk(part1);\n expect(result1.events).toHaveLength(0);\n expect(result1.remainder).not.toBe('');\n\n const result2 = parseSSEChunk(result1.remainder + part2);\n expect(result2.events).toHaveLength(1);\n expect(result2.events[0]?.success).toBe(true);\n });\n });\n}\n"],"mappings":"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","names":["import_meta"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { h as AbortedEvent, a as ActionResult, i as AgentEvent, b as AgentRequest, A as AssistantContentBlock, C as ContinuationEvent, D as DoneEvent, c as ErrorCode, g as ErrorEvent, E as EventStage, F as FinishReason, I as InputMessage, M as MetadataEvent, T as TextEvent, d as ThinkingEvent, e as ToolCallEvent, f as ToolResultEvent, U as UserContentBlock } from './types
|
|
1
|
+
export { h as AbortedEvent, a as ActionResult, i as AgentEvent, b as AgentRequest, A as AssistantContentBlock, C as ContinuationEvent, D as DoneEvent, c as ErrorCode, g as ErrorEvent, E as EventStage, F as FinishReason, I as InputMessage, M as MetadataEvent, T as TextEvent, d as ThinkingEvent, e as ToolCallEvent, f as ToolResultEvent, U as UserContentBlock } from './types--3D3jbpT.cjs';
|
|
2
2
|
export { AbortedEventSchema, ActionResultSchema, AgentEventSchema, AgentRequestSchema, AssistantContentBlockSchema, ContinuationEventSchema, DoneEventSchema, EVENT_TYPES, ErrorCodeSchema, ErrorEventSchema, EventStageSchema, EventType, FinishReasonSchema, InputMessageSchema, MetadataEventSchema, PROTOCOL_VERSION, TextEventSchema, ThinkingEventSchema, ToolCallEventSchema, ToolResultEventSchema, UserContentBlockSchema } from './core.cjs';
|
|
3
3
|
export { ParseResult, ParsedEvent, encodeSSE, parseSSEChunk } from './sse.cjs';
|
|
4
4
|
import 'zod';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { h as AbortedEvent, a as ActionResult, i as AgentEvent, b as AgentRequest, A as AssistantContentBlock, C as ContinuationEvent, D as DoneEvent, c as ErrorCode, g as ErrorEvent, E as EventStage, F as FinishReason, I as InputMessage, M as MetadataEvent, T as TextEvent, d as ThinkingEvent, e as ToolCallEvent, f as ToolResultEvent, U as UserContentBlock } from './types
|
|
1
|
+
export { h as AbortedEvent, a as ActionResult, i as AgentEvent, b as AgentRequest, A as AssistantContentBlock, C as ContinuationEvent, D as DoneEvent, c as ErrorCode, g as ErrorEvent, E as EventStage, F as FinishReason, I as InputMessage, M as MetadataEvent, T as TextEvent, d as ThinkingEvent, e as ToolCallEvent, f as ToolResultEvent, U as UserContentBlock } from './types--3D3jbpT.js';
|
|
2
2
|
export { AbortedEventSchema, ActionResultSchema, AgentEventSchema, AgentRequestSchema, AssistantContentBlockSchema, ContinuationEventSchema, DoneEventSchema, EVENT_TYPES, ErrorCodeSchema, ErrorEventSchema, EventStageSchema, EventType, FinishReasonSchema, InputMessageSchema, MetadataEventSchema, PROTOCOL_VERSION, TextEventSchema, ThinkingEventSchema, ToolCallEventSchema, ToolResultEventSchema, UserContentBlockSchema } from './core.js';
|
|
3
3
|
export { ParseResult, ParsedEvent, encodeSSE, parseSSEChunk } from './sse.js';
|
|
4
4
|
import 'zod';
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
encodeSSE,
|
|
7
7
|
parseSSEChunk
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-VDBWUNSK.js";
|
|
9
9
|
import {
|
|
10
10
|
AbortedEventSchema,
|
|
11
11
|
ActionResultSchema,
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
ToolCallEventSchema,
|
|
26
26
|
ToolResultEventSchema,
|
|
27
27
|
UserContentBlockSchema
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-H5AXHRSE.js";
|
|
29
29
|
export {
|
|
30
30
|
AbortedEventSchema,
|
|
31
31
|
ActionResultSchema,
|
package/dist/sse.cjs
CHANGED
|
@@ -102,7 +102,8 @@ var AssistantContentBlockSchema = import_zod.z.discriminatedUnion("type", [
|
|
|
102
102
|
toolCallId: import_zod.z.string(),
|
|
103
103
|
tool: import_zod.z.string(),
|
|
104
104
|
status: import_zod.z.enum(["success", "error"]),
|
|
105
|
-
summary: import_zod.z.string().optional()
|
|
105
|
+
summary: import_zod.z.string().optional(),
|
|
106
|
+
output: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional()
|
|
106
107
|
})
|
|
107
108
|
]);
|
|
108
109
|
var InputMessageSchema = import_zod.z.object({
|
|
@@ -191,6 +192,7 @@ var ToolResultEventSchema = import_zod.z.object({
|
|
|
191
192
|
tool: import_zod.z.string().optional(),
|
|
192
193
|
status: import_zod.z.enum(["success", "error"]).optional(),
|
|
193
194
|
summary: import_zod.z.string().optional(),
|
|
195
|
+
output: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional(),
|
|
194
196
|
timestamp: import_zod.z.string()
|
|
195
197
|
});
|
|
196
198
|
var DoneEventSchema = import_zod.z.object({
|
package/dist/sse.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sse/index.ts","../src/sse/encode.ts","../src/core/schemas.ts","../src/sse/parse.ts"],"sourcesContent":["export { encodeSSE } from './encode.js';\nexport { parseSSEChunk } from './parse.js';\nexport type { ParsedEvent, ParseResult } from './parse.js';\n","/**\n * Encodes an event and data payload into SSE wire format.\n *\n * Output format: `event: {event}\\ndata: {json}\\n\\n`\n *\n * The data object is JSON serialized. Newlines in string values are escaped\n * by JSON.stringify, ensuring valid SSE format.\n *\n * @param event - Event type identifier (e.g., 'text', 'done', 'error')\n * @param data - Event payload object to serialize as JSON\n * @returns SSE-formatted string ready for streaming\n */\nexport function encodeSSE(event: string, data: object): string {\n return `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('encodeSSE', () => {\n it('formats SSE event correctly', () => {\n const result = encodeSSE('metadata', {\n event: 'metadata',\n requestId: 'req-1',\n threadId: 'th-1',\n agentId: 'test-agent',\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toBe(\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n',\n );\n });\n\n it('handles special characters in data', () => {\n const result = encodeSSE('text', {\n event: 'text',\n requestId: 'req-1',\n messageId: 'msg-1',\n blockId: 'b1',\n stage: 'delta',\n delta: 'Hello\\nWorld',\n deltaIndex: 0,\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toContain('Hello\\\\nWorld');\n expect(result).toMatch(/^event: text\\ndata: .+\\n\\n$/);\n });\n\n it('handles unicode characters', () => {\n const result = encodeSSE('text', {\n event: 'text',\n requestId: 'req-1',\n messageId: 'msg-1',\n blockId: 'b1',\n stage: 'delta',\n delta: '你好世界 🌍',\n deltaIndex: 0,\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toContain('你好世界 🌍');\n });\n\n it('handles empty object data', () => {\n const result = encodeSSE('custom', {});\n expect(result).toBe('event: custom\\ndata: {}\\n\\n');\n });\n });\n}\n","import { z } from 'zod';\n\n/**\n * Zod schema for validating user content blocks.\n * Currently only supports text; extensible for multimodal.\n */\nexport const UserContentBlockSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n});\n\n/**\n * Zod schema for validating assistant content blocks.\n * Discriminated union supporting text, thinking, tool_use, and tool_result.\n */\nexport const AssistantContentBlockSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('text'), text: z.string() }),\n z.object({ type: z.literal('thinking'), text: z.string() }),\n z.object({\n type: z.literal('tool_use'),\n toolCallId: z.string(),\n tool: z.string(),\n args: z.record(z.string(), z.unknown()),\n }),\n z.object({\n type: z.literal('tool_result'),\n toolCallId: z.string(),\n tool: z.string(),\n status: z.enum(['success', 'error']),\n summary: z.string().optional(),\n }),\n]);\n\n/**\n * Zod schema for validating input messages.\n */\nexport const InputMessageSchema = z.object({\n content: z.array(UserContentBlockSchema),\n});\n\n/**\n * Zod schema for validating action results from continuation events.\n */\nexport const ActionResultSchema = z.object({\n actionId: z.string(),\n kind: z.string(),\n status: z.enum(['success', 'error']),\n data: z.unknown().optional(),\n error: z.string().optional(),\n});\n\n/**\n * Zod schema for validating agent request payloads.\n * Context object uses passthrough() to allow additional fields.\n */\nexport const AgentRequestSchema = z.object({\n messages: z.array(InputMessageSchema),\n threadId: z.string().optional(),\n context: z\n .object({\n actionResults: z.array(ActionResultSchema).optional(),\n })\n .passthrough()\n .optional(),\n});\n\n/**\n * Zod schema for event lifecycle stages.\n */\nexport const EventStageSchema = z.enum(['start', 'delta', 'stop']);\n\n/**\n * Zod schema for protocol error codes.\n */\nexport const ErrorCodeSchema = z.enum([\n 'auth_failed',\n 'thread_not_found',\n 'thread_access_denied',\n 'invalid_message_format',\n 'message_too_large',\n 'rate_limit_exceeded',\n 'stream_timeout',\n 'agent_error',\n 'tool_error',\n 'internal_error',\n 'invalid_action_id',\n]);\n\n/**\n * Zod schema for stream finish reasons.\n */\nexport const FinishReasonSchema = z.enum(['stop', 'length', 'error', 'action_required']);\n\n/**\n * Zod schema for metadata events.\n * First event in every stream, provides identifiers.\n */\nexport const MetadataEventSchema = z.object({\n event: z.literal('metadata'),\n requestId: z.string(),\n threadId: z.string(),\n agentId: z.string(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for text streaming events.\n * Validates the stage lifecycle with appropriate optional fields per stage.\n */\nexport const TextEventSchema = z.object({\n event: z.literal('text'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for thinking/reasoning events.\n * Structure mirrors TextEventSchema.\n */\nexport const ThinkingEventSchema = z.object({\n event: z.literal('thinking'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for tool call events.\n * Args are optional (only present on stop stage).\n */\nexport const ToolCallEventSchema = z.object({\n event: z.literal('tool_call'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n toolCallId: z.string().optional(),\n tool: z.string().optional(),\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for tool result events.\n * Status and summary only present on stop stage.\n */\nexport const ToolResultEventSchema = z.object({\n event: z.literal('tool_result'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n toolCallId: z.string().optional(),\n tool: z.string().optional(),\n status: z.enum(['success', 'error']).optional(),\n summary: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for done events.\n * Terminal event with complete content array.\n */\nexport const DoneEventSchema = z.object({\n event: z.literal('done'),\n requestId: z.string(),\n messageId: z.string(),\n threadId: z.string(),\n content: z.array(AssistantContentBlockSchema),\n usage: z\n .object({\n promptTokens: z.number(),\n completionTokens: z.number(),\n })\n .optional(),\n finishReason: FinishReasonSchema,\n traceId: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for error events.\n * Terminal event with error details and retry guidance.\n */\nexport const ErrorEventSchema = z.object({\n event: z.literal('error'),\n requestId: z.string(),\n message: z.string(),\n code: ErrorCodeSchema.optional(),\n retryable: z.boolean().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for aborted events.\n * Terminal event acknowledging client cancellation.\n */\nexport const AbortedEventSchema = z.object({\n event: z.literal('aborted'),\n requestId: z.string(),\n messageId: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for continuation events.\n * Signals client action required before stream can continue.\n */\nexport const ContinuationEventSchema = z.object({\n event: z.literal('continuation'),\n requestId: z.string(),\n actionId: z.string(),\n kind: z.string(),\n payload: z.record(z.string(), z.unknown()),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for all protocol events.\n * Discriminated union on the `event` field for efficient parsing.\n */\nexport const AgentEventSchema = z.discriminatedUnion('event', [\n MetadataEventSchema,\n TextEventSchema,\n ThinkingEventSchema,\n ToolCallEventSchema,\n ToolResultEventSchema,\n DoneEventSchema,\n ErrorEventSchema,\n AbortedEventSchema,\n ContinuationEventSchema,\n]);\n","import { AgentEventSchema } from '../core/schemas.js';\nimport type { AgentEvent } from '../core/types.js';\n\n/**\n * Result of parsing a single SSE event.\n * On success, contains a validated AgentEvent.\n * On failure, contains the error message and the raw parsed data.\n */\nexport type ParsedEvent =\n | { success: true; event: AgentEvent }\n | { success: false; error: string; raw: unknown };\n\n/**\n * Result of parsing an SSE chunk.\n * Contains successfully parsed events and any incomplete data to buffer for the next chunk.\n */\nexport type ParseResult = {\n /** Array of parsed events (may include failures with error details). */\n events: ParsedEvent[];\n /** Incomplete data at end of chunk; prepend to next chunk before parsing. */\n remainder: string;\n};\n\n/**\n * Parses an SSE chunk into validated protocol events.\n *\n * Handles partial chunks by returning unparsed data as remainder.\n * The remainder should be prepended to the next chunk before parsing.\n *\n * Each SSE block is validated against AgentEventSchema. Invalid events\n * are returned with success: false and error details.\n *\n * SSE comments (lines starting with ':') are ignored, including heartbeats.\n *\n * @param chunk - Raw SSE data (may contain multiple events or partial data)\n * @returns Object with parsed events array and remainder string for buffering\n */\nexport function parseSSEChunk(chunk: string): ParseResult {\n const events: ParsedEvent[] = [];\n const blocks = chunk.split('\\n\\n');\n\n for (let i = 0; i < blocks.length - 1; i++) {\n const block = blocks[i]!;\n const parsed = parseBlock(block);\n if (parsed !== null) {\n events.push(parsed);\n }\n }\n\n const lastBlock = blocks[blocks.length - 1] ?? '';\n const remainder = lastBlock;\n\n return { events, remainder };\n}\n\n/**\n * Parses a single SSE block into a ParsedEvent.\n * Returns null for blocks without data (e.g., comment-only blocks).\n */\nfunction parseBlock(block: string): ParsedEvent | null {\n const lines = block.split('\\n');\n let eventType: string | null = null;\n let data: string | null = null;\n\n for (const line of lines) {\n if (line.startsWith(':')) {\n continue;\n }\n if (line.startsWith('event: ')) {\n eventType = line.slice(7);\n continue;\n }\n if (line.startsWith('data: ')) {\n data = line.slice(6);\n continue;\n }\n }\n\n if (data === null) {\n return null;\n }\n\n return parseAndValidate(data, eventType);\n}\n\n/**\n * Parses JSON data and validates against AgentEventSchema.\n * Checks that the event type in data matches the SSE event header if present.\n */\nfunction parseAndValidate(data: string, eventType: string | null): ParsedEvent {\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return { success: false, error: 'Invalid JSON', raw: data };\n }\n\n const result = AgentEventSchema.safeParse(parsed);\n if (result.success) {\n if (eventType !== null && result.data.event !== eventType) {\n return {\n success: false,\n error: `Event type mismatch: header says '${eventType}', data says '${result.data.event}'`,\n raw: parsed,\n };\n }\n return { success: true, event: result.data };\n }\n\n return {\n success: false,\n error: result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; '),\n raw: parsed,\n };\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('parseSSEChunk', () => {\n it('parses a single complete event', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n if (result.events[0]?.success) {\n expect(result.events[0].event.event).toBe('metadata');\n expect(result.events[0].event.requestId).toBe('req-1');\n }\n expect(result.remainder).toBe('');\n });\n\n it('parses multiple events in one chunk', () => {\n const chunk =\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n' +\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"delta\",\"delta\":\"Hello\",\"deltaIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.001Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(2);\n expect(result.events[0]?.success).toBe(true);\n expect(result.events[1]?.success).toBe(true);\n if (result.events[0]?.success && result.events[1]?.success) {\n expect(result.events[0].event.event).toBe('text');\n expect(result.events[1].event.event).toBe('text');\n }\n expect(result.remainder).toBe('');\n });\n\n it('returns remainder for partial event', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n' +\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"request';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n expect(result.remainder).toContain('event: text');\n expect(result.remainder).toContain('data: {\"event\":\"text\",\"request');\n });\n\n it('ignores SSE comments', () => {\n const chunk =\n ': heartbeat\\n' +\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n });\n\n it('returns error for invalid JSON', () => {\n const chunk = 'event: text\\n' + 'data: {invalid json}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toBe('Invalid JSON');\n }\n });\n\n it('returns error for invalid event schema', () => {\n const chunk = 'event: text\\n' + 'data: {\"event\":\"text\",\"invalidField\":\"value\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toContain('requestId');\n }\n });\n\n it('returns error for event type mismatch', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toContain('mismatch');\n }\n });\n\n it('handles data without event line', () => {\n const chunk =\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n });\n\n it('handles empty chunk', () => {\n const result = parseSSEChunk('');\n expect(result.events).toHaveLength(0);\n expect(result.remainder).toBe('');\n });\n\n it('buffers partial chunks correctly across calls', () => {\n const part1 = 'event: text\\ndata: {\"event\":\"text\",\"requestId\":\"req-1\",';\n const part2 =\n '\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result1 = parseSSEChunk(part1);\n expect(result1.events).toHaveLength(0);\n expect(result1.remainder).not.toBe('');\n\n const result2 = parseSSEChunk(result1.remainder + part2);\n expect(result2.events).toHaveLength(1);\n expect(result2.events[0]?.success).toBe(true);\n });\n });\n}\n"],"mappings":"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","names":["import_meta"]}
|
|
1
|
+
{"version":3,"sources":["../src/sse/index.ts","../src/sse/encode.ts","../src/core/schemas.ts","../src/sse/parse.ts"],"sourcesContent":["export { encodeSSE } from './encode.js';\nexport { parseSSEChunk } from './parse.js';\nexport type { ParsedEvent, ParseResult } from './parse.js';\n","/**\n * Encodes an event and data payload into SSE wire format.\n *\n * Output format: `event: {event}\\ndata: {json}\\n\\n`\n *\n * The data object is JSON serialized. Newlines in string values are escaped\n * by JSON.stringify, ensuring valid SSE format.\n *\n * @param event - Event type identifier (e.g., 'text', 'done', 'error')\n * @param data - Event payload object to serialize as JSON\n * @returns SSE-formatted string ready for streaming\n */\nexport function encodeSSE(event: string, data: object): string {\n return `event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`;\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('encodeSSE', () => {\n it('formats SSE event correctly', () => {\n const result = encodeSSE('metadata', {\n event: 'metadata',\n requestId: 'req-1',\n threadId: 'th-1',\n agentId: 'test-agent',\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toBe(\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n',\n );\n });\n\n it('handles special characters in data', () => {\n const result = encodeSSE('text', {\n event: 'text',\n requestId: 'req-1',\n messageId: 'msg-1',\n blockId: 'b1',\n stage: 'delta',\n delta: 'Hello\\nWorld',\n deltaIndex: 0,\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toContain('Hello\\\\nWorld');\n expect(result).toMatch(/^event: text\\ndata: .+\\n\\n$/);\n });\n\n it('handles unicode characters', () => {\n const result = encodeSSE('text', {\n event: 'text',\n requestId: 'req-1',\n messageId: 'msg-1',\n blockId: 'b1',\n stage: 'delta',\n delta: '你好世界 🌍',\n deltaIndex: 0,\n timestamp: '2025-01-01T00:00:00.000Z',\n });\n\n expect(result).toContain('你好世界 🌍');\n });\n\n it('handles empty object data', () => {\n const result = encodeSSE('custom', {});\n expect(result).toBe('event: custom\\ndata: {}\\n\\n');\n });\n });\n}\n","import { z } from 'zod';\n\n/**\n * Zod schema for validating user content blocks.\n * Currently only supports text; extensible for multimodal.\n */\nexport const UserContentBlockSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n});\n\n/**\n * Zod schema for validating assistant content blocks.\n * Discriminated union supporting text, thinking, tool_use, and tool_result.\n */\nexport const AssistantContentBlockSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('text'), text: z.string() }),\n z.object({ type: z.literal('thinking'), text: z.string() }),\n z.object({\n type: z.literal('tool_use'),\n toolCallId: z.string(),\n tool: z.string(),\n args: z.record(z.string(), z.unknown()),\n }),\n z.object({\n type: z.literal('tool_result'),\n toolCallId: z.string(),\n tool: z.string(),\n status: z.enum(['success', 'error']),\n summary: z.string().optional(),\n output: z.record(z.string(), z.unknown()).optional(),\n }),\n]);\n\n/**\n * Zod schema for validating input messages.\n */\nexport const InputMessageSchema = z.object({\n content: z.array(UserContentBlockSchema),\n});\n\n/**\n * Zod schema for validating action results from continuation events.\n */\nexport const ActionResultSchema = z.object({\n actionId: z.string(),\n kind: z.string(),\n status: z.enum(['success', 'error']),\n data: z.unknown().optional(),\n error: z.string().optional(),\n});\n\n/**\n * Zod schema for validating agent request payloads.\n * Context object uses passthrough() to allow additional fields.\n */\nexport const AgentRequestSchema = z.object({\n messages: z.array(InputMessageSchema),\n threadId: z.string().optional(),\n context: z\n .object({\n actionResults: z.array(ActionResultSchema).optional(),\n })\n .passthrough()\n .optional(),\n});\n\n/**\n * Zod schema for event lifecycle stages.\n */\nexport const EventStageSchema = z.enum(['start', 'delta', 'stop']);\n\n/**\n * Zod schema for protocol error codes.\n */\nexport const ErrorCodeSchema = z.enum([\n 'auth_failed',\n 'thread_not_found',\n 'thread_access_denied',\n 'invalid_message_format',\n 'message_too_large',\n 'rate_limit_exceeded',\n 'stream_timeout',\n 'agent_error',\n 'tool_error',\n 'internal_error',\n 'invalid_action_id',\n]);\n\n/**\n * Zod schema for stream finish reasons.\n */\nexport const FinishReasonSchema = z.enum(['stop', 'length', 'error', 'action_required']);\n\n/**\n * Zod schema for metadata events.\n * First event in every stream, provides identifiers.\n */\nexport const MetadataEventSchema = z.object({\n event: z.literal('metadata'),\n requestId: z.string(),\n threadId: z.string(),\n agentId: z.string(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for text streaming events.\n * Validates the stage lifecycle with appropriate optional fields per stage.\n */\nexport const TextEventSchema = z.object({\n event: z.literal('text'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for thinking/reasoning events.\n * Structure mirrors TextEventSchema.\n */\nexport const ThinkingEventSchema = z.object({\n event: z.literal('thinking'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for tool call events.\n * Args are optional (only present on stop stage).\n */\nexport const ToolCallEventSchema = z.object({\n event: z.literal('tool_call'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n toolCallId: z.string().optional(),\n tool: z.string().optional(),\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for tool result events.\n * Status and summary only present on stop stage.\n */\nexport const ToolResultEventSchema = z.object({\n event: z.literal('tool_result'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n toolCallId: z.string().optional(),\n tool: z.string().optional(),\n status: z.enum(['success', 'error']).optional(),\n summary: z.string().optional(),\n output: z.record(z.string(), z.unknown()).optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for done events.\n * Terminal event with complete content array.\n */\nexport const DoneEventSchema = z.object({\n event: z.literal('done'),\n requestId: z.string(),\n messageId: z.string(),\n threadId: z.string(),\n content: z.array(AssistantContentBlockSchema),\n usage: z\n .object({\n promptTokens: z.number(),\n completionTokens: z.number(),\n })\n .optional(),\n finishReason: FinishReasonSchema,\n traceId: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for error events.\n * Terminal event with error details and retry guidance.\n */\nexport const ErrorEventSchema = z.object({\n event: z.literal('error'),\n requestId: z.string(),\n message: z.string(),\n code: ErrorCodeSchema.optional(),\n retryable: z.boolean().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for aborted events.\n * Terminal event acknowledging client cancellation.\n */\nexport const AbortedEventSchema = z.object({\n event: z.literal('aborted'),\n requestId: z.string(),\n messageId: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for continuation events.\n * Signals client action required before stream can continue.\n */\nexport const ContinuationEventSchema = z.object({\n event: z.literal('continuation'),\n requestId: z.string(),\n actionId: z.string(),\n kind: z.string(),\n payload: z.record(z.string(), z.unknown()),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for all protocol events.\n * Discriminated union on the `event` field for efficient parsing.\n */\nexport const AgentEventSchema = z.discriminatedUnion('event', [\n MetadataEventSchema,\n TextEventSchema,\n ThinkingEventSchema,\n ToolCallEventSchema,\n ToolResultEventSchema,\n DoneEventSchema,\n ErrorEventSchema,\n AbortedEventSchema,\n ContinuationEventSchema,\n]);\n","import { AgentEventSchema } from '../core/schemas.js';\nimport type { AgentEvent } from '../core/types.js';\n\n/**\n * Result of parsing a single SSE event.\n * On success, contains a validated AgentEvent.\n * On failure, contains the error message and the raw parsed data.\n */\nexport type ParsedEvent =\n | { success: true; event: AgentEvent }\n | { success: false; error: string; raw: unknown };\n\n/**\n * Result of parsing an SSE chunk.\n * Contains successfully parsed events and any incomplete data to buffer for the next chunk.\n */\nexport type ParseResult = {\n /** Array of parsed events (may include failures with error details). */\n events: ParsedEvent[];\n /** Incomplete data at end of chunk; prepend to next chunk before parsing. */\n remainder: string;\n};\n\n/**\n * Parses an SSE chunk into validated protocol events.\n *\n * Handles partial chunks by returning unparsed data as remainder.\n * The remainder should be prepended to the next chunk before parsing.\n *\n * Each SSE block is validated against AgentEventSchema. Invalid events\n * are returned with success: false and error details.\n *\n * SSE comments (lines starting with ':') are ignored, including heartbeats.\n *\n * @param chunk - Raw SSE data (may contain multiple events or partial data)\n * @returns Object with parsed events array and remainder string for buffering\n */\nexport function parseSSEChunk(chunk: string): ParseResult {\n const events: ParsedEvent[] = [];\n const blocks = chunk.split('\\n\\n');\n\n for (let i = 0; i < blocks.length - 1; i++) {\n const block = blocks[i]!;\n const parsed = parseBlock(block);\n if (parsed !== null) {\n events.push(parsed);\n }\n }\n\n const lastBlock = blocks[blocks.length - 1] ?? '';\n const remainder = lastBlock;\n\n return { events, remainder };\n}\n\n/**\n * Parses a single SSE block into a ParsedEvent.\n * Returns null for blocks without data (e.g., comment-only blocks).\n */\nfunction parseBlock(block: string): ParsedEvent | null {\n const lines = block.split('\\n');\n let eventType: string | null = null;\n let data: string | null = null;\n\n for (const line of lines) {\n if (line.startsWith(':')) {\n continue;\n }\n if (line.startsWith('event: ')) {\n eventType = line.slice(7);\n continue;\n }\n if (line.startsWith('data: ')) {\n data = line.slice(6);\n continue;\n }\n }\n\n if (data === null) {\n return null;\n }\n\n return parseAndValidate(data, eventType);\n}\n\n/**\n * Parses JSON data and validates against AgentEventSchema.\n * Checks that the event type in data matches the SSE event header if present.\n */\nfunction parseAndValidate(data: string, eventType: string | null): ParsedEvent {\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return { success: false, error: 'Invalid JSON', raw: data };\n }\n\n const result = AgentEventSchema.safeParse(parsed);\n if (result.success) {\n if (eventType !== null && result.data.event !== eventType) {\n return {\n success: false,\n error: `Event type mismatch: header says '${eventType}', data says '${result.data.event}'`,\n raw: parsed,\n };\n }\n return { success: true, event: result.data };\n }\n\n return {\n success: false,\n error: result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; '),\n raw: parsed,\n };\n}\n\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('parseSSEChunk', () => {\n it('parses a single complete event', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n if (result.events[0]?.success) {\n expect(result.events[0].event.event).toBe('metadata');\n expect(result.events[0].event.requestId).toBe('req-1');\n }\n expect(result.remainder).toBe('');\n });\n\n it('parses multiple events in one chunk', () => {\n const chunk =\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n' +\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"delta\",\"delta\":\"Hello\",\"deltaIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.001Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(2);\n expect(result.events[0]?.success).toBe(true);\n expect(result.events[1]?.success).toBe(true);\n if (result.events[0]?.success && result.events[1]?.success) {\n expect(result.events[0].event.event).toBe('text');\n expect(result.events[1].event.event).toBe('text');\n }\n expect(result.remainder).toBe('');\n });\n\n it('returns remainder for partial event', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n' +\n 'event: text\\n' +\n 'data: {\"event\":\"text\",\"request';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n expect(result.remainder).toContain('event: text');\n expect(result.remainder).toContain('data: {\"event\":\"text\",\"request');\n });\n\n it('ignores SSE comments', () => {\n const chunk =\n ': heartbeat\\n' +\n 'event: metadata\\n' +\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n });\n\n it('returns error for invalid JSON', () => {\n const chunk = 'event: text\\n' + 'data: {invalid json}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toBe('Invalid JSON');\n }\n });\n\n it('returns error for invalid event schema', () => {\n const chunk = 'event: text\\n' + 'data: {\"event\":\"text\",\"invalidField\":\"value\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toContain('requestId');\n }\n });\n\n it('returns error for event type mismatch', () => {\n const chunk =\n 'event: metadata\\n' +\n 'data: {\"event\":\"text\",\"requestId\":\"req-1\",\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n const event = result.events[0]!;\n expect(event.success).toBe(false);\n if (!event.success) {\n expect(event.error).toContain('mismatch');\n }\n });\n\n it('handles data without event line', () => {\n const chunk =\n 'data: {\"event\":\"metadata\",\"requestId\":\"req-1\",\"threadId\":\"th-1\",\"agentId\":\"test-agent\",\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result = parseSSEChunk(chunk);\n\n expect(result.events).toHaveLength(1);\n expect(result.events[0]?.success).toBe(true);\n });\n\n it('handles empty chunk', () => {\n const result = parseSSEChunk('');\n expect(result.events).toHaveLength(0);\n expect(result.remainder).toBe('');\n });\n\n it('buffers partial chunks correctly across calls', () => {\n const part1 = 'event: text\\ndata: {\"event\":\"text\",\"requestId\":\"req-1\",';\n const part2 =\n '\"messageId\":\"msg-1\",\"blockId\":\"b1\",\"stage\":\"start\",\"blockIndex\":0,\"timestamp\":\"2025-01-01T00:00:00.000Z\"}\\n\\n';\n\n const result1 = parseSSEChunk(part1);\n expect(result1.events).toHaveLength(0);\n expect(result1.remainder).not.toBe('');\n\n const result2 = parseSSEChunk(result1.remainder + part2);\n expect(result2.events).toHaveLength(1);\n expect(result2.events[0]?.success).toBe(true);\n });\n });\n}\n"],"mappings":"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","names":["import_meta"]}
|
package/dist/sse.d.cts
CHANGED
package/dist/sse.d.ts
CHANGED
package/dist/sse.js
CHANGED
|
@@ -35,8 +35,10 @@ type AssistantContentBlock = {
|
|
|
35
35
|
tool: string;
|
|
36
36
|
/** Whether the tool execution succeeded or failed. */
|
|
37
37
|
status: 'success' | 'error';
|
|
38
|
-
/** Optional human-readable summary of the result.
|
|
38
|
+
/** Optional human-readable summary of the result. */
|
|
39
39
|
summary?: string;
|
|
40
|
+
/** Optional tool output data. */
|
|
41
|
+
output?: Record<string, unknown>;
|
|
40
42
|
};
|
|
41
43
|
/**
|
|
42
44
|
* A single message containing user input.
|
|
@@ -216,7 +218,7 @@ type ToolCallEvent = {
|
|
|
216
218
|
};
|
|
217
219
|
/**
|
|
218
220
|
* Tool execution result event.
|
|
219
|
-
* Contains status
|
|
221
|
+
* Contains status, optional summary, and optional output data.
|
|
220
222
|
*/
|
|
221
223
|
type ToolResultEvent = {
|
|
222
224
|
event: 'tool_result';
|
|
@@ -238,6 +240,8 @@ type ToolResultEvent = {
|
|
|
238
240
|
status?: 'success' | 'error';
|
|
239
241
|
/** Optional human-readable summary of the result (on stop only). */
|
|
240
242
|
summary?: string;
|
|
243
|
+
/** Optional tool output data (on stop only). */
|
|
244
|
+
output?: Record<string, unknown>;
|
|
241
245
|
/** ISO 8601 timestamp. */
|
|
242
246
|
timestamp: string;
|
|
243
247
|
};
|
|
@@ -35,8 +35,10 @@ type AssistantContentBlock = {
|
|
|
35
35
|
tool: string;
|
|
36
36
|
/** Whether the tool execution succeeded or failed. */
|
|
37
37
|
status: 'success' | 'error';
|
|
38
|
-
/** Optional human-readable summary of the result.
|
|
38
|
+
/** Optional human-readable summary of the result. */
|
|
39
39
|
summary?: string;
|
|
40
|
+
/** Optional tool output data. */
|
|
41
|
+
output?: Record<string, unknown>;
|
|
40
42
|
};
|
|
41
43
|
/**
|
|
42
44
|
* A single message containing user input.
|
|
@@ -216,7 +218,7 @@ type ToolCallEvent = {
|
|
|
216
218
|
};
|
|
217
219
|
/**
|
|
218
220
|
* Tool execution result event.
|
|
219
|
-
* Contains status
|
|
221
|
+
* Contains status, optional summary, and optional output data.
|
|
220
222
|
*/
|
|
221
223
|
type ToolResultEvent = {
|
|
222
224
|
event: 'tool_result';
|
|
@@ -238,6 +240,8 @@ type ToolResultEvent = {
|
|
|
238
240
|
status?: 'success' | 'error';
|
|
239
241
|
/** Optional human-readable summary of the result (on stop only). */
|
|
240
242
|
summary?: string;
|
|
243
|
+
/** Optional tool output data (on stop only). */
|
|
244
|
+
output?: Record<string, unknown>;
|
|
241
245
|
/** ISO 8601 timestamp. */
|
|
242
246
|
timestamp: string;
|
|
243
247
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@machinemetrics/agent-event-protocol",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Agent Event Protocol implementation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -41,14 +41,6 @@
|
|
|
41
41
|
"files": [
|
|
42
42
|
"dist"
|
|
43
43
|
],
|
|
44
|
-
"scripts": {
|
|
45
|
-
"build": "tsup",
|
|
46
|
-
"dev": "tsup --watch",
|
|
47
|
-
"test": "vitest run --passWithNoTests",
|
|
48
|
-
"test:watch": "vitest",
|
|
49
|
-
"typecheck": "tsc --noEmit",
|
|
50
|
-
"clean": "rm -rf dist"
|
|
51
|
-
},
|
|
52
44
|
"keywords": [
|
|
53
45
|
"agent",
|
|
54
46
|
"event",
|
|
@@ -65,5 +57,13 @@
|
|
|
65
57
|
"typescript": "^5.7.2",
|
|
66
58
|
"vitest": "^4.0.15",
|
|
67
59
|
"zod": "^3.24.4"
|
|
60
|
+
},
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "tsup",
|
|
63
|
+
"dev": "tsup --watch",
|
|
64
|
+
"test": "vitest run --passWithNoTests",
|
|
65
|
+
"test:watch": "vitest",
|
|
66
|
+
"typecheck": "tsc --noEmit",
|
|
67
|
+
"clean": "rm -rf dist"
|
|
68
68
|
}
|
|
69
|
-
}
|
|
69
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/schemas.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Zod schema for validating user content blocks.\n * Currently only supports text; extensible for multimodal.\n */\nexport const UserContentBlockSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n});\n\n/**\n * Zod schema for validating assistant content blocks.\n * Discriminated union supporting text, thinking, tool_use, and tool_result.\n */\nexport const AssistantContentBlockSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('text'), text: z.string() }),\n z.object({ type: z.literal('thinking'), text: z.string() }),\n z.object({\n type: z.literal('tool_use'),\n toolCallId: z.string(),\n tool: z.string(),\n args: z.record(z.string(), z.unknown()),\n }),\n z.object({\n type: z.literal('tool_result'),\n toolCallId: z.string(),\n tool: z.string(),\n status: z.enum(['success', 'error']),\n summary: z.string().optional(),\n }),\n]);\n\n/**\n * Zod schema for validating input messages.\n */\nexport const InputMessageSchema = z.object({\n content: z.array(UserContentBlockSchema),\n});\n\n/**\n * Zod schema for validating action results from continuation events.\n */\nexport const ActionResultSchema = z.object({\n actionId: z.string(),\n kind: z.string(),\n status: z.enum(['success', 'error']),\n data: z.unknown().optional(),\n error: z.string().optional(),\n});\n\n/**\n * Zod schema for validating agent request payloads.\n * Context object uses passthrough() to allow additional fields.\n */\nexport const AgentRequestSchema = z.object({\n messages: z.array(InputMessageSchema),\n threadId: z.string().optional(),\n context: z\n .object({\n actionResults: z.array(ActionResultSchema).optional(),\n })\n .passthrough()\n .optional(),\n});\n\n/**\n * Zod schema for event lifecycle stages.\n */\nexport const EventStageSchema = z.enum(['start', 'delta', 'stop']);\n\n/**\n * Zod schema for protocol error codes.\n */\nexport const ErrorCodeSchema = z.enum([\n 'auth_failed',\n 'thread_not_found',\n 'thread_access_denied',\n 'invalid_message_format',\n 'message_too_large',\n 'rate_limit_exceeded',\n 'stream_timeout',\n 'agent_error',\n 'tool_error',\n 'internal_error',\n 'invalid_action_id',\n]);\n\n/**\n * Zod schema for stream finish reasons.\n */\nexport const FinishReasonSchema = z.enum(['stop', 'length', 'error', 'action_required']);\n\n/**\n * Zod schema for metadata events.\n * First event in every stream, provides identifiers.\n */\nexport const MetadataEventSchema = z.object({\n event: z.literal('metadata'),\n requestId: z.string(),\n threadId: z.string(),\n agentId: z.string(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for text streaming events.\n * Validates the stage lifecycle with appropriate optional fields per stage.\n */\nexport const TextEventSchema = z.object({\n event: z.literal('text'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for thinking/reasoning events.\n * Structure mirrors TextEventSchema.\n */\nexport const ThinkingEventSchema = z.object({\n event: z.literal('thinking'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for tool call events.\n * Args are optional (only present on stop stage).\n */\nexport const ToolCallEventSchema = z.object({\n event: z.literal('tool_call'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n toolCallId: z.string().optional(),\n tool: z.string().optional(),\n delta: z.string().optional(),\n deltaIndex: z.number().optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for tool result events.\n * Status and summary only present on stop stage.\n */\nexport const ToolResultEventSchema = z.object({\n event: z.literal('tool_result'),\n requestId: z.string(),\n messageId: z.string(),\n blockId: z.string(),\n blockIndex: z.number().optional(),\n stage: EventStageSchema,\n toolCallId: z.string().optional(),\n tool: z.string().optional(),\n status: z.enum(['success', 'error']).optional(),\n summary: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for done events.\n * Terminal event with complete content array.\n */\nexport const DoneEventSchema = z.object({\n event: z.literal('done'),\n requestId: z.string(),\n messageId: z.string(),\n threadId: z.string(),\n content: z.array(AssistantContentBlockSchema),\n usage: z\n .object({\n promptTokens: z.number(),\n completionTokens: z.number(),\n })\n .optional(),\n finishReason: FinishReasonSchema,\n traceId: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for error events.\n * Terminal event with error details and retry guidance.\n */\nexport const ErrorEventSchema = z.object({\n event: z.literal('error'),\n requestId: z.string(),\n message: z.string(),\n code: ErrorCodeSchema.optional(),\n retryable: z.boolean().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for aborted events.\n * Terminal event acknowledging client cancellation.\n */\nexport const AbortedEventSchema = z.object({\n event: z.literal('aborted'),\n requestId: z.string(),\n messageId: z.string().optional(),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for continuation events.\n * Signals client action required before stream can continue.\n */\nexport const ContinuationEventSchema = z.object({\n event: z.literal('continuation'),\n requestId: z.string(),\n actionId: z.string(),\n kind: z.string(),\n payload: z.record(z.string(), z.unknown()),\n timestamp: z.string(),\n});\n\n/**\n * Zod schema for all protocol events.\n * Discriminated union on the `event` field for efficient parsing.\n */\nexport const AgentEventSchema = z.discriminatedUnion('event', [\n MetadataEventSchema,\n TextEventSchema,\n ThinkingEventSchema,\n ToolCallEventSchema,\n ToolResultEventSchema,\n DoneEventSchema,\n ErrorEventSchema,\n AbortedEventSchema,\n ContinuationEventSchema,\n]);\n"],"mappings":"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","names":[]}
|
|
File without changes
|