march-ai-sdk 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +732 -0
- package/dist/app-C_umwZXh.d.ts +790 -0
- package/dist/extensions/langgraph.d.ts +144 -0
- package/dist/extensions/langgraph.js +326 -0
- package/dist/extensions/langgraph.js.map +1 -0
- package/dist/extensions/vercel-ai.d.ts +124 -0
- package/dist/extensions/vercel-ai.js +177 -0
- package/dist/extensions/vercel-ai.js.map +1 -0
- package/dist/index.d.ts +260 -0
- package/dist/index.js +1695 -0
- package/dist/index.js.map +1 -0
- package/dist/proto/gateway.proto +99 -0
- package/package.json +83 -0
- package/src/agent-state-client.ts +115 -0
- package/src/agent.ts +293 -0
- package/src/api-paths.ts +60 -0
- package/src/app.ts +235 -0
- package/src/artifact.ts +59 -0
- package/src/attachment-client.ts +78 -0
- package/src/checkpoint-client.ts +175 -0
- package/src/conversation-client.ts +109 -0
- package/src/conversation-message.ts +61 -0
- package/src/conversation.ts +123 -0
- package/src/exceptions.ts +78 -0
- package/src/extensions/index.ts +6 -0
- package/src/extensions/langgraph.ts +351 -0
- package/src/extensions/vercel-ai.ts +177 -0
- package/src/gateway-client.ts +420 -0
- package/src/heartbeat.ts +89 -0
- package/src/index.ts +70 -0
- package/src/memory-client.ts +125 -0
- package/src/memory.ts +68 -0
- package/src/message.ts +178 -0
- package/src/proto/gateway.proto +99 -0
- package/src/streamer.ts +242 -0
- package/src/types.ts +196 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/conversation-message.ts","../src/conversation.ts","../src/memory.ts","../src/exceptions.ts","../src/types.ts","../src/attachment-client.ts","../src/message.ts","../src/artifact.ts","../src/streamer.ts","../src/api-paths.ts","../src/heartbeat.ts","../src/agent.ts","../src/gateway-client.ts","../src/conversation-client.ts","../src/memory-client.ts","../src/app.ts","../src/checkpoint-client.ts","../src/agent-state-client.ts","../src/index.ts"],"names":["z","__filename","__dirname","credentials"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * March Agent SDK - Conversation Message\n * Port of Python march_agent/conversation_message.py\n */\n\nimport type { ConversationMessageData } from './types.js'\n\n/**\n * Represents a message from conversation history.\n */\nexport class ConversationMessage {\n readonly id: string\n readonly conversationId: string\n readonly role: 'user' | 'assistant' | 'system'\n readonly content: string\n readonly from?: string\n readonly to?: string\n readonly createdAt: Date\n readonly metadata?: Record<string, unknown>\n\n constructor(data: ConversationMessageData) {\n this.id = data.id\n this.conversationId = data.conversationId\n this.role = data.role\n this.content = data.content\n this.from = data.from\n this.to = data.to\n this.createdAt = new Date(data.createdAt)\n this.metadata = data.metadata\n }\n\n /**\n * Create from API response\n */\n static fromApiResponse(data: Record<string, unknown>): ConversationMessage {\n return new ConversationMessage({\n id: data.id as string,\n conversationId: data.conversation_id as string,\n role: data.role as 'user' | 'assistant' | 'system',\n content: data.content as string,\n from: data.from as string | undefined,\n to: data.to as string | undefined,\n createdAt: data.created_at as string,\n metadata: data.metadata as Record<string, unknown> | undefined,\n })\n }\n\n /**\n * Check if this is a user message\n */\n isUser(): boolean {\n return this.role === 'user'\n }\n\n /**\n * Check if this is an assistant message\n */\n isAssistant(): boolean {\n return this.role === 'assistant'\n }\n}\n","/**\n * March Agent SDK - Conversation Helper\n * Port of Python march_agent/conversation.py\n */\n\nimport { ConversationClient } from './conversation-client.js'\nimport { ConversationMessage } from './conversation-message.js'\n// Types are inlined to avoid unused import warnings\n\nexport interface GetHistoryOptions {\n limit?: number\n offset?: number\n}\n\nexport interface GetAgentHistoryOptions extends GetHistoryOptions {\n agentName?: string\n}\n\n/**\n * Helper class for accessing conversation history.\n * Provides convenient methods for fetching messages.\n */\nexport class Conversation {\n readonly conversationId: string\n private readonly client: ConversationClient\n private readonly agentName?: string\n\n constructor(\n conversationId: string,\n client: ConversationClient,\n agentName?: string\n ) {\n this.conversationId = conversationId\n this.client = client\n this.agentName = agentName\n }\n\n /**\n * Get all messages in the conversation.\n */\n async getHistory(options: GetHistoryOptions = {}): Promise<ConversationMessage[]> {\n const messages = await this.client.getMessages(this.conversationId, {\n limit: options.limit ?? 100,\n offset: options.offset ?? 0,\n })\n\n return messages.map((m) => ConversationMessage.fromApiResponse(m as unknown as Record<string, unknown>))\n }\n\n /**\n * Get messages to/from the current agent.\n * Useful for getting conversation history for a specific agent.\n */\n async getAgentHistory(options: GetAgentHistoryOptions = {}): Promise<ConversationMessage[]> {\n const targetAgent = options.agentName ?? this.agentName\n if (!targetAgent) {\n // If no agent name, return all messages\n return this.getHistory(options)\n }\n\n // Get messages where the agent is either sender or receiver\n const [toAgent, fromAgent] = await Promise.all([\n this.client.getMessages(this.conversationId, {\n to: targetAgent,\n limit: options.limit ?? 50,\n offset: options.offset ?? 0,\n }),\n this.client.getMessages(this.conversationId, {\n from: targetAgent,\n limit: options.limit ?? 50,\n offset: options.offset ?? 0,\n }),\n ])\n\n // Combine and sort by creation time\n const allMessages = [...toAgent, ...fromAgent]\n const uniqueMessages = Array.from(\n new Map(allMessages.map((m) => [m.id, m])).values()\n )\n\n // Sort by createdAt\n uniqueMessages.sort((a, b) => {\n const dateA = new Date(a.createdAt).getTime()\n const dateB = new Date(b.createdAt).getTime()\n return dateA - dateB\n })\n\n return uniqueMessages.map((m) =>\n ConversationMessage.fromApiResponse(m as unknown as Record<string, unknown>)\n )\n }\n\n /**\n * Get the last N messages.\n */\n async getLastMessages(count: number): Promise<ConversationMessage[]> {\n return this.getHistory({ limit: count })\n }\n\n /**\n * Get user messages only.\n */\n async getUserMessages(options: GetHistoryOptions = {}): Promise<ConversationMessage[]> {\n const messages = await this.client.getMessages(this.conversationId, {\n ...options,\n role: 'user',\n })\n\n return messages.map((m) => ConversationMessage.fromApiResponse(m as unknown as Record<string, unknown>))\n }\n\n /**\n * Get assistant messages only.\n */\n async getAssistantMessages(options: GetHistoryOptions = {}): Promise<ConversationMessage[]> {\n const messages = await this.client.getMessages(this.conversationId, {\n ...options,\n role: 'assistant',\n })\n\n return messages.map((m) => ConversationMessage.fromApiResponse(m as unknown as Record<string, unknown>))\n }\n}\n","/**\n * March Agent SDK - Memory Helper\n * Port of Python march_agent/memory.py\n */\n\nimport { MemoryClient } from './memory-client.js'\nimport type { MemoryMessage, MemorySearchResult, UserSummary } from './types.js'\n\n/**\n * Helper class for accessing long-term memory.\n * Provides convenient methods for storing and searching memories.\n */\nexport class Memory {\n readonly userId: string\n readonly conversationId: string\n private readonly client: MemoryClient\n\n constructor(\n userId: string,\n conversationId: string,\n client: MemoryClient\n ) {\n this.userId = userId\n this.conversationId = conversationId\n this.client = client\n }\n\n /**\n * Add messages to memory.\n */\n async addMessages(messages: MemoryMessage[]): Promise<number> {\n const result = await this.client.addMessages(\n this.userId,\n this.conversationId,\n messages\n )\n return result.added\n }\n\n /**\n * Add a single message to memory.\n */\n async addMessage(role: 'user' | 'assistant', content: string): Promise<void> {\n await this.addMessages([{ role, content }])\n }\n\n /**\n * Search memory for relevant content.\n */\n async search(query: string, limit: number = 10): Promise<MemorySearchResult[]> {\n return this.client.search(this.userId, query, limit)\n }\n\n /**\n * Get user summary.\n */\n async getSummary(): Promise<UserSummary | null> {\n return this.client.getUserSummary(this.userId)\n }\n\n /**\n * Clear all memories for this user.\n */\n async clear(): Promise<number> {\n const result = await this.client.clearMemory(this.userId)\n return result.deleted\n }\n}\n","/**\n * March Agent SDK - Custom Errors\n * Port of Python march_agent/exceptions.py\n */\n\n/**\n * Base error class for March Agent SDK\n */\nexport class MarchAgentError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MarchAgentError'\n Error.captureStackTrace?.(this, this.constructor)\n }\n}\n\n/**\n * Error during agent registration with AI Inventory\n */\nexport class RegistrationError extends MarchAgentError {\n constructor(message: string) {\n super(message)\n this.name = 'RegistrationError'\n }\n}\n\n/**\n * Error during Kafka operations (produce/consume)\n */\nexport class KafkaError extends MarchAgentError {\n constructor(message: string) {\n super(message)\n this.name = 'KafkaError'\n }\n}\n\n/**\n * Error in SDK configuration\n */\nexport class ConfigurationError extends MarchAgentError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Error from API calls to backend services\n */\nexport class APIException extends MarchAgentError {\n statusCode?: number\n\n constructor(message: string, statusCode?: number) {\n super(message)\n this.name = 'APIException'\n this.statusCode = statusCode\n }\n}\n\n/**\n * Error during heartbeat operations\n */\nexport class HeartbeatError extends MarchAgentError {\n constructor(message: string) {\n super(message)\n this.name = 'HeartbeatError'\n }\n}\n\n/**\n * Error during gRPC connection/communication\n */\nexport class GatewayError extends MarchAgentError {\n constructor(message: string) {\n super(message)\n this.name = 'GatewayError'\n }\n}\n","/**\n * March Agent SDK - Shared Types\n * Port of Python march_agent types\n */\n\nimport { z } from 'zod'\n\n// ============================================================================\n// Kafka Message Types\n// ============================================================================\n\nexport interface KafkaMessage {\n topic: string\n partition: number\n offset: number\n key: string\n headers: Record<string, string>\n body: Record<string, unknown>\n timestamp: number\n}\n\nexport interface KafkaHeaders {\n conversationId?: string\n userId?: string\n from_?: string\n to_?: string\n messageMetadata?: string\n messageSchema?: string\n attachment?: string\n [key: string]: string | undefined\n}\n\n// ============================================================================\n// Agent Registration Types\n// ============================================================================\n\nexport interface AgentRegistrationData {\n id: string\n name: string\n about: string\n document: string\n representationName?: string\n baseUrl?: string\n metadata?: Record<string, unknown>\n relatedPages?: RelatedPage[]\n}\n\nexport interface RelatedPage {\n name: string\n endpoint: string\n}\n\nexport interface RegisterOptions {\n name: string\n about: string\n document: string\n representationName?: string\n baseUrl?: string\n metadata?: Record<string, unknown>\n relatedPages?: RelatedPage[]\n}\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n// Forward reference - actual Message class is imported where needed\n// Using 'any' here to avoid circular dependency, but consumers should use Message type\nexport interface MessageHandler {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (message: any, sender: string): void | Promise<void>\n}\n\nexport interface SenderFilterOptions {\n senders?: string[]\n}\n\n// ============================================================================\n// Streamer Types\n// ============================================================================\n\nexport interface StreamOptions {\n persist?: boolean\n eventType?: string\n}\n\nexport interface StreamerOptions {\n awaiting?: boolean\n sendTo?: string\n}\n\n// ============================================================================\n// Attachment Types\n// ============================================================================\n\nexport const AttachmentInfoSchema = z.object({\n url: z.string(),\n filename: z.string(),\n contentType: z.string(),\n size: z.number().optional(),\n fileType: z.string().optional(),\n})\n\nexport type AttachmentInfo = z.infer<typeof AttachmentInfoSchema>\n\nexport function isImageAttachment(attachment: AttachmentInfo): boolean {\n return attachment.contentType?.startsWith('image/') || false\n}\n\nexport function isPdfAttachment(attachment: AttachmentInfo): boolean {\n return attachment.contentType === 'application/pdf'\n}\n\n// ============================================================================\n// Conversation Message Types\n// ============================================================================\n\nexport interface ConversationMessageData {\n id: string\n conversationId: string\n role: 'user' | 'assistant' | 'system'\n content: string\n from?: string\n to?: string\n createdAt: string\n metadata?: Record<string, unknown>\n}\n\n// ============================================================================\n// Gateway Client Types\n// ============================================================================\n\nexport interface ProduceAck {\n topic: string\n partition: number\n offset: number\n correlationId?: string\n}\n\n// ============================================================================\n// App Configuration Types\n// ============================================================================\n\nexport interface AppOptions {\n gatewayUrl: string\n apiKey: string\n heartbeatInterval?: number\n maxConcurrentTasks?: number\n errorMessageTemplate?: string\n secure?: boolean\n}\n\n// ============================================================================\n// HTTP Response Types\n// ============================================================================\n\nexport interface ConversationData {\n id: string\n userId: string\n agentId?: string\n awaitingRoute?: string\n pendingResponseSchema?: Record<string, unknown>\n createdAt: string\n updatedAt: string\n metadata?: Record<string, unknown>\n}\n\nexport interface GetMessagesOptions {\n role?: string\n from?: string\n to?: string\n limit?: number\n offset?: number\n}\n\n// ============================================================================\n// Memory Types\n// ============================================================================\n\nexport interface MemoryMessage {\n role: 'user' | 'assistant'\n content: string\n timestamp?: string\n}\n\nexport interface MemorySearchResult {\n content: string\n similarity: number\n metadata?: Record<string, unknown>\n}\n\nexport interface UserSummary {\n userId: string\n summary: string\n updatedAt: string\n}\n","/**\n * March Agent SDK - Attachment Client\n * Port of Python march_agent/attachment_client.py\n */\n\nimport { APIException } from './exceptions.js'\nimport { AttachmentInfoSchema, type AttachmentInfo } from './types.js'\n\n/**\n * Re-export AttachmentInfo for convenience\n */\nexport { type AttachmentInfo } from './types.js'\n\n/**\n * Create AttachmentInfo from API data\n */\nexport function createAttachmentInfo(data: Record<string, unknown>): AttachmentInfo {\n return AttachmentInfoSchema.parse({\n url: data.url,\n filename: data.filename || data.file_name,\n contentType: data.content_type || data.contentType,\n size: data.size,\n fileType: data.file_type || data.fileType,\n })\n}\n\n/**\n * HTTP client for downloading attachments.\n */\nexport class AttachmentClient {\n private readonly baseUrl: string\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '')\n }\n\n /**\n * Build full URL for an attachment.\n */\n private buildUrl(attachmentUrl: string): string {\n // If already absolute URL, use as-is\n if (attachmentUrl.startsWith('http://') || attachmentUrl.startsWith('https://')) {\n return attachmentUrl\n }\n // Otherwise, prepend base URL\n return `${this.baseUrl}${attachmentUrl.startsWith('/') ? '' : '/'}${attachmentUrl}`\n }\n\n /**\n * Download attachment as bytes (Buffer).\n */\n async download(url: string): Promise<Buffer> {\n const fullUrl = this.buildUrl(url)\n\n try {\n const response = await fetch(fullUrl)\n\n if (!response.ok) {\n throw new APIException(`Failed to download attachment: ${response.status}`, response.status)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n return Buffer.from(arrayBuffer)\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to download attachment: ${error}`)\n }\n }\n\n /**\n * Download attachment as base64 string.\n * Useful for LLM vision APIs.\n */\n async downloadAsBase64(url: string): Promise<string> {\n const buffer = await this.download(url)\n return buffer.toString('base64')\n }\n}\n","/**\n * March Agent SDK - Message\n * Port of Python march_agent/message.py\n */\n\nimport { Conversation } from './conversation.js'\nimport { Memory } from './memory.js'\nimport { ConversationClient } from './conversation-client.js'\nimport { MemoryClient } from './memory-client.js'\nimport { AttachmentClient, createAttachmentInfo } from './attachment-client.js'\nimport type { AttachmentInfo, KafkaHeaders } from './types.js'\n\n/**\n * Represents an incoming message to the agent.\n */\nexport class Message {\n readonly content: string\n readonly conversationId: string\n readonly userId: string\n readonly headers: Record<string, string>\n readonly rawBody: Record<string, unknown>\n readonly conversation?: Conversation\n readonly memory?: Memory\n readonly metadata?: Record<string, unknown>\n readonly schema?: Record<string, unknown>\n readonly attachment?: AttachmentInfo\n\n private readonly attachmentClient?: AttachmentClient\n\n constructor(options: {\n content: string\n conversationId: string\n userId: string\n headers: Record<string, string>\n rawBody: Record<string, unknown>\n conversation?: Conversation\n memory?: Memory\n metadata?: Record<string, unknown>\n schema?: Record<string, unknown>\n attachment?: AttachmentInfo\n attachmentClient?: AttachmentClient\n }) {\n this.content = options.content\n this.conversationId = options.conversationId\n this.userId = options.userId\n this.headers = options.headers\n this.rawBody = options.rawBody\n this.conversation = options.conversation\n this.memory = options.memory\n this.metadata = options.metadata\n this.schema = options.schema\n this.attachment = options.attachment\n this.attachmentClient = options.attachmentClient\n }\n\n /**\n * Create Message from Kafka message data.\n */\n static fromKafkaMessage(\n body: Record<string, unknown>,\n headers: KafkaHeaders,\n options: {\n conversationClient?: ConversationClient\n memoryClient?: MemoryClient\n attachmentClient?: AttachmentClient\n agentName?: string\n } = {}\n ): Message {\n const conversationId = headers.conversationId ?? ''\n const userId = headers.userId ?? 'anonymous'\n\n // Parse metadata from header\n let metadata: Record<string, unknown> | undefined\n if (headers.messageMetadata) {\n try {\n metadata = JSON.parse(headers.messageMetadata)\n } catch {\n // Ignore parse errors\n }\n }\n\n // Parse schema from header\n let schema: Record<string, unknown> | undefined\n if (headers.messageSchema) {\n try {\n schema = JSON.parse(headers.messageSchema)\n } catch {\n // Ignore parse errors\n }\n }\n\n // Parse attachment from header or body\n let attachment: AttachmentInfo | undefined\n if (headers.attachment) {\n try {\n const attachmentData = JSON.parse(headers.attachment)\n attachment = createAttachmentInfo(attachmentData)\n } catch {\n // Ignore parse errors\n }\n }\n // Fallback to body attachment\n if (!attachment && body.attachment) {\n try {\n attachment = createAttachmentInfo(body.attachment as Record<string, unknown>)\n } catch {\n // Ignore parse errors\n }\n }\n\n // Create conversation helper\n let conversation: Conversation | undefined\n if (conversationId && options.conversationClient) {\n conversation = new Conversation(\n conversationId,\n options.conversationClient,\n options.agentName\n )\n }\n\n // Create memory helper\n let memory: Memory | undefined\n if (options.memoryClient && userId && conversationId) {\n memory = new Memory(userId, conversationId, options.memoryClient)\n }\n\n return new Message({\n content: (body.content as string) ?? '',\n conversationId,\n userId,\n headers: headers as Record<string, string>,\n rawBody: body,\n conversation,\n memory,\n metadata,\n schema,\n attachment,\n attachmentClient: options.attachmentClient,\n })\n }\n\n /**\n * Check if message has an attachment.\n */\n hasAttachment(): boolean {\n return this.attachment !== undefined\n }\n\n /**\n * Download attachment as bytes (Buffer).\n * \n * @throws Error if no attachment is available\n */\n async getAttachmentBytes(): Promise<Buffer> {\n if (!this.attachment) {\n throw new Error('No attachment available')\n }\n if (!this.attachmentClient) {\n throw new Error('AttachmentClient not available')\n }\n return this.attachmentClient.download(this.attachment.url)\n }\n\n /**\n * Get attachment as base64 string (for LLM vision APIs).\n * \n * @throws Error if no attachment is available\n */\n async getAttachmentBase64(): Promise<string> {\n if (!this.attachment) {\n throw new Error('No attachment available')\n }\n if (!this.attachmentClient) {\n throw new Error('AttachmentClient not available')\n }\n return this.attachmentClient.downloadAsBase64(this.attachment.url)\n }\n}\n","/**\n * March Agent SDK - Artifact Types\n * Port of Python march_agent/artifact.py\n */\n\nimport { z } from 'zod'\n\n/**\n * Valid artifact types for message attachments\n */\nexport const ArtifactTypeSchema = z.enum([\n 'document',\n 'image',\n 'iframe',\n 'video',\n 'audio',\n 'code',\n 'link',\n 'file',\n])\n\nexport type ArtifactType = z.infer<typeof ArtifactTypeSchema>\n\n/**\n * Schema for artifact validation\n */\nexport const ArtifactSchema = z.object({\n url: z.string(),\n type: ArtifactTypeSchema,\n title: z.string().optional(),\n description: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport type Artifact = z.infer<typeof ArtifactSchema>\n\n/**\n * Input type for adding artifacts (without strict validation)\n */\nexport interface ArtifactInput {\n url: string\n type: ArtifactType | string\n title?: string\n description?: string\n metadata?: Record<string, unknown>\n}\n\n/**\n * Convert artifact input to validated artifact\n */\nexport function toArtifact(input: ArtifactInput): Artifact {\n return ArtifactSchema.parse({\n url: input.url,\n type: input.type,\n title: input.title,\n description: input.description,\n metadata: input.metadata,\n })\n}\n","/**\n * March Agent SDK - Streamer\n * Port of Python march_agent/streamer.py\n */\n\nimport type { Message } from './message.js'\nimport type { GatewayClient } from './gateway-client.js'\nimport type { ConversationClient } from './conversation-client.js'\nimport type { Artifact, ArtifactInput } from './artifact.js'\nimport { toArtifact } from './artifact.js'\nimport type { StreamOptions } from './types.js'\n\n/**\n * Handles streaming responses back to the conversation via the gateway.\n */\nexport class Streamer {\n private readonly agentName: string\n private readonly originalMessage: Message\n private readonly gatewayClient: GatewayClient\n private readonly conversationClient?: ConversationClient\n private readonly sendTo: string\n private awaiting: boolean\n\n private responseSchema?: Record<string, unknown>\n private messageMetadata?: Record<string, unknown>\n private artifacts: Artifact[] = []\n private streamedContent: string = ''\n private firstChunkSent: boolean = false\n private finished: boolean = false\n\n constructor(options: {\n agentName: string\n originalMessage: Message\n gatewayClient: GatewayClient\n conversationClient?: ConversationClient\n awaiting?: boolean\n sendTo?: string\n }) {\n this.agentName = options.agentName\n this.originalMessage = options.originalMessage\n this.gatewayClient = options.gatewayClient\n this.conversationClient = options.conversationClient\n this.awaiting = options.awaiting ?? false\n this.sendTo = options.sendTo ?? 'user'\n }\n\n /**\n * Set response schema for form rendering (fluent API).\n */\n setResponseSchema(schema: Record<string, unknown>): this {\n this.responseSchema = schema\n return this\n }\n\n /**\n * Set message metadata (fluent API).\n */\n setMessageMetadata(metadata: Record<string, unknown>): this {\n this.messageMetadata = metadata\n return this\n }\n\n /**\n * Add an artifact to the message (fluent API).\n */\n addArtifact(artifact: ArtifactInput): this {\n this.artifacts.push(toArtifact(artifact))\n return this\n }\n\n /**\n * Set all artifacts at once (replaces any existing).\n */\n setArtifacts(artifacts: ArtifactInput[]): this {\n this.artifacts = artifacts.map(toArtifact)\n return this\n }\n\n /**\n * Stream a content chunk.\n */\n stream(content: string, options: StreamOptions = {}): void {\n const { persist = true, eventType } = options\n\n if (this.finished) {\n console.warn('Streamer.stream() called after finish()')\n return\n }\n\n if (persist) {\n this.streamedContent += content\n }\n\n this.send(content, false, persist, eventType)\n }\n\n /**\n * Alias for stream() - write a content chunk.\n */\n write(content: string, persist: boolean = true): void {\n this.stream(content, { persist })\n }\n\n /**\n * Finish streaming with done=true signal.\n */\n async finish(awaitingOverride?: boolean): Promise<void> {\n if (this.finished) {\n return\n }\n\n this.finished = true\n\n // Determine final awaiting value\n let finalAwaiting = awaitingOverride ?? this.awaiting\n\n // If response schema was set and awaiting not explicitly false, set awaiting\n if (this.responseSchema && awaitingOverride !== false) {\n finalAwaiting = true\n }\n\n // Send final done message\n this.send('', true, false)\n\n // Set pending response schema on conversation\n if (this.responseSchema && this.conversationClient) {\n await this.setPendingResponseSchema()\n }\n\n // Set awaiting route\n if (finalAwaiting && this.conversationClient) {\n await this.setAwaitingRoute()\n }\n }\n\n /**\n * Send message to router via gateway.\n */\n private send(\n content: string,\n done: boolean,\n persist: boolean = true,\n eventType?: string\n ): void {\n // Build headers (matching Python implementation)\n const headers: Record<string, string> = {\n conversationId: this.originalMessage.conversationId,\n userId: this.originalMessage.userId,\n from_: this.agentName,\n to_: this.sendTo,\n nextRoute: this.sendTo,\n }\n\n if (eventType) {\n headers.eventType = eventType\n }\n\n // Include metadata, artifacts, and schema on first chunk (only once)\n if (!this.firstChunkSent) {\n this.firstChunkSent = true\n\n if (this.messageMetadata) {\n headers.messageMetadata = JSON.stringify(this.messageMetadata)\n }\n\n if (this.artifacts.length > 0) {\n headers.artifacts = JSON.stringify(this.artifacts)\n }\n\n if (this.responseSchema) {\n headers.responseSchema = JSON.stringify(this.responseSchema)\n }\n }\n\n // Build body (matching Python implementation - includes persist)\n const body: Record<string, unknown> = {\n content,\n done,\n persist,\n }\n\n if (eventType) {\n body.eventType = eventType\n }\n\n // Produce message via gateway\n this.gatewayClient.produce(\n 'router.inbox',\n this.originalMessage.conversationId,\n headers,\n body\n )\n }\n\n /**\n * Store response schema on conversation for form validation.\n */\n private async setPendingResponseSchema(): Promise<void> {\n if (!this.conversationClient || !this.responseSchema) return\n\n try {\n await this.conversationClient.updateConversation(\n this.originalMessage.conversationId,\n { pendingResponseSchema: this.responseSchema } as never\n )\n } catch (error) {\n console.error('Failed to set pending response schema:', error)\n }\n }\n\n /**\n * Set awaiting_route to this agent's name.\n */\n private async setAwaitingRoute(): Promise<void> {\n if (!this.conversationClient) return\n\n try {\n await this.conversationClient.updateConversation(\n this.originalMessage.conversationId,\n { awaitingRoute: this.agentName } as never\n )\n } catch (error) {\n console.error('Failed to set awaiting route:', error)\n }\n }\n\n /**\n * Get the accumulated streamed content.\n */\n getStreamedContent(): string {\n return this.streamedContent\n }\n\n /**\n * Support for async disposal (TypeScript 5.2+ \"using\" syntax).\n */\n async [Symbol.asyncDispose](): Promise<void> {\n if (!this.finished) {\n await this.finish()\n }\n }\n}\n","/**\n * March Agent SDK - API Paths Configuration\n * \n * Centralized configuration for all API endpoint paths.\n * This allows easy configuration if API versions or paths change.\n */\n\n/**\n * API paths for AI Inventory service.\n */\nexport const AI_INVENTORY_PATHS = {\n /** Register a new agent */\n AGENT_REGISTER: '/api/v1/agents/register',\n /** Send heartbeat */\n HEALTH_HEARTBEAT: '/api/v1/health/heartbeat',\n} as const\n\n/**\n * API paths for Conversation Store service.\n * Note: These paths don't have /api/v1/ prefix.\n */\nexport const CONVERSATION_STORE_PATHS = {\n /** Get/update conversation by ID */\n CONVERSATION: (conversationId: string) => `/conversations/${conversationId}`,\n /** Get messages for a conversation */\n CONVERSATION_MESSAGES: (conversationId: string) => `/conversations/${conversationId}/messages`,\n /** Checkpoints base path */\n CHECKPOINTS: '/checkpoints/',\n /** Checkpoint by thread ID */\n CHECKPOINT_THREAD: (threadId: string) => `/checkpoints/${threadId}`,\n /** Agent state by conversation ID */\n AGENT_STATE: (conversationId: string) => `/agent-state/${conversationId}`,\n} as const\n\n/**\n * API paths for AI Memory service.\n * Note: These paths don't have /api/v1/ prefix.\n */\nexport const MEMORY_PATHS = {\n /** User memory base */\n USER_MEMORY: (userId: string) => `/memory/${userId}`,\n /** Add messages to memory */\n USER_MESSAGES: (userId: string) => `/memory/${userId}/messages`,\n /** Search user memory */\n USER_SEARCH: (userId: string) => `/memory/${userId}/search`,\n /** Get user summary */\n USER_SUMMARY: (userId: string) => `/memory/${userId}/summary`,\n} as const\n\n/**\n * Service names for gateway proxy routing.\n */\nexport const SERVICES = {\n AI_INVENTORY: 'ai-inventory',\n CONVERSATION_STORE: 'conversation-store',\n AI_MEMORY: 'ai-memory',\n ATTACHMENT: 'attachment',\n} as const\n\nexport type ServiceName = typeof SERVICES[keyof typeof SERVICES]\n","/**\n * March Agent SDK - Heartbeat Manager\n * Port of Python march_agent/heartbeat.py\n */\n\nimport type { GatewayClient } from './gateway-client.js'\nimport { AI_INVENTORY_PATHS, SERVICES } from './api-paths.js'\n\n/**\n * Manages periodic heartbeats to keep the agent status active.\n * Sends heartbeats via HTTP to the AI Inventory service.\n */\nexport class HeartbeatManager {\n private readonly gatewayClient: GatewayClient\n private readonly agentName: string\n private readonly intervalMs: number\n private timer?: ReturnType<typeof setInterval>\n private running: boolean = false\n\n constructor(\n gatewayClient: GatewayClient,\n agentName: string,\n intervalSeconds: number = 60\n ) {\n this.gatewayClient = gatewayClient\n this.agentName = agentName\n this.intervalMs = intervalSeconds * 1000\n }\n\n /**\n * Start sending heartbeats.\n */\n start(): void {\n if (this.running) {\n return\n }\n\n this.running = true\n this.timer = setInterval(() => {\n this.sendHeartbeat()\n }, this.intervalMs)\n\n // Send first heartbeat immediately\n this.sendHeartbeat()\n }\n\n /**\n * Stop sending heartbeats.\n */\n stop(): void {\n this.running = false\n if (this.timer) {\n clearInterval(this.timer)\n this.timer = undefined\n }\n }\n\n /**\n * Send a single heartbeat via HTTP to AI Inventory.\n */\n private async sendHeartbeat(): Promise<void> {\n if (!this.running) {\n return\n }\n\n try {\n const response = await this.gatewayClient.httpPost(\n SERVICES.AI_INVENTORY,\n AI_INVENTORY_PATHS.HEALTH_HEARTBEAT,\n { name: this.agentName }\n )\n\n if (response.status === 404) {\n console.warn(`Agent '${this.agentName}' not found. Re-registration may be needed.`)\n } else if (!response.ok) {\n console.warn(`Heartbeat returned status ${response.status}`)\n }\n } catch (error) {\n console.error('Heartbeat failed:', error)\n }\n }\n\n /**\n * Check if heartbeat is running.\n */\n isRunning(): boolean {\n return this.running\n }\n}\n","/**\n * March Agent SDK - Agent\n * Port of Python march_agent/agent.py\n */\n\nimport { Message } from './message.js'\nimport { Streamer } from './streamer.js'\nimport { HeartbeatManager } from './heartbeat.js'\nimport { ConfigurationError } from './exceptions.js'\nimport type { GatewayClient } from './gateway-client.js'\nimport type { ConversationClient } from './conversation-client.js'\nimport type { MemoryClient } from './memory-client.js'\nimport type { AttachmentClient } from './attachment-client.js'\nimport type {\n AgentRegistrationData,\n MessageHandler,\n SenderFilterOptions,\n StreamerOptions,\n KafkaMessage,\n} from './types.js'\n\n/**\n * Filter for matching message senders.\n */\nexport class SenderFilter {\n private readonly _include: Set<string> = new Set()\n private readonly _exclude: Set<string> = new Set()\n readonly matchAll: boolean\n\n constructor(senders?: string[]) {\n if (!senders || senders.length === 0) {\n this.matchAll = true\n } else {\n this.matchAll = false\n for (const sender of senders) {\n if (sender.startsWith('~')) {\n this._exclude.add(sender.slice(1))\n } else {\n this._include.add(sender)\n }\n }\n }\n }\n\n /**\n * Get included senders as an array (for compatibility with Python tests).\n */\n get include(): string[] {\n return Array.from(this._include)\n }\n\n /**\n * Get excluded senders as an array (for compatibility with Python tests).\n */\n get exclude(): string[] {\n return Array.from(this._exclude)\n }\n\n /**\n * Check if sender matches this filter.\n */\n matches(sender: string): boolean {\n // If excluded, reject\n if (this._exclude.has(sender)) {\n return false\n }\n // If match all or explicitly included\n if (this.matchAll || this._include.size === 0) {\n return true\n }\n return this._include.has(sender)\n }\n}\n\n// Message handlers stored as tuples: [SenderFilter, MessageHandler]\ntype RegisteredHandler = [SenderFilter, MessageHandler]\n\n/**\n * Core agent class that handles messaging via the Agent Gateway.\n */\nexport class Agent {\n readonly name: string\n readonly agentData: AgentRegistrationData\n sendErrorResponses: boolean = true\n errorMessageTemplate: string\n\n private readonly gatewayClient: GatewayClient\n private readonly conversationClient?: ConversationClient\n private readonly memoryClient?: MemoryClient\n private readonly attachmentClient?: AttachmentClient\n private readonly heartbeatInterval: number\n\n private messageHandlers: RegisteredHandler[] = []\n private heartbeatManager?: HeartbeatManager\n private initialized: boolean = false\n private running: boolean = false\n\n constructor(options: {\n name: string\n gatewayClient: GatewayClient\n agentData: AgentRegistrationData\n heartbeatInterval?: number\n conversationClient?: ConversationClient\n memoryClient?: MemoryClient\n attachmentClient?: AttachmentClient\n errorMessageTemplate?: string\n }) {\n this.name = options.name\n this.gatewayClient = options.gatewayClient\n this.agentData = options.agentData\n this.heartbeatInterval = options.heartbeatInterval ?? 60\n this.conversationClient = options.conversationClient\n this.memoryClient = options.memoryClient\n this.attachmentClient = options.attachmentClient\n this.errorMessageTemplate = options.errorMessageTemplate ??\n 'I encountered an error while processing your message. Please try again or contact support if the issue persists.'\n }\n\n /**\n * Register a message handler.\n * \n * Usage:\n * agent.onMessage(async (message, sender) => { ... })\n * agent.onMessage(handler, { senders: ['user'] })\n */\n onMessage(handler: MessageHandler): void\n onMessage(handler: MessageHandler, options: SenderFilterOptions): void\n onMessage(\n handler: MessageHandler,\n options?: SenderFilterOptions\n ): void {\n const filter = new SenderFilter(options?.senders)\n this.messageHandlers.push([filter, handler])\n }\n\n /**\n * Initialize agent after gateway connection is established.\n */\n initializeWithGateway(): void {\n if (this.initialized) {\n return\n }\n\n // Register message handler with gateway\n const topic = `${this.name}.inbox`\n this.gatewayClient.registerHandler(topic, (msg) => {\n this.handleKafkaMessage(msg)\n })\n\n // Start heartbeat\n this.heartbeatManager = new HeartbeatManager(\n this.gatewayClient,\n this.name,\n this.heartbeatInterval\n )\n this.heartbeatManager.start()\n\n this.initialized = true\n }\n\n /**\n * Get sender from message headers.\n */\n private getSender(headers: Record<string, string>): string {\n return headers.from_ ?? headers.from ?? 'user'\n }\n\n /**\n * Find first handler that matches the sender.\n */\n private findMatchingHandler(sender: string): MessageHandler | undefined {\n for (const [filter, handler] of this.messageHandlers) {\n if (filter.matches(sender)) {\n return handler\n }\n }\n return undefined\n }\n\n /**\n * Handle incoming Kafka message.\n */\n private handleKafkaMessage(kafkaMsg: KafkaMessage): void {\n // Run handler asynchronously\n this.handleMessageAsync(kafkaMsg).catch((error) => {\n console.error('Error in message handler:', error)\n })\n }\n\n /**\n * Async message handling with error recovery.\n */\n private async handleMessageAsync(kafkaMsg: KafkaMessage): Promise<void> {\n let message: Message | undefined\n\n try {\n // Create message from Kafka data\n message = Message.fromKafkaMessage(\n kafkaMsg.body,\n kafkaMsg.headers,\n {\n conversationClient: this.conversationClient,\n memoryClient: this.memoryClient,\n attachmentClient: this.attachmentClient,\n agentName: this.name,\n }\n )\n\n // Find matching handler\n const sender = this.getSender(kafkaMsg.headers)\n const handler = this.findMatchingHandler(sender)\n\n if (!handler) {\n console.warn(`No handler matched for sender: ${sender}`)\n return\n }\n\n // Call handler\n await handler(message, sender)\n\n } catch (error) {\n console.error('Error handling message:', error)\n\n // Send error response if we have a message\n if (message && this.sendErrorResponses) {\n await this.sendErrorResponse(message, error as Error)\n }\n }\n }\n\n /**\n * Send error response to user when handler fails.\n */\n private async sendErrorResponse(message: Message, _error: Error): Promise<void> {\n try {\n const streamer = this.streamer(message, { sendTo: 'user' })\n streamer.stream(this.errorMessageTemplate)\n await streamer.finish()\n } catch (err) {\n console.error('Failed to send error response:', err)\n }\n }\n\n /**\n * Create a new Streamer for streaming responses.\n */\n streamer(message: Message, options: StreamerOptions = {}): Streamer {\n return new Streamer({\n agentName: this.name,\n originalMessage: message,\n gatewayClient: this.gatewayClient,\n conversationClient: this.conversationClient,\n awaiting: options.awaiting ?? false,\n sendTo: options.sendTo ?? 'user',\n })\n }\n\n /**\n * Mark agent as ready to consume messages.\n */\n startConsuming(): void {\n if (this.messageHandlers.length === 0) {\n throw new ConfigurationError('No message handlers registered')\n }\n\n if (!this.initialized) {\n throw new ConfigurationError('Agent not initialized with gateway')\n }\n\n this.running = true\n console.log(`Agent ${this.name} is now consuming messages`)\n }\n\n /**\n * Shutdown agent gracefully.\n */\n shutdown(): void {\n this.running = false\n\n if (this.heartbeatManager) {\n this.heartbeatManager.stop()\n }\n\n console.log(`Agent ${this.name} shutdown`)\n }\n\n /**\n * Check if agent is running.\n */\n isRunning(): boolean {\n return this.running\n }\n}\n","/**\n * March Agent SDK - Gateway Client\n * Port of Python march_agent/gateway_client.py\n * \n * gRPC client for communicating with the Agent Gateway.\n */\n\nimport * as grpc from '@grpc/grpc-js'\nimport * as protoLoader from '@grpc/proto-loader'\nimport { fileURLToPath } from 'url'\nimport { dirname, join } from 'path'\nimport { GatewayError } from './exceptions.js'\nimport type { KafkaMessage, ProduceAck } from './types.js'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\n// Load proto file\nconst PROTO_PATH = join(__dirname, 'proto', 'gateway.proto')\n\nconst packageDefinition = protoLoader.loadSync(PROTO_PATH, {\n keepCase: true,\n longs: String,\n enums: String,\n defaults: true,\n oneofs: true,\n})\n\nconst gatewayProto = grpc.loadPackageDefinition(packageDefinition) as unknown as {\n gateway: {\n AgentGateway: new (\n address: string,\n credentials: grpc.ChannelCredentials\n ) => AgentGatewayClient\n }\n}\n\ninterface AgentGatewayClient {\n AgentStream(): grpc.ClientDuplexStream<ClientMessage, ServerMessage>\n}\n\ninterface ClientMessage {\n auth?: { api_key: string; agent_names: string[] }\n subscribe?: { agent_name: string }\n unsubscribe?: { agent_name: string }\n produce?: {\n topic: string\n key: string\n headers: Record<string, string>\n body: Buffer\n correlation_id: string\n }\n ping?: { timestamp: string }\n}\n\ninterface ServerMessage {\n auth_response?: { connection_id: string; subscribed_topics: string[] }\n message?: {\n topic: string\n partition: number\n offset: string\n key: string\n headers: Record<string, string>\n body: Buffer\n timestamp: string\n }\n produce_ack?: {\n topic: string\n partition: number\n offset: string\n correlation_id: string\n }\n subscribe_ack?: { topic: string }\n unsubscribe_ack?: { agent_name: string }\n pong?: { client_timestamp: string; server_timestamp: string }\n error?: { code: string; message: string; correlation_id: string }\n}\n\n/**\n * Client for communicating with the Agent Gateway.\n * Provides gRPC bidirectional streaming for Kafka consume/produce.\n */\nexport class GatewayClient {\n private readonly gatewayUrl: string\n private readonly apiKey: string\n private readonly secure: boolean\n\n private client?: AgentGatewayClient\n private stream?: grpc.ClientDuplexStream<ClientMessage, ServerMessage>\n private _connectionId?: string\n private messageQueue: KafkaMessage[] = []\n private pendingProduceAcks: Map<string, (ack: ProduceAck) => void> = new Map()\n private pendingSubscribeAcks: Map<string, (topic: string) => void> = new Map()\n private messageHandlers: Map<string, (msg: KafkaMessage) => void> = new Map()\n private correlationCounter: number = 0\n private connected: boolean = false\n\n constructor(gatewayUrl: string, apiKey: string, secure: boolean = false) {\n this.gatewayUrl = gatewayUrl\n this.apiKey = apiKey\n this.secure = secure\n }\n\n /**\n * HTTP URL for AI Inventory service via proxy.\n */\n get aiInventoryUrl(): string {\n const protocol = this.secure ? 'https' : 'http'\n return `${protocol}://${this.gatewayUrl}/s/ai-inventory`\n }\n\n /**\n * HTTP URL for Conversation Store service via proxy.\n */\n get conversationStoreUrl(): string {\n const protocol = this.secure ? 'https' : 'http'\n return `${protocol}://${this.gatewayUrl}/s/conversation-store`\n }\n\n /**\n * HTTP URL for AI Memory service via proxy.\n */\n get aiMemoryUrl(): string {\n const protocol = this.secure ? 'https' : 'http'\n return `${protocol}://${this.gatewayUrl}/s/ai-memory`\n }\n\n /**\n * HTTP URL for Attachment service via proxy.\n */\n get attachmentUrl(): string {\n const protocol = this.secure ? 'https' : 'http'\n return `${protocol}://${this.gatewayUrl}/s/attachment`\n }\n\n /**\n * Register a handler for a topic.\n */\n registerHandler(topic: string, handler: (msg: KafkaMessage) => void): void {\n this.messageHandlers.set(topic, handler)\n }\n\n /**\n * Connect to the gateway and authenticate.\n */\n async connect(agentNames: string[]): Promise<string[]> {\n const credentials = this.secure\n ? grpc.credentials.createSsl()\n : grpc.credentials.createInsecure()\n\n this.client = new gatewayProto.gateway.AgentGateway(\n this.gatewayUrl,\n credentials\n )\n\n this.stream = this.client.AgentStream()\n\n // Set up message handling\n this.stream.on('data', (msg: ServerMessage) => {\n this.handleServerMessage(msg)\n })\n\n this.stream.on('error', (err: Error) => {\n console.error('Gateway stream error:', err)\n this.connected = false\n })\n\n this.stream.on('end', () => {\n console.log('Gateway stream ended')\n this.connected = false\n })\n\n // Send auth request\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new GatewayError('Authentication timeout'))\n }, 10000)\n\n const authHandler = (msg: ServerMessage) => {\n if (msg.auth_response) {\n clearTimeout(timeout)\n this._connectionId = msg.auth_response.connection_id\n this.connected = true\n resolve(msg.auth_response.subscribed_topics)\n } else if (msg.error) {\n clearTimeout(timeout)\n reject(new GatewayError(`Authentication failed: ${msg.error.message}`))\n }\n }\n\n // Temporarily override handler for auth response\n const originalHandler = this.handleServerMessage.bind(this)\n this.handleServerMessage = (msg: ServerMessage) => {\n if (msg.auth_response || msg.error) {\n authHandler(msg)\n this.handleServerMessage = originalHandler\n } else {\n originalHandler(msg)\n }\n }\n\n this.stream!.write({\n auth: {\n api_key: this.apiKey,\n agent_names: agentNames,\n },\n })\n })\n }\n\n /**\n * Handle incoming server messages.\n */\n private handleServerMessage(msg: ServerMessage): void {\n if (msg.message) {\n const kafkaMsg: KafkaMessage = {\n topic: msg.message.topic,\n partition: msg.message.partition,\n offset: parseInt(msg.message.offset, 10),\n key: msg.message.key,\n headers: msg.message.headers,\n body: JSON.parse(msg.message.body.toString()),\n timestamp: parseInt(msg.message.timestamp, 10),\n }\n\n // Check for registered handler\n const handler = this.messageHandlers.get(kafkaMsg.topic)\n if (handler) {\n handler(kafkaMsg)\n } else {\n // Queue message if no handler\n this.messageQueue.push(kafkaMsg)\n }\n } else if (msg.produce_ack) {\n const callback = this.pendingProduceAcks.get(msg.produce_ack.correlation_id)\n if (callback) {\n callback({\n topic: msg.produce_ack.topic,\n partition: msg.produce_ack.partition,\n offset: parseInt(msg.produce_ack.offset, 10),\n correlationId: msg.produce_ack.correlation_id,\n })\n this.pendingProduceAcks.delete(msg.produce_ack.correlation_id)\n }\n } else if (msg.subscribe_ack) {\n const callback = this.pendingSubscribeAcks.get(msg.subscribe_ack.topic)\n if (callback) {\n callback(msg.subscribe_ack.topic)\n this.pendingSubscribeAcks.delete(msg.subscribe_ack.topic)\n }\n } else if (msg.error) {\n console.error('Gateway error:', msg.error.message)\n }\n }\n\n /**\n * Subscribe to an additional agent's topic.\n */\n async subscribe(agentName: string): Promise<string> {\n if (!this.stream || !this.connected) {\n throw new GatewayError('Not connected')\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new GatewayError('Subscribe timeout'))\n }, 5000)\n\n const expectedTopic = `${agentName}.inbox`\n this.pendingSubscribeAcks.set(expectedTopic, (topic) => {\n clearTimeout(timeout)\n resolve(topic)\n })\n\n this.stream!.write({\n subscribe: { agent_name: agentName },\n })\n })\n }\n\n /**\n * Unsubscribe from an agent's topic.\n */\n unsubscribe(agentName: string): void {\n if (!this.stream || !this.connected) {\n throw new GatewayError('Not connected')\n }\n\n this.stream.write({\n unsubscribe: { agent_name: agentName },\n })\n }\n\n /**\n * Produce a message to Kafka via the gateway.\n */\n produce(\n topic: string,\n key: string,\n headers: Record<string, string>,\n body: Record<string, unknown>,\n correlationId?: string\n ): void {\n if (!this.stream || !this.connected) {\n throw new GatewayError('Not connected')\n }\n\n const corrId = correlationId ?? `${++this.correlationCounter}`\n\n this.stream.write({\n produce: {\n topic,\n key,\n headers,\n body: Buffer.from(JSON.stringify(body)),\n correlation_id: corrId,\n },\n })\n }\n\n /**\n * Produce a message and wait for acknowledgment.\n */\n async produceAndWait(\n topic: string,\n key: string,\n headers: Record<string, string>,\n body: Record<string, unknown>\n ): Promise<ProduceAck> {\n if (!this.stream || !this.connected) {\n throw new GatewayError('Not connected')\n }\n\n const correlationId = `${++this.correlationCounter}`\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingProduceAcks.delete(correlationId)\n reject(new GatewayError('Produce timeout'))\n }, 10000)\n\n this.pendingProduceAcks.set(correlationId, (ack) => {\n clearTimeout(timeout)\n resolve(ack)\n })\n\n this.stream!.write({\n produce: {\n topic,\n key,\n headers,\n body: Buffer.from(JSON.stringify(body)),\n correlation_id: correlationId,\n },\n })\n })\n }\n\n /**\n * Consume a single message (polling from queue).\n */\n consumeOne(_timeout: number = 1000): KafkaMessage | null {\n if (this.messageQueue.length > 0) {\n return this.messageQueue.shift()!\n }\n return null\n }\n\n /**\n * Send a ping to the gateway.\n */\n ping(): void {\n if (!this.stream || !this.connected) {\n throw new GatewayError('Not connected')\n }\n\n this.stream.write({\n ping: { timestamp: String(Date.now()) },\n })\n }\n\n /**\n * Make a sync POST request (used for registration).\n */\n async httpPost(\n service: string,\n path: string,\n body: unknown\n ): Promise<Response> {\n const protocol = this.secure ? 'https' : 'http'\n const url = `${protocol}://${this.gatewayUrl}/s/${service}${path}`\n\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.apiKey,\n },\n body: JSON.stringify(body),\n })\n }\n\n /**\n * Check if connected.\n */\n isConnected(): boolean {\n return this.connected\n }\n\n /**\n * Close the gateway connection.\n */\n close(): void {\n if (this.stream) {\n this.stream.end()\n this.stream = undefined\n }\n this.connected = false\n }\n}\n","/**\n * March Agent SDK - Conversation Client\n * Port of Python march_agent/conversation_client.py\n */\n\nimport { APIException } from './exceptions.js'\nimport type { ConversationData, GetMessagesOptions, ConversationMessageData } from './types.js'\n\n/**\n * HTTP client for interacting with conversation-store API.\n */\nexport class ConversationClient {\n private readonly baseUrl: string\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '')\n }\n\n /**\n * Get conversation metadata.\n */\n async getConversation(conversationId: string): Promise<ConversationData> {\n const url = `${this.baseUrl}/conversations/${conversationId}`\n\n try {\n const response = await fetch(url)\n\n if (response.status === 404) {\n throw new APIException(`Conversation ${conversationId} not found`, 404)\n }\n\n if (!response.ok) {\n throw new APIException(`Failed to fetch conversation: ${response.status}`, response.status)\n }\n\n return await response.json() as ConversationData\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to fetch conversation: ${error}`)\n }\n }\n\n /**\n * Get messages from a conversation.\n */\n async getMessages(\n conversationId: string,\n options: GetMessagesOptions = {}\n ): Promise<ConversationMessageData[]> {\n const url = new URL(`${this.baseUrl}/conversations/${conversationId}/messages`)\n\n const params: Record<string, string> = {\n limit: String(Math.min(options.limit ?? 100, 1000)),\n offset: String(options.offset ?? 0),\n }\n\n if (options.role) params.role = options.role\n if (options.from) params.from = options.from\n if (options.to) params.to = options.to\n\n Object.entries(params).forEach(([key, value]) => {\n url.searchParams.set(key, value)\n })\n\n try {\n const response = await fetch(url.toString())\n\n if (response.status === 404) {\n throw new APIException(`Conversation ${conversationId} not found`, 404)\n }\n\n if (!response.ok) {\n throw new APIException(`Failed to fetch messages: ${response.status}`, response.status)\n }\n\n return await response.json() as ConversationMessageData[]\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to fetch messages: ${error}`)\n }\n }\n\n /**\n * Update conversation fields (PATCH).\n */\n async updateConversation(\n conversationId: string,\n data: Partial<ConversationData>\n ): Promise<ConversationData> {\n const url = `${this.baseUrl}/conversations/${conversationId}`\n\n try {\n const response = await fetch(url, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data),\n })\n\n if (!response.ok) {\n throw new APIException(`Failed to update conversation: ${response.status}`, response.status)\n }\n\n return await response.json() as ConversationData\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to update conversation: ${error}`)\n }\n }\n}\n","/**\n * March Agent SDK - Memory Client\n * Port of Python march_agent/memory_client.py\n */\n\nimport { APIException } from './exceptions.js'\nimport type { MemoryMessage, MemorySearchResult, UserSummary } from './types.js'\n\n/**\n * Async HTTP client for AI memory API.\n * Provides long-term memory storage and semantic search.\n */\nexport class MemoryClient {\n private readonly baseUrl: string\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '')\n }\n\n /**\n * Add messages to memory for a user/conversation.\n */\n async addMessages(\n userId: string,\n conversationId: string,\n messages: MemoryMessage[]\n ): Promise<{ added: number }> {\n const url = `${this.baseUrl}/memory/${userId}/messages`\n const payload = {\n conversation_id: conversationId,\n messages,\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to add messages to memory: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as { added: number }\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to add messages to memory: ${error}`)\n }\n }\n\n /**\n * Search memory for relevant content.\n */\n async search(\n userId: string,\n query: string,\n limit: number = 10\n ): Promise<MemorySearchResult[]> {\n const url = new URL(`${this.baseUrl}/memory/${userId}/search`)\n url.searchParams.set('query', query)\n url.searchParams.set('limit', String(limit))\n\n try {\n const response = await fetch(url.toString())\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to search memory: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as MemorySearchResult[]\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to search memory: ${error}`)\n }\n }\n\n /**\n * Get user summary.\n */\n async getUserSummary(userId: string): Promise<UserSummary | null> {\n const url = `${this.baseUrl}/memory/${userId}/summary`\n\n try {\n const response = await fetch(url)\n\n if (response.status === 404) {\n return null\n }\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to get user summary: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as UserSummary\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to get user summary: ${error}`)\n }\n }\n\n /**\n * Clear user's memory.\n */\n async clearMemory(userId: string): Promise<{ deleted: number }> {\n const url = `${this.baseUrl}/memory/${userId}`\n\n try {\n const response = await fetch(url, { method: 'DELETE' })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to clear memory: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as { deleted: number }\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to clear memory: ${error}`)\n }\n }\n}\n","/**\n * March Agent SDK - Main Application\n * Port of Python march_agent/app.py\n */\n\nimport { Agent } from './agent.js'\nimport { GatewayClient } from './gateway-client.js'\nimport { ConversationClient } from './conversation-client.js'\nimport { MemoryClient } from './memory-client.js'\nimport { AttachmentClient } from './attachment-client.js'\nimport { RegistrationError, ConfigurationError } from './exceptions.js'\nimport { AI_INVENTORY_PATHS, SERVICES } from './api-paths.js'\nimport type { AppOptions, RegisterOptions, AgentRegistrationData } from './types.js'\n\n/**\n * Main application class for March AI Agent framework.\n * \n * @example\n * ```typescript\n * import { MarchAgentApp } from 'march-ai-sdk'\n * \n * const app = new MarchAgentApp({\n * gatewayUrl: 'agent-gateway:8080',\n * apiKey: 'your-api-key',\n * })\n * \n * const agent = app.registerMe({\n * name: 'my-agent',\n * about: 'A helpful assistant',\n * document: 'Detailed description...',\n * })\n * \n * agent.onMessage(async (message, sender) => {\n * const streamer = agent.streamer(message)\n * streamer.stream('Hello!')\n * await streamer.finish()\n * })\n * \n * app.run()\n * ```\n */\nexport class MarchAgentApp {\n readonly gatewayClient: GatewayClient\n readonly conversationClient: ConversationClient\n readonly memoryClient: MemoryClient\n readonly attachmentClient: AttachmentClient\n\n private readonly heartbeatInterval: number\n private readonly _maxConcurrentTasks: number\n private readonly errorMessageTemplate: string\n\n private agents: Agent[] = []\n private running: boolean = false\n private shutdownRequested: boolean = false\n\n constructor(options: AppOptions) {\n this.heartbeatInterval = options.heartbeatInterval ?? 60\n this._maxConcurrentTasks = options.maxConcurrentTasks ?? 100\n this.errorMessageTemplate = options.errorMessageTemplate ??\n 'I encountered an error while processing your message. Please try again or contact support if the issue persists.'\n\n // Create gateway client\n this.gatewayClient = new GatewayClient(\n options.gatewayUrl,\n options.apiKey,\n options.secure ?? false\n )\n\n // Create HTTP clients using gateway proxy URLs\n this.conversationClient = new ConversationClient(\n this.gatewayClient.conversationStoreUrl\n )\n\n this.memoryClient = new MemoryClient(\n this.gatewayClient.aiMemoryUrl\n )\n\n this.attachmentClient = new AttachmentClient(\n this.gatewayClient.attachmentUrl\n )\n }\n\n /**\n * Register an agent with the backend.\n */\n async registerMe(options: RegisterOptions): Promise<Agent> {\n // Register with AI Inventory\n const agentData = await this.registerWithInventory(options)\n\n // Create agent instance\n const agent = new Agent({\n name: options.name,\n gatewayClient: this.gatewayClient,\n agentData,\n heartbeatInterval: this.heartbeatInterval,\n conversationClient: this.conversationClient,\n memoryClient: this.memoryClient,\n attachmentClient: this.attachmentClient,\n errorMessageTemplate: this.errorMessageTemplate,\n })\n\n this.agents.push(agent)\n console.log(`Registered agent: ${options.name}`)\n\n return agent\n }\n\n /**\n * Register agent with AI Inventory service.\n */\n private async registerWithInventory(options: RegisterOptions): Promise<AgentRegistrationData> {\n // Build registration payload (API expects camelCase)\n const payload: Record<string, unknown> = {\n name: options.name,\n about: options.about,\n document: options.document,\n representationName: options.representationName || options.name,\n }\n\n if (options.baseUrl) {\n payload.baseUrl = options.baseUrl\n }\n\n if (options.metadata) {\n payload.metadata = options.metadata\n }\n\n if (options.relatedPages) {\n payload.relatedPages = options.relatedPages\n }\n\n // Register via gateway HTTP proxy\n try {\n const response = await this.gatewayClient.httpPost(\n SERVICES.AI_INVENTORY,\n AI_INVENTORY_PATHS.AGENT_REGISTER,\n payload\n )\n\n if (!response.ok) {\n const errorText = await response.text()\n console.error('Registration failed:', response.status, errorText)\n throw new RegistrationError(\n `Failed to register agent ${options.name}: ${response.status}`\n )\n }\n\n const data = await response.json() as Record<string, unknown>\n\n return {\n id: data.id as string,\n name: data.name as string,\n about: data.about as string,\n document: data.document as string,\n representationName: data.representationName as string | undefined,\n baseUrl: data.baseUrl as string | undefined,\n metadata: data.metadata as Record<string, unknown> | undefined,\n relatedPages: data.relatedPages as { name: string; endpoint: string }[] | undefined,\n }\n } catch (error) {\n if (error instanceof RegistrationError) throw error\n throw new RegistrationError(`Failed to register agent ${options.name}: ${error}`)\n }\n }\n\n /**\n * Start all registered agents and block until shutdown.\n */\n async run(): Promise<void> {\n if (this.agents.length === 0) {\n throw new ConfigurationError('No agents registered')\n }\n\n // Connect to gateway\n const agentNames = this.agents.map((a) => a.name)\n console.log(`Connecting to gateway with agents: ${agentNames.join(', ')}`)\n\n try {\n const topics = await this.gatewayClient.connect(agentNames)\n console.log(`Connected. Subscribed to topics: ${topics.join(', ')}`)\n } catch (error) {\n throw new ConfigurationError(`Failed to connect to gateway: ${error}`)\n }\n\n // Initialize all agents\n for (const agent of this.agents) {\n agent.initializeWithGateway()\n agent.startConsuming()\n }\n\n this.running = true\n console.log('Agent app is running. Press Ctrl+C to stop.')\n\n // Set up shutdown handlers\n process.on('SIGINT', () => this.shutdown())\n process.on('SIGTERM', () => this.shutdown())\n\n // Keep the process alive\n await this.consumeLoop()\n }\n\n /**\n * Main consume loop.\n */\n private async consumeLoop(): Promise<void> {\n while (this.running && !this.shutdownRequested) {\n // The gateway client handles message dispatch via callbacks\n // We just need to keep the event loop alive\n await new Promise((resolve) => setTimeout(resolve, 100))\n }\n }\n\n /**\n * Shutdown all agents gracefully.\n */\n shutdown(): void {\n if (this.shutdownRequested) {\n return\n }\n\n console.log('\\nShutting down...')\n this.shutdownRequested = true\n this.running = false\n\n // Shutdown all agents\n for (const agent of this.agents) {\n agent.shutdown()\n }\n\n // Close gateway connection\n this.gatewayClient.close()\n\n console.log('Shutdown complete')\n }\n}\n","/**\n * March Agent SDK - Checkpoint Client\n * Port of Python march_agent/checkpoint_client.py\n */\n\nimport { APIException } from './exceptions.js'\n\nexport interface CheckpointConfig {\n configurable: {\n thread_id: string\n checkpoint_ns?: string\n checkpoint_id?: string\n }\n}\n\nexport interface CheckpointData {\n v: number\n id: string\n ts: string\n channel_values: Record<string, unknown>\n channel_versions: Record<string, string>\n versions_seen: Record<string, Record<string, string>>\n pending_sends?: unknown[]\n}\n\nexport interface CheckpointMetadata {\n source: string\n step: number\n writes?: unknown\n parents?: Record<string, string>\n}\n\nexport interface CheckpointTuple {\n config: CheckpointConfig\n checkpoint: CheckpointData\n metadata: CheckpointMetadata\n parent_config?: CheckpointConfig\n pending_writes?: unknown[]\n}\n\nexport interface CheckpointListOptions {\n threadId?: string\n checkpointNs?: string\n before?: string\n limit?: number\n}\n\n/**\n * Async HTTP client for checkpoint-store API.\n * Used by LangGraph integration for persisting graph state.\n */\nexport class CheckpointClient {\n private readonly baseUrl: string\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '')\n }\n\n /**\n * Store a checkpoint.\n */\n async put(\n config: CheckpointConfig,\n checkpoint: CheckpointData,\n metadata: CheckpointMetadata,\n newVersions: Record<string, unknown> = {}\n ): Promise<{ config: CheckpointConfig }> {\n const url = `${this.baseUrl}/checkpoints/`\n const payload = {\n config,\n checkpoint,\n metadata,\n new_versions: newVersions,\n }\n\n try {\n const response = await fetch(url, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to store checkpoint: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as { config: CheckpointConfig }\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to store checkpoint: ${error}`)\n }\n }\n\n /**\n * Get a checkpoint tuple.\n */\n async getTuple(\n threadId: string,\n checkpointNs: string = '',\n checkpointId?: string\n ): Promise<CheckpointTuple | null> {\n const url = new URL(`${this.baseUrl}/checkpoints/${threadId}`)\n url.searchParams.set('checkpoint_ns', checkpointNs)\n if (checkpointId) {\n url.searchParams.set('checkpoint_id', checkpointId)\n }\n\n try {\n const response = await fetch(url.toString())\n\n if (response.status === 404) {\n return null\n }\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to get checkpoint: ${response.status} - ${errorText}`, response.status)\n }\n\n const result = await response.json() as CheckpointTuple | null\n return result || null\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to get checkpoint: ${error}`)\n }\n }\n\n /**\n * List checkpoints.\n */\n async list(options: CheckpointListOptions = {}): Promise<CheckpointTuple[]> {\n const url = new URL(`${this.baseUrl}/checkpoints/`)\n\n if (options.threadId) url.searchParams.set('thread_id', options.threadId)\n if (options.checkpointNs !== undefined) url.searchParams.set('checkpoint_ns', options.checkpointNs)\n if (options.before) url.searchParams.set('before', options.before)\n if (options.limit) url.searchParams.set('limit', String(options.limit))\n\n try {\n const response = await fetch(url.toString())\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to list checkpoints: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as CheckpointTuple[]\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to list checkpoints: ${error}`)\n }\n }\n\n /**\n * Delete all checkpoints for a thread.\n */\n async deleteThread(threadId: string): Promise<{ thread_id: string; deleted: number }> {\n const url = `${this.baseUrl}/checkpoints/${threadId}`\n\n try {\n const response = await fetch(url, { method: 'DELETE' })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to delete checkpoints: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as { thread_id: string; deleted: number }\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to delete checkpoints: ${error}`)\n }\n }\n}\n","/**\n * March Agent SDK - Agent State Client\n * Port of Python march_agent/agent_state_client.py\n */\n\nimport { APIException } from './exceptions.js'\n\nexport interface AgentStateResponse {\n conversationId: string\n namespace: string\n state: Record<string, unknown>\n createdAt?: string\n updatedAt?: string\n}\n\n/**\n * Async HTTP client for agent-state API.\n * Used for storing framework-specific state (e.g., Pydantic AI messages).\n */\nexport class AgentStateClient {\n private readonly baseUrl: string\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '')\n }\n\n /**\n * Store or update agent state.\n */\n async put(\n conversationId: string,\n namespace: string,\n state: Record<string, unknown>\n ): Promise<{ conversationId: string; namespace: string; created: boolean }> {\n const url = `${this.baseUrl}/agent-state/${conversationId}`\n const payload = {\n namespace,\n state,\n }\n\n try {\n const response = await fetch(url, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to store agent state: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as { conversationId: string; namespace: string; created: boolean }\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to store agent state: ${error}`)\n }\n }\n\n /**\n * Get agent state.\n */\n async get(\n conversationId: string,\n namespace: string\n ): Promise<AgentStateResponse | null> {\n const url = new URL(`${this.baseUrl}/agent-state/${conversationId}`)\n url.searchParams.set('namespace', namespace)\n\n try {\n const response = await fetch(url.toString())\n\n if (response.status === 404) {\n return null\n }\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to get agent state: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as AgentStateResponse\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to get agent state: ${error}`)\n }\n }\n\n /**\n * Delete agent state.\n */\n async delete(\n conversationId: string,\n namespace?: string\n ): Promise<{ conversationId: string; namespace?: string; deleted: number }> {\n const url = new URL(`${this.baseUrl}/agent-state/${conversationId}`)\n if (namespace) {\n url.searchParams.set('namespace', namespace)\n }\n\n try {\n const response = await fetch(url.toString(), { method: 'DELETE' })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to delete agent state: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as { conversationId: string; namespace?: string; deleted: number }\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to delete agent state: ${error}`)\n }\n }\n}\n","/**\n * March Agent SDK - TypeScript framework for building AI agents\n * \n * @packageDocumentation\n */\n\n// Main classes\nexport { MarchAgentApp } from './app.js'\nexport { Agent, SenderFilter } from './agent.js'\nexport { Message } from './message.js'\nexport { Streamer } from './streamer.js'\nexport { Conversation } from './conversation.js'\nexport { Memory } from './memory.js'\n\n// Message types\nexport { ConversationMessage } from './conversation-message.js'\nexport { type Artifact, type ArtifactType, type ArtifactInput, toArtifact } from './artifact.js'\n\n// Clients\nexport { GatewayClient } from './gateway-client.js'\nexport { ConversationClient } from './conversation-client.js'\nexport { CheckpointClient, type CheckpointConfig, type CheckpointData, type CheckpointMetadata, type CheckpointTuple } from './checkpoint-client.js'\nexport { AgentStateClient, type AgentStateResponse } from './agent-state-client.js'\nexport { MemoryClient } from './memory-client.js'\nexport { AttachmentClient, createAttachmentInfo, type AttachmentInfo } from './attachment-client.js'\n\n// Helpers\nexport { HeartbeatManager } from './heartbeat.js'\n\n// API Paths Configuration\nexport {\n AI_INVENTORY_PATHS,\n CONVERSATION_STORE_PATHS,\n MEMORY_PATHS,\n SERVICES,\n type ServiceName,\n} from './api-paths.js'\n\n// Types\nexport type {\n KafkaMessage,\n KafkaHeaders,\n AgentRegistrationData,\n RegisterOptions,\n MessageHandler,\n SenderFilterOptions,\n StreamOptions,\n StreamerOptions,\n AppOptions,\n ConversationData,\n GetMessagesOptions,\n MemoryMessage,\n MemorySearchResult,\n UserSummary,\n ProduceAck,\n} from './types.js'\n\n// Exceptions\nexport {\n MarchAgentError,\n RegistrationError,\n KafkaError,\n ConfigurationError,\n APIException,\n HeartbeatError,\n GatewayError,\n} from './exceptions.js'\n\n// Version\nexport const VERSION = '0.3.0'\n"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
syntax = "proto3";
|
|
2
|
+
package gateway;
|
|
3
|
+
option go_package = "agent-gateway/internal/grpc/pb";
|
|
4
|
+
|
|
5
|
+
// Bidirectional streaming service for agent communication
|
|
6
|
+
service AgentGateway {
|
|
7
|
+
// Main bidirectional stream for all agent communication
|
|
8
|
+
rpc AgentStream(stream ClientMessage) returns (stream ServerMessage);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Client -> Server messages
|
|
12
|
+
message ClientMessage {
|
|
13
|
+
oneof payload {
|
|
14
|
+
AuthRequest auth = 1;
|
|
15
|
+
SubscribeRequest subscribe = 2;
|
|
16
|
+
UnsubscribeRequest unsubscribe = 3;
|
|
17
|
+
ProduceRequest produce = 4;
|
|
18
|
+
PingRequest ping = 5;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Server -> Client messages
|
|
23
|
+
message ServerMessage {
|
|
24
|
+
oneof payload {
|
|
25
|
+
AuthResponse auth_response = 1;
|
|
26
|
+
KafkaMessage message = 2;
|
|
27
|
+
ProduceAck produce_ack = 3;
|
|
28
|
+
SubscribeAck subscribe_ack = 4;
|
|
29
|
+
UnsubscribeAck unsubscribe_ack = 5;
|
|
30
|
+
PongResponse pong = 6;
|
|
31
|
+
ErrorResponse error = 7;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
message AuthRequest {
|
|
36
|
+
string api_key = 1;
|
|
37
|
+
repeated string agent_names = 2;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
message AuthResponse {
|
|
41
|
+
string connection_id = 1;
|
|
42
|
+
repeated string subscribed_topics = 2;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
message SubscribeRequest {
|
|
46
|
+
string agent_name = 1;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
message SubscribeAck {
|
|
50
|
+
string topic = 1;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
message UnsubscribeRequest {
|
|
54
|
+
string agent_name = 1;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
message UnsubscribeAck {
|
|
58
|
+
string agent_name = 1;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
message ProduceRequest {
|
|
62
|
+
string topic = 1;
|
|
63
|
+
string key = 2;
|
|
64
|
+
map<string, string> headers = 3;
|
|
65
|
+
bytes body = 4; // JSON as bytes
|
|
66
|
+
string correlation_id = 5;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
message ProduceAck {
|
|
70
|
+
string topic = 1;
|
|
71
|
+
int32 partition = 2;
|
|
72
|
+
int64 offset = 3;
|
|
73
|
+
string correlation_id = 4;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
message KafkaMessage {
|
|
77
|
+
string topic = 1;
|
|
78
|
+
int32 partition = 2;
|
|
79
|
+
int64 offset = 3;
|
|
80
|
+
string key = 4;
|
|
81
|
+
map<string, string> headers = 5;
|
|
82
|
+
bytes body = 6; // JSON as bytes
|
|
83
|
+
int64 timestamp = 7;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
message PingRequest {
|
|
87
|
+
int64 timestamp = 1;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
message PongResponse {
|
|
91
|
+
int64 client_timestamp = 1;
|
|
92
|
+
int64 server_timestamp = 2;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
message ErrorResponse {
|
|
96
|
+
string code = 1;
|
|
97
|
+
string message = 2;
|
|
98
|
+
string correlation_id = 3;
|
|
99
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "march-ai-sdk",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "TypeScript SDK for building AI agents in the March AI platform",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./extensions/langgraph": {
|
|
15
|
+
"import": "./dist/extensions/langgraph.js",
|
|
16
|
+
"types": "./dist/extensions/langgraph.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./extensions/vercel-ai": {
|
|
19
|
+
"import": "./dist/extensions/vercel-ai.js",
|
|
20
|
+
"types": "./dist/extensions/vercel-ai.d.ts"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"src"
|
|
26
|
+
],
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup",
|
|
32
|
+
"dev": "tsup --watch",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"lint": "eslint src",
|
|
37
|
+
"clean": "rm -rf dist",
|
|
38
|
+
"check-secrets": "tsx scripts/check-secrets.ts",
|
|
39
|
+
"prepublishOnly": "npm run check-secrets && npm run build && npm run test"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@grpc/grpc-js": "^1.12.0",
|
|
43
|
+
"@grpc/proto-loader": "^0.7.13",
|
|
44
|
+
"zod": "^3.24.1"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"@langchain/langgraph-checkpoint": ">=0.0.13",
|
|
48
|
+
"ai": ">=3.0.0"
|
|
49
|
+
},
|
|
50
|
+
"peerDependenciesMeta": {
|
|
51
|
+
"@langchain/langgraph-checkpoint": {
|
|
52
|
+
"optional": true
|
|
53
|
+
},
|
|
54
|
+
"ai": {
|
|
55
|
+
"optional": true
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/node": "^22.10.7",
|
|
60
|
+
"eslint": "^9.18.0",
|
|
61
|
+
"tsup": "^8.3.5",
|
|
62
|
+
"tsx": "^4.19.2",
|
|
63
|
+
"typescript": "^5.7.3",
|
|
64
|
+
"vitest": "^2.1.8"
|
|
65
|
+
},
|
|
66
|
+
"engines": {
|
|
67
|
+
"node": ">=18"
|
|
68
|
+
},
|
|
69
|
+
"keywords": [
|
|
70
|
+
"march",
|
|
71
|
+
"agent",
|
|
72
|
+
"ai",
|
|
73
|
+
"sdk",
|
|
74
|
+
"langchain",
|
|
75
|
+
"langgraph",
|
|
76
|
+
"vercel-ai",
|
|
77
|
+
"streaming",
|
|
78
|
+
"kafka",
|
|
79
|
+
"grpc"
|
|
80
|
+
],
|
|
81
|
+
"author": "March Health",
|
|
82
|
+
"license": "MIT"
|
|
83
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* March Agent SDK - Agent State Client
|
|
3
|
+
* Port of Python march_agent/agent_state_client.py
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { APIException } from './exceptions.js'
|
|
7
|
+
|
|
8
|
+
export interface AgentStateResponse {
|
|
9
|
+
conversationId: string
|
|
10
|
+
namespace: string
|
|
11
|
+
state: Record<string, unknown>
|
|
12
|
+
createdAt?: string
|
|
13
|
+
updatedAt?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Async HTTP client for agent-state API.
|
|
18
|
+
* Used for storing framework-specific state (e.g., Pydantic AI messages).
|
|
19
|
+
*/
|
|
20
|
+
export class AgentStateClient {
|
|
21
|
+
private readonly baseUrl: string
|
|
22
|
+
|
|
23
|
+
constructor(baseUrl: string) {
|
|
24
|
+
this.baseUrl = baseUrl.replace(/\/$/, '')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Store or update agent state.
|
|
29
|
+
*/
|
|
30
|
+
async put(
|
|
31
|
+
conversationId: string,
|
|
32
|
+
namespace: string,
|
|
33
|
+
state: Record<string, unknown>
|
|
34
|
+
): Promise<{ conversationId: string; namespace: string; created: boolean }> {
|
|
35
|
+
const url = `${this.baseUrl}/agent-state/${conversationId}`
|
|
36
|
+
const payload = {
|
|
37
|
+
namespace,
|
|
38
|
+
state,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
const response = await fetch(url, {
|
|
43
|
+
method: 'PUT',
|
|
44
|
+
headers: { 'Content-Type': 'application/json' },
|
|
45
|
+
body: JSON.stringify(payload),
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const errorText = await response.text()
|
|
50
|
+
throw new APIException(`Failed to store agent state: ${response.status} - ${errorText}`, response.status)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return await response.json() as { conversationId: string; namespace: string; created: boolean }
|
|
54
|
+
} catch (error) {
|
|
55
|
+
if (error instanceof APIException) throw error
|
|
56
|
+
throw new APIException(`Failed to store agent state: ${error}`)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Get agent state.
|
|
62
|
+
*/
|
|
63
|
+
async get(
|
|
64
|
+
conversationId: string,
|
|
65
|
+
namespace: string
|
|
66
|
+
): Promise<AgentStateResponse | null> {
|
|
67
|
+
const url = new URL(`${this.baseUrl}/agent-state/${conversationId}`)
|
|
68
|
+
url.searchParams.set('namespace', namespace)
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const response = await fetch(url.toString())
|
|
72
|
+
|
|
73
|
+
if (response.status === 404) {
|
|
74
|
+
return null
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
const errorText = await response.text()
|
|
79
|
+
throw new APIException(`Failed to get agent state: ${response.status} - ${errorText}`, response.status)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return await response.json() as AgentStateResponse
|
|
83
|
+
} catch (error) {
|
|
84
|
+
if (error instanceof APIException) throw error
|
|
85
|
+
throw new APIException(`Failed to get agent state: ${error}`)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Delete agent state.
|
|
91
|
+
*/
|
|
92
|
+
async delete(
|
|
93
|
+
conversationId: string,
|
|
94
|
+
namespace?: string
|
|
95
|
+
): Promise<{ conversationId: string; namespace?: string; deleted: number }> {
|
|
96
|
+
const url = new URL(`${this.baseUrl}/agent-state/${conversationId}`)
|
|
97
|
+
if (namespace) {
|
|
98
|
+
url.searchParams.set('namespace', namespace)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
const response = await fetch(url.toString(), { method: 'DELETE' })
|
|
103
|
+
|
|
104
|
+
if (!response.ok) {
|
|
105
|
+
const errorText = await response.text()
|
|
106
|
+
throw new APIException(`Failed to delete agent state: ${response.status} - ${errorText}`, response.status)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return await response.json() as { conversationId: string; namespace?: string; deleted: number }
|
|
110
|
+
} catch (error) {
|
|
111
|
+
if (error instanceof APIException) throw error
|
|
112
|
+
throw new APIException(`Failed to delete agent state: ${error}`)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|