@axiom-lattice/client-sdk 1.0.40 → 1.0.41
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/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -342,6 +342,7 @@ var Client = class {
|
|
|
342
342
|
async run(options) {
|
|
343
343
|
try {
|
|
344
344
|
const headers = {};
|
|
345
|
+
const { command, threadId, message, files, background, ...rest } = options;
|
|
345
346
|
if (this.tenantId) {
|
|
346
347
|
headers["x-tenant-id"] = this.tenantId;
|
|
347
348
|
}
|
|
@@ -355,12 +356,13 @@ var Client = class {
|
|
|
355
356
|
headers,
|
|
356
357
|
body: JSON.stringify({
|
|
357
358
|
assistant_id: this.assistantId,
|
|
358
|
-
thread_id:
|
|
359
|
-
message
|
|
360
|
-
files
|
|
361
|
-
command
|
|
359
|
+
thread_id: threadId,
|
|
360
|
+
message,
|
|
361
|
+
files,
|
|
362
|
+
command,
|
|
362
363
|
streaming: false,
|
|
363
|
-
background:
|
|
364
|
+
background: background || false,
|
|
365
|
+
...rest
|
|
364
366
|
})
|
|
365
367
|
});
|
|
366
368
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/client.ts","../src/wechat-client.ts","../src/ChunkMessageMerger.ts"],"sourcesContent":["/**\n * @packageDocumentation\n * Axiom Lattice Client SDK - A TypeScript client for the Axiom Lattice Agent Service API\n */\n\n// Re-export all public types and classes\nexport * from \"./types\";\nexport * from \"./client\";\nexport * from \"./wechat-client\";\nexport { createSimpleMessageMerger } from \"./ChunkMessageMerger\";\n","/**\n * Core types for the Axiom Lattice Client SDK\n */\n\nimport {\n Message,\n UserMessage,\n AssistantMessage,\n SystemMessage,\n ToolMessage,\n DeveloperMessage,\n MessageChunk,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Transport method for client-server communication\n * Note: Currently only \"ws\" is used for tool registration\n */\nexport type Transport = \"sse\" | \"ws\";\n\n/**\n * Configuration options for the Client\n */\nexport interface ClientConfig {\n /**\n * Base URL for the API\n */\n baseURL: string;\n\n /**\n * API key for authentication\n */\n apiKey: string;\n\n /**\n * Assistant identifier\n */\n assistantId: string;\n\n /**\n * Transport method (Server-Sent Events or WebSocket)\n */\n transport: Transport;\n\n /**\n * Request timeout in milliseconds (optional, defaults to 30000)\n */\n timeout?: number;\n\n /**\n * Additional headers to include in requests (optional)\n */\n headers?: Record<string, string>;\n\n /**\n * Configuration for retry behavior (optional)\n */\n retry?: RetryConfig;\n}\n\n/**\n * Configuration for retry behavior\n */\nexport interface RetryConfig {\n /**\n * Maximum number of retry attempts\n */\n maxRetries: number;\n\n /**\n * Initial delay between retries in milliseconds\n */\n initialDelayMs: number;\n\n /**\n * Maximum delay between retries in milliseconds\n */\n maxDelayMs: number;\n\n /**\n * Factor to multiply delay by after each retry attempt\n */\n backoffFactor: number;\n}\n\n/**\n * Thread creation options\n */\nexport interface CreateThreadOptions {\n /**\n * Optional metadata for the thread\n */\n metadata?: Record<string, any>;\n}\n\n/**\n * Thread information\n */\nexport interface Thread {\n /**\n * Thread identifier\n */\n id: string;\n\n /**\n * Thread metadata\n */\n metadata?: Record<string, any>;\n\n /**\n * Thread creation timestamp\n */\n createdAt: string;\n}\n\n/**\n * Chat send options\n */\nexport interface ChatSendOptions {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Messages to send\n */\n messages: Message[];\n /**\n * Files to attach (optional)\n */\n files?: any[];\n\n /**\n * Command to execute (optional)\n */\n command?: {\n resume?: {\n action: string;\n data: Record<string, any> & {\n config?: { thread_id?: string; work_log_id?: string };\n };\n message: string;\n };\n update?: any;\n send?: { node: string; input: any };\n };\n}\n\n/**\n * Chat stream options\n */\nexport interface ChatStreamOptions extends ChatSendOptions {\n /**\n * Whether to run in background (optional)\n */\n background?: boolean;\n\n /**\n * Whether to return agent state when stream completes (optional)\n */\n enableReturnStateWhenSteamCompleted?: boolean;\n}\n\n/**\n * Stream callbacks interface\n */\nexport interface StreamCallbacks {\n /**\n * Called when a stream event is received\n */\n onEvent: (event: MessageChunk) => void;\n\n /**\n * Called when the stream completes, with optional agent state\n */\n onComplete?: (state?: AgentState) => void;\n\n /**\n * Called when an error occurs\n */\n onError?: (error: Error) => void;\n}\n\n/**\n * Chat response\n */\nexport interface ChatResponse {\n /**\n * Response messages\n */\n messages: Message[];\n\n /**\n * Trace ID for debugging\n */\n traceId?: string;\n}\n\n/**\n * Tool registration options\n */\nexport interface RegisterToolOptions {\n /**\n * Tool name\n */\n name: string;\n\n /**\n * Tool parameter schema\n */\n schema: object;\n\n /**\n * Tool handler function\n */\n handler: (params: any) => Promise<any>;\n}\n\n/**\n * Get messages options\n */\nexport interface GetMessagesOptions {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Maximum number of messages to return\n */\n limit?: number;\n\n /**\n * Message ID to start from (for pagination)\n */\n after?: string;\n\n /**\n * Whether to return messages in reverse chronological order\n */\n reverse?: boolean;\n}\n\n/**\n * Thread list options\n */\nexport interface ListThreadsOptions {\n /**\n * Maximum number of threads to return\n */\n limit?: number;\n\n /**\n * Offset for pagination\n */\n offset?: number;\n}\n\n/**\n * Run options\n */\nexport type RunOptions = {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Message to send\n */\n message: string;\n\n /**\n * Files to attach (optional)\n */\n files?: any[];\n\n /**\n * Command to execute (optional)\n */\n command?: any;\n\n /**\n * Whether to stream the response (optional)\n */\n streaming?: boolean;\n\n /**\n * Whether to run in background (optional)\n */\n background?: boolean;\n\n /**\n * Whether to return agent state when stream completes (optional)\n */\n enableReturnStateWhenSteamCompleted?: boolean;\n} & Record<string, any>;\n\n/**\n * Agent state\n */\nexport interface AgentState {\n values: {\n messages: Message[];\n [key: string]: any;\n };\n tasks: Array<{\n interrupts: Array<{\n value: any;\n }>;\n }>;\n}\n\n/**\n * Custom error classes\n */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public responseBody?: any\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class NetworkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NetworkError\";\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n","import { Message, MessageChunk } from \"@axiom-lattice/protocols\";\nimport {\n AgentState,\n ApiError,\n AuthenticationError,\n ChatResponse,\n ChatSendOptions,\n ChatStreamOptions,\n ClientConfig,\n CreateThreadOptions,\n GetMessagesOptions,\n ListThreadsOptions,\n NetworkError,\n RegisterToolOptions,\n RunOptions,\n Thread,\n} from \"./types\";\n\n/**\n * Main client class for interacting with the Axiom Lattice Agent Service API\n */\nexport class Client {\n private config: ClientConfig;\n private assistantId: string;\n private tenantId: string = \"\";\n private registeredTools: Map<string, RegisterToolOptions> = new Map();\n private headers: Record<string, string>;\n\n /**\n * Creates a new Client instance\n * @param config - Configuration options for the client\n */\n constructor(config: ClientConfig) {\n this.config = {\n timeout: 300000,\n ...config,\n };\n\n this.assistantId = config.assistantId;\n\n this.headers = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n }\n\n /**\n * Helper method to handle fetch responses and errors\n * @private\n */\n private async handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthenticationError(\"Authentication failed\");\n } else {\n const errorData = (await response.json().catch(() => ({}))) as {\n message?: string;\n };\n throw new ApiError(\n errorData.message || \"API Error\",\n response.status,\n errorData\n );\n }\n }\n\n // For 204 No Content responses\n if (response.status === 204) {\n return {} as T;\n }\n\n try {\n return (await response.json()) as T;\n } catch (error) {\n throw new Error(`Failed to parse response: ${error}`);\n }\n }\n\n /**\n * Helper method to make fetch requests\n * @private\n */\n private async fetchWithTimeout<T>(\n url: string,\n options: RequestInit = {}\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const fullUrl = url.startsWith(\"http\")\n ? url\n : `${this.config.baseURL}${url}`;\n\n const response = await fetch(fullUrl, {\n ...options,\n headers: {\n ...this.headers,\n ...(options.headers || {}),\n },\n signal: controller.signal,\n });\n\n return await this.handleResponse<T>(response);\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new NetworkError(\"Request timed out\");\n } else if (\n error instanceof TypeError &&\n error.message.includes(\"fetch\")\n ) {\n throw new NetworkError(\"Network request failed\");\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Set tenant ID for multi-tenant environments\n * @param tenantId - Tenant identifier\n */\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n this.headers[\"x-tenant-id\"] = tenantId;\n }\n\n /**\n * Creates a new thread\n * @param options - Options for creating a thread\n * @returns A promise that resolves to the thread ID\n */\n async createThread(options: CreateThreadOptions): Promise<string> {\n try {\n const data = await this.fetchWithTimeout<{ id: string }>(\"/threads\", {\n method: \"POST\",\n body: JSON.stringify({\n ...options,\n assistantId: this.assistantId,\n }),\n });\n return data.id;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves thread information\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the thread information\n */\n async getThread(threadId: string): Promise<Thread> {\n try {\n const url = new URL(`${this.config.baseURL}/threads/${threadId}`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n return await this.fetchWithTimeout<Thread>(url.toString());\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Lists all threads\n * @param options - Options for listing threads\n * @returns A promise that resolves to an array of threads\n */\n async listThreads(options?: ListThreadsOptions): Promise<Thread[]> {\n try {\n const url = new URL(`${this.config.baseURL}/threads`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n if (options?.limit) {\n url.searchParams.append(\"limit\", options.limit.toString());\n }\n\n if (options?.offset !== undefined) {\n url.searchParams.append(\"offset\", options.offset.toString());\n }\n\n const data = await this.fetchWithTimeout<{ threads: Thread[] }>(\n url.toString()\n );\n return data.threads;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Deletes a thread\n * @param threadId - Thread identifier\n * @returns A promise that resolves when the thread is deleted\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n const url = new URL(`${this.config.baseURL}/threads/${threadId}`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n await this.fetchWithTimeout<void>(url.toString(), {\n method: \"DELETE\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves messages from a thread\n * @param options - Options for retrieving messages\n * @returns A promise that resolves to an array of messages\n */\n async getMessages(options: GetMessagesOptions): Promise<Message[]> {\n try {\n const url = new URL(\n `${this.config.baseURL}/api/assistants/${this.assistantId}/${options.threadId}/memory`\n );\n\n if (options.limit) {\n url.searchParams.append(\"limit\", options.limit.toString());\n }\n\n if (options.after) {\n url.searchParams.append(\"after\", options.after);\n }\n\n if (options.reverse !== undefined) {\n url.searchParams.append(\"reverse\", options.reverse.toString());\n }\n\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n return await this.fetchWithTimeout<Message[]>(url.toString());\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves agent state\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the agent state\n */\n async getAgentState(threadId: string): Promise<AgentState> {\n try {\n return await this.fetchWithTimeout<AgentState>(\n `/api/assistants/${this.assistantId}/${threadId}/state`\n );\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Gets agent graph visualization\n * @returns A promise that resolves to the graph visualization data\n */\n async getAgentGraph(): Promise<string> {\n try {\n const data = await this.fetchWithTimeout<{ image: string }>(\n `/api/assistants/${this.assistantId}/graph`\n );\n return data.image;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Run agent with options\n * @param options - Options for running the agent\n * @returns A promise that resolves to the run result\n */\n async run(options: RunOptions): Promise<ChatResponse> {\n try {\n const headers: Record<string, string> = {};\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n if (options.streaming) {\n throw new Error(\n \"Streaming without callbacks is not supported. Use chat.stream with callbacks instead.\"\n );\n } else {\n return await this.fetchWithTimeout<any>(\"/api/runs\", {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n assistant_id: this.assistantId,\n thread_id: options.threadId,\n message: options.message,\n files: options.files,\n command: options.command,\n streaming: false,\n background: options.background || false,\n }),\n });\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Stream run results\n * @param options - Options for streaming run results\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n private streamRun(\n options: RunOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): () => void {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...this.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n // Create abort controller for cancellation\n const controller = new AbortController();\n const { signal } = controller;\n\n // Start the streaming request\n (async () => {\n try {\n const { command, threadId, message, files, background, ...rest } =\n options;\n const response = await fetch(`${this.config.baseURL}/api/runs`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n assistant_id: this.assistantId,\n thread_id: threadId,\n message: message,\n files: files,\n command: command,\n streaming: true,\n background: background || false,\n ...rest,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // Decode the chunk and append to buffer\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n // Keep the last potentially incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(line.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n console.error(\"Error parsing SSE data:\", line, error);\n if (onError) {\n onError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n }\n }\n }\n\n // Process any remaining data in the buffer\n if (buffer && buffer.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(buffer.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n console.error(\"Error parsing SSE data:\", buffer, error);\n }\n }\n\n if (onComplete) {\n // Fetch agent state before calling onComplete if enabled\n if (options.enableReturnStateWhenSteamCompleted) {\n try {\n const state = await this.getAgentState(options.threadId);\n onComplete(state);\n } catch (error) {\n // If getting state fails, still call onComplete without state\n onComplete();\n }\n } else {\n // Just call onComplete without state if not enabled\n onComplete();\n }\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n // Request was cancelled, no need to call onError\n return;\n }\n\n if (onError) {\n onError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n })();\n\n // Return a function to cancel the fetch request\n return () => {\n controller.abort();\n };\n }\n\n /**\n * Chat namespace for sending messages and streaming responses\n */\n chat = {\n /**\n * Sends a message to a thread and receives a response\n * @param options - Options for sending a message\n * @returns A promise that resolves to the chat response\n */\n send: async (options: ChatSendOptions): Promise<ChatResponse> => {\n try {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n const { command, threadId, files, ...rest } = options;\n\n // Use the run method to send the message\n const result = await this.run({\n threadId: threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: false,\n command: command,\n files: files,\n ...rest,\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n },\n\n /**\n * Sends a message to a thread and streams the response\n * @param options - Options for streaming a message\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n stream: (\n options: ChatStreamOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): (() => void) => {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the streamRun method to stream the response\n return this.streamRun(\n {\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: true,\n command: options.command,\n background: options.background,\n enableReturnStateWhenSteamCompleted:\n options.enableReturnStateWhenSteamCompleted,\n },\n onEvent,\n onComplete,\n onError\n );\n },\n };\n\n /**\n * Tools namespace for registering and unregistering client-side tools\n */\n tools = {\n /**\n * Registers a client-side tool\n * @param options - Options for registering a tool\n */\n register: (options: RegisterToolOptions): void => {\n if (this.config.transport !== \"ws\") {\n throw new Error(\n \"Client-side tools are only supported with WebSocket transport\"\n );\n }\n this.registeredTools.set(options.name, options);\n },\n\n /**\n * Unregisters a client-side tool\n * @param name - Tool name\n */\n unregister: (name: string): void => {\n this.registeredTools.delete(name);\n },\n };\n}\n","import { Message, MessageChunk } from \"@axiom-lattice/protocols\";\nimport {\n AgentState,\n ApiError,\n AuthenticationError,\n ChatResponse,\n ChatSendOptions,\n ChatStreamOptions,\n ClientConfig,\n CreateThreadOptions,\n GetMessagesOptions,\n ListThreadsOptions,\n NetworkError,\n RegisterToolOptions,\n RunOptions,\n Thread,\n} from \"./types\";\n\n/**\n * WeChat Mini Program client for interacting with the Axiom Lattice Agent Service API\n */\nexport class WeChatClient {\n private config: ClientConfig;\n private assistantId: string;\n private tenantId: string = \"\";\n private registeredTools: Map<string, RegisterToolOptions> = new Map();\n\n /**\n * Creates a new WeChatClient instance\n * @param config - Configuration options for the client\n */\n constructor(config: ClientConfig) {\n this.config = {\n timeout: 30000,\n ...config,\n };\n\n this.assistantId = config.assistantId;\n }\n\n /**\n * Set tenant ID for multi-tenant environments\n * @param tenantId - Tenant identifier\n */\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n }\n\n /**\n * Helper method to make WeChat HTTP requests\n * @private\n */\n private async request<T>(options: {\n url: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n data?: any;\n }): Promise<T> {\n const { url, method, data } = options;\n\n // Build full URL with query parameters if provided\n let fullUrl = `${this.config.baseURL}${url}`;\n\n // Prepare headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n return new Promise<T>((resolve, reject) => {\n wx.request({\n url: fullUrl,\n method,\n data,\n header: headers,\n timeout: this.config.timeout,\n success: (res: any) => {\n const statusCode = res.statusCode;\n\n if (statusCode >= 200 && statusCode < 300) {\n resolve(res.data);\n } else if (statusCode === 401) {\n reject(\n new AuthenticationError(\n res.data?.message || \"Authentication failed\"\n )\n );\n } else {\n reject(\n new ApiError(\n res.data?.message || \"API Error\",\n statusCode,\n res.data\n )\n );\n }\n },\n fail: (err) => {\n reject(new NetworkError(`Request failed: ${err.errMsg}`));\n },\n });\n });\n }\n\n /**\n * Creates a new thread\n * @param options - Options for creating a thread\n * @returns A promise that resolves to the thread ID\n */\n async createThread(options: CreateThreadOptions): Promise<string> {\n try {\n const response = await this.request<{ id: string }>({\n url: \"/threads\",\n method: \"POST\",\n data: {\n ...options,\n assistantId: this.assistantId,\n },\n });\n return response.id;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves thread information\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the thread information\n */\n async getThread(threadId: string): Promise<Thread> {\n try {\n return await this.request<Thread>({\n url: `/threads/${threadId}`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Lists all threads\n * @param options - Options for listing threads\n * @returns A promise that resolves to an array of threads\n */\n async listThreads(options?: ListThreadsOptions): Promise<Thread[]> {\n try {\n const response = await this.request<{ threads: Thread[] }>({\n url: \"/threads\",\n method: \"GET\",\n });\n return response.threads;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Deletes a thread\n * @param threadId - Thread identifier\n * @returns A promise that resolves when the thread is deleted\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n await this.request<void>({\n url: `/threads/${threadId}`,\n method: \"DELETE\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves messages from a thread\n * @param options - Options for retrieving messages\n * @returns A promise that resolves to an array of messages\n */\n async getMessages(options: GetMessagesOptions): Promise<Message[]> {\n try {\n return await this.request<Message[]>({\n url: `/api/assistants/${this.assistantId}/${options.threadId}/memory`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves agent state\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the agent state\n */\n async getAgentState(threadId: string): Promise<AgentState> {\n try {\n return await this.request<AgentState>({\n url: `/api/assistants/${this.assistantId}/${threadId}/state`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Gets agent graph visualization\n * @returns A promise that resolves to the graph visualization data\n */\n async getAgentGraph(): Promise<string> {\n try {\n const response = await this.request<{ image: string }>({\n url: `/api/assistants/${this.assistantId}/graph`,\n method: \"GET\",\n });\n return response.image;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Run agent with options\n * @param options - Options for running the agent\n * @returns A promise that resolves to the run result\n */\n async run(options: RunOptions): Promise<any> {\n try {\n if (options.streaming) {\n throw new Error(\n \"Streaming without callbacks is not supported. Use chat.stream with callbacks instead.\"\n );\n } else {\n return await this.request<any>({\n url: \"/api/runs\",\n method: \"POST\",\n data: {\n assistant_id: this.assistantId,\n thread_id: options.threadId,\n message: options.message,\n files: options.files,\n command: options.command,\n streaming: false,\n background: options.background || false,\n },\n });\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Stream run results using WeChat's downloadFile API\n * @param options - Options for streaming run results\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n private streamRun(\n options: RunOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): () => void {\n // Prepare headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n // Create a task ID to track and potentially abort the request\n const taskId = wx.request({\n url: `${this.config.baseURL}/api/runs`,\n method: \"POST\",\n data: {\n assistant_id: this.assistantId,\n thread_id: options.threadId,\n message: options.message,\n files: options.files,\n command: options.command,\n streaming: true,\n background: options.background || false,\n },\n header: headers,\n responseType: \"text\",\n enableChunked: true,\n success: async () => {\n // This will be called when the connection is established\n // Actual data processing happens in the dataReceived callback\n },\n fail: (err) => {\n if (onError) {\n onError(new Error(`Stream request failed: ${err.errMsg}`));\n }\n },\n complete: async () => {\n if (onComplete) {\n // Fetch agent state before calling onComplete if enabled\n if (options.enableReturnStateWhenSteamCompleted) {\n try {\n const state = await this.getAgentState(options.threadId);\n onComplete(state);\n } catch (error) {\n // If getting state fails, still call onComplete without state\n onComplete();\n }\n } else {\n // Just call onComplete without state if not enabled\n onComplete();\n }\n }\n },\n // Using WeChat's chunked data capability\n dataReceived: (res) => {\n if (!res.data) return;\n\n // Process the raw data line by line\n const textDecoder = new TextDecoder();\n const text = textDecoder.decode(res.data);\n const lines = text.split(\"\\n\");\n\n for (const line of lines) {\n if (line.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(line.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n if (onError) {\n onError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n }\n }\n },\n });\n\n // Return a function to abort the request\n return () => {\n wx.abortRequest({\n requestId: taskId,\n success: () => console.log(\"Stream request aborted\"),\n fail: (err) =>\n console.error(\"Failed to abort stream request:\", err.errMsg),\n });\n };\n }\n\n /**\n * Chat namespace for sending messages and streaming responses\n */\n chat = {\n /**\n * Sends a message to a thread and receives a response\n * @param options - Options for sending a message\n * @returns A promise that resolves to the chat response\n */\n send: async (options: ChatSendOptions): Promise<ChatResponse> => {\n try {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the run method to send the message\n const result = await this.run({\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: false,\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n },\n\n /**\n * Sends a message to a thread and streams the response\n * @param options - Options for streaming a message\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n stream: (\n options: ChatStreamOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): (() => void) => {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the streamRun method to stream the response\n return this.streamRun(\n {\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: true,\n background: options.background,\n enableReturnStateWhenSteamCompleted:\n options.enableReturnStateWhenSteamCompleted,\n },\n onEvent,\n onComplete,\n onError\n );\n },\n };\n\n /**\n * Tools namespace for registering and unregistering client-side tools\n */\n tools = {\n /**\n * Registers a client-side tool\n * @param options - Options for registering a tool\n */\n register: (options: RegisterToolOptions): void => {\n if (this.config.transport !== \"ws\") {\n throw new Error(\n \"Client-side tools are only supported with WebSocket transport\"\n );\n }\n this.registeredTools.set(options.name, options);\n },\n\n /**\n * Unregisters a client-side tool\n * @param name - Tool name\n */\n unregister: (name: string): void => {\n this.registeredTools.delete(name);\n },\n };\n}\n","/**\n * ChunkMessageMerger\n *\n * A utility for handling streaming message chunks and merging them into complete messages.\n */\n\nimport { Message, MessageChunk } from \"@axiom-lattice/protocols\";\n\n/**\n * Creates a simple message merger for handling streaming message chunks\n * @returns An object with methods to push chunks and retrieve merged messages\n */\nexport function createSimpleMessageMerger() {\n let messages: Message[] = [];\n const messageMap = new Map<string, number>();\n\n // Tool call builder: messageId -> index -> build state\n const toolBuilders = new Map<\n string,\n Map<\n number,\n {\n id?: string;\n name?: string;\n args: string; // Accumulated parameter string\n }\n >\n >();\n\n /**\n * Normalizes role string to standard role\n * @param type - Role string from the input\n * @returns Normalized role\n */\n function normalizeRole(type: string): string {\n switch (type) {\n case \"ai\":\n return \"ai\";\n case \"human\":\n case \"user\":\n return \"human\";\n case \"system\":\n return \"system\";\n case \"tool\":\n return \"tool\";\n case \"developer\":\n return \"developer\";\n default:\n return \"ai\";\n }\n }\n\n /**\n * Safely parses JSON string\n * @param str - JSON string to parse\n * @returns Parsed object or original string if parsing fails\n */\n function safeJsonParse(str: string): any {\n try {\n return JSON.parse(str);\n } catch {\n return str; // Return original string if parsing fails\n }\n }\n\n /**\n * Ensures a message exists, creating it if needed\n * @param id - Message ID\n * @param role - Message role\n * @returns The message object\n */\n function ensureMessage(id: string, role: string): any {\n const index = messageMap.get(id);\n if (index !== undefined) {\n return messages[index];\n }\n\n // Create new message\n let newMessage: any;\n switch (role) {\n case \"human\":\n newMessage = { id, role: \"human\", content: \"\" };\n break;\n case \"system\":\n newMessage = { id, role: \"system\", content: \"\" };\n break;\n case \"tool\":\n newMessage = { id, role: \"tool\", content: \"\", tool_call_id: \"\" };\n break;\n case \"developer\":\n newMessage = { id, role: \"developer\", content: \"\" };\n break;\n default:\n newMessage = { id, role: \"ai\", content: \"\" };\n }\n\n messages.push(newMessage);\n messageMap.set(id, messages.length - 1);\n return newMessage;\n }\n\n /**\n * Updates tool calls for a message\n * @param message - Message to update\n */\n function updateToolCalls(message: any) {\n if (message.role !== \"ai\") return;\n\n const builders = toolBuilders.get(message.id);\n if (!builders || builders.size === 0) return;\n\n const toolCalls: any[] = [];\n for (const [index, builder] of Array.from(builders.entries())) {\n if (builder.name && builder.id) {\n // Try to parse arguments as JSON object\n const args = builder.args.trim();\n const parsedArgs = safeJsonParse(args);\n\n // Create ToolCall object\n toolCalls.push({\n id: builder.id,\n name: builder.name,\n args:\n typeof parsedArgs === \"object\" ? parsedArgs : { value: parsedArgs },\n type: \"tool_call\",\n });\n }\n }\n\n // Only set tool_calls if there are any\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n\n /**\n * Initialize messages\n * @param msgs - Initial messages\n */\n function initialMessages(msgs: any[]) {\n // Just store the messages as-is\n messages = msgs;\n }\n\n /**\n * Processes a message chunk\n * @param chunk - Message chunk to process\n */\n function push(chunk: MessageChunk) {\n const role = normalizeRole(chunk.type);\n const message = ensureMessage(chunk.data.id, role);\n\n // Accumulate content\n if (chunk.data.content) {\n message.content = (message.content || \"\") + chunk.data.content;\n }\n\n // Handle tool call ID (for tool messages)\n if (message.role === \"tool\" && chunk.data.tool_call_id) {\n message.tool_call_id = chunk.data.tool_call_id;\n }\n\n // Handle tool call chunks (incremental)\n if (chunk.data.tool_call_chunks && message.role === \"ai\") {\n let builders = toolBuilders.get(message.id);\n if (!builders) {\n builders = new Map();\n toolBuilders.set(message.id, builders);\n }\n\n for (const chunk_item of chunk.data.tool_call_chunks) {\n let builder = builders.get(chunk_item.index);\n if (!builder) {\n builder = { args: \"\" };\n builders.set(chunk_item.index, builder);\n }\n\n if (chunk_item.name) builder.name = chunk_item.name;\n if (chunk_item.id) builder.id = chunk_item.id;\n if (chunk_item.args) builder.args += chunk_item.args;\n }\n\n updateToolCalls(message);\n }\n\n // Handle complete tool calls (overwrite)\n if (chunk.data.tool_calls && message.role === \"ai\") {\n const toolCalls: any[] = chunk.data.tool_calls\n .filter((tc) => tc.name && tc.id)\n .map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n type: \"tool_call\",\n response: tc.response,\n status: \"success\",\n }));\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n\n // Handle tool calls in additional_kwargs\n if (\n chunk.data.additional_kwargs?.tool_calls &&\n message.role === \"ai\" &&\n !message.tool_calls\n ) {\n const toolCalls: any[] = [];\n\n for (const tc of chunk.data.additional_kwargs.tool_calls) {\n if (tc.function?.name && tc.id) {\n // Convert to our format\n const args =\n typeof tc.function.arguments === \"string\"\n ? safeJsonParse(tc.function.arguments)\n : tc.function.arguments || {};\n\n toolCalls.push({\n id: tc.id,\n name: tc.function.name,\n args,\n type: \"tool_call\",\n });\n }\n }\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n }\n\n /**\n * Gets all messages with tool responses merged into tool calls\n * @returns Array of messages with tool responses merged into tool calls\n */\n function getMessages(): any[] {\n // Create a map to store tool responses by their tool_call_id\n const toolResponsesMap: Record<string, any> = {};\n\n // First pass: collect all tool responses\n messages.forEach((message) => {\n if (message.role === \"tool\" && message.tool_call_id) {\n toolResponsesMap[message.tool_call_id] = message;\n }\n });\n\n // Second pass: merge tool responses with their corresponding AI messages\n return messages\n .filter((message) => {\n // Keep all messages except tool messages\n return message.role !== \"tool\";\n })\n .map((message) => {\n if (message.role === \"ai\" && message.tool_calls) {\n // Create a new message object with merged tool responses\n const mergedMessage = { ...message };\n\n // Add tool responses to the corresponding tool calls\n if (mergedMessage.tool_calls) {\n mergedMessage.tool_calls = mergedMessage.tool_calls.map(\n (toolCall: any) => {\n const toolResponse = toolResponsesMap[toolCall.id];\n if (toolResponse) {\n return {\n ...toolCall,\n response: toolResponse.content,\n status: \"success\",\n };\n }\n return toolCall;\n }\n );\n }\n\n return mergedMessage;\n }\n return message;\n });\n }\n\n /**\n * Gets messages without tool calls\n * @returns Array of messages without tool calls\n */\n function getMessagesWithoutToolCalls(): any[] {\n return messages.filter(\n (message) =>\n message.role !== \"tool\" &&\n (message.role !== \"ai\" || !message.tool_calls)\n );\n }\n\n /**\n * Resets the message merger state\n */\n function reset() {\n messages.length = 0;\n messageMap.clear();\n toolBuilders.clear();\n }\n\n return {\n push,\n initialMessages,\n getMessages,\n getMessagesWithoutToolCalls,\n reset,\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/client.ts","../src/wechat-client.ts","../src/ChunkMessageMerger.ts"],"sourcesContent":["/**\n * @packageDocumentation\n * Axiom Lattice Client SDK - A TypeScript client for the Axiom Lattice Agent Service API\n */\n\n// Re-export all public types and classes\nexport * from \"./types\";\nexport * from \"./client\";\nexport * from \"./wechat-client\";\nexport { createSimpleMessageMerger } from \"./ChunkMessageMerger\";\n","/**\n * Core types for the Axiom Lattice Client SDK\n */\n\nimport {\n Message,\n UserMessage,\n AssistantMessage,\n SystemMessage,\n ToolMessage,\n DeveloperMessage,\n MessageChunk,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Transport method for client-server communication\n * Note: Currently only \"ws\" is used for tool registration\n */\nexport type Transport = \"sse\" | \"ws\";\n\n/**\n * Configuration options for the Client\n */\nexport interface ClientConfig {\n /**\n * Base URL for the API\n */\n baseURL: string;\n\n /**\n * API key for authentication\n */\n apiKey: string;\n\n /**\n * Assistant identifier\n */\n assistantId: string;\n\n /**\n * Transport method (Server-Sent Events or WebSocket)\n */\n transport: Transport;\n\n /**\n * Request timeout in milliseconds (optional, defaults to 30000)\n */\n timeout?: number;\n\n /**\n * Additional headers to include in requests (optional)\n */\n headers?: Record<string, string>;\n\n /**\n * Configuration for retry behavior (optional)\n */\n retry?: RetryConfig;\n}\n\n/**\n * Configuration for retry behavior\n */\nexport interface RetryConfig {\n /**\n * Maximum number of retry attempts\n */\n maxRetries: number;\n\n /**\n * Initial delay between retries in milliseconds\n */\n initialDelayMs: number;\n\n /**\n * Maximum delay between retries in milliseconds\n */\n maxDelayMs: number;\n\n /**\n * Factor to multiply delay by after each retry attempt\n */\n backoffFactor: number;\n}\n\n/**\n * Thread creation options\n */\nexport interface CreateThreadOptions {\n /**\n * Optional metadata for the thread\n */\n metadata?: Record<string, any>;\n}\n\n/**\n * Thread information\n */\nexport interface Thread {\n /**\n * Thread identifier\n */\n id: string;\n\n /**\n * Thread metadata\n */\n metadata?: Record<string, any>;\n\n /**\n * Thread creation timestamp\n */\n createdAt: string;\n}\n\n/**\n * Chat send options\n */\nexport interface ChatSendOptions {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Messages to send\n */\n messages: Message[];\n /**\n * Files to attach (optional)\n */\n files?: any[];\n\n /**\n * Command to execute (optional)\n */\n command?: {\n resume?: {\n action: string;\n data: Record<string, any> & {\n config?: { thread_id?: string; work_log_id?: string };\n };\n message: string;\n };\n update?: any;\n send?: { node: string; input: any };\n };\n}\n\n/**\n * Chat stream options\n */\nexport interface ChatStreamOptions extends ChatSendOptions {\n /**\n * Whether to run in background (optional)\n */\n background?: boolean;\n\n /**\n * Whether to return agent state when stream completes (optional)\n */\n enableReturnStateWhenSteamCompleted?: boolean;\n}\n\n/**\n * Stream callbacks interface\n */\nexport interface StreamCallbacks {\n /**\n * Called when a stream event is received\n */\n onEvent: (event: MessageChunk) => void;\n\n /**\n * Called when the stream completes, with optional agent state\n */\n onComplete?: (state?: AgentState) => void;\n\n /**\n * Called when an error occurs\n */\n onError?: (error: Error) => void;\n}\n\n/**\n * Chat response\n */\nexport interface ChatResponse {\n /**\n * Response messages\n */\n messages: Message[];\n\n /**\n * Trace ID for debugging\n */\n traceId?: string;\n}\n\n/**\n * Tool registration options\n */\nexport interface RegisterToolOptions {\n /**\n * Tool name\n */\n name: string;\n\n /**\n * Tool parameter schema\n */\n schema: object;\n\n /**\n * Tool handler function\n */\n handler: (params: any) => Promise<any>;\n}\n\n/**\n * Get messages options\n */\nexport interface GetMessagesOptions {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Maximum number of messages to return\n */\n limit?: number;\n\n /**\n * Message ID to start from (for pagination)\n */\n after?: string;\n\n /**\n * Whether to return messages in reverse chronological order\n */\n reverse?: boolean;\n}\n\n/**\n * Thread list options\n */\nexport interface ListThreadsOptions {\n /**\n * Maximum number of threads to return\n */\n limit?: number;\n\n /**\n * Offset for pagination\n */\n offset?: number;\n}\n\n/**\n * Run options\n */\nexport type RunOptions = {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Message to send\n */\n message: string;\n\n /**\n * Files to attach (optional)\n */\n files?: any[];\n\n /**\n * Command to execute (optional)\n */\n command?: any;\n\n /**\n * Whether to stream the response (optional)\n */\n streaming?: boolean;\n\n /**\n * Whether to run in background (optional)\n */\n background?: boolean;\n\n /**\n * Whether to return agent state when stream completes (optional)\n */\n enableReturnStateWhenSteamCompleted?: boolean;\n} & Record<string, any>;\n\n/**\n * Agent state\n */\nexport interface AgentState {\n values: {\n messages: Message[];\n [key: string]: any;\n };\n tasks: Array<{\n interrupts: Array<{\n value: any;\n }>;\n }>;\n}\n\n/**\n * Custom error classes\n */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public responseBody?: any\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class NetworkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NetworkError\";\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n","import { Message, MessageChunk } from \"@axiom-lattice/protocols\";\nimport {\n AgentState,\n ApiError,\n AuthenticationError,\n ChatResponse,\n ChatSendOptions,\n ChatStreamOptions,\n ClientConfig,\n CreateThreadOptions,\n GetMessagesOptions,\n ListThreadsOptions,\n NetworkError,\n RegisterToolOptions,\n RunOptions,\n Thread,\n} from \"./types\";\n\n/**\n * Main client class for interacting with the Axiom Lattice Agent Service API\n */\nexport class Client {\n private config: ClientConfig;\n private assistantId: string;\n private tenantId: string = \"\";\n private registeredTools: Map<string, RegisterToolOptions> = new Map();\n private headers: Record<string, string>;\n\n /**\n * Creates a new Client instance\n * @param config - Configuration options for the client\n */\n constructor(config: ClientConfig) {\n this.config = {\n timeout: 300000,\n ...config,\n };\n\n this.assistantId = config.assistantId;\n\n this.headers = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n }\n\n /**\n * Helper method to handle fetch responses and errors\n * @private\n */\n private async handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthenticationError(\"Authentication failed\");\n } else {\n const errorData = (await response.json().catch(() => ({}))) as {\n message?: string;\n };\n throw new ApiError(\n errorData.message || \"API Error\",\n response.status,\n errorData\n );\n }\n }\n\n // For 204 No Content responses\n if (response.status === 204) {\n return {} as T;\n }\n\n try {\n return (await response.json()) as T;\n } catch (error) {\n throw new Error(`Failed to parse response: ${error}`);\n }\n }\n\n /**\n * Helper method to make fetch requests\n * @private\n */\n private async fetchWithTimeout<T>(\n url: string,\n options: RequestInit = {}\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const fullUrl = url.startsWith(\"http\")\n ? url\n : `${this.config.baseURL}${url}`;\n\n const response = await fetch(fullUrl, {\n ...options,\n headers: {\n ...this.headers,\n ...(options.headers || {}),\n },\n signal: controller.signal,\n });\n\n return await this.handleResponse<T>(response);\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new NetworkError(\"Request timed out\");\n } else if (\n error instanceof TypeError &&\n error.message.includes(\"fetch\")\n ) {\n throw new NetworkError(\"Network request failed\");\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Set tenant ID for multi-tenant environments\n * @param tenantId - Tenant identifier\n */\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n this.headers[\"x-tenant-id\"] = tenantId;\n }\n\n /**\n * Creates a new thread\n * @param options - Options for creating a thread\n * @returns A promise that resolves to the thread ID\n */\n async createThread(options: CreateThreadOptions): Promise<string> {\n try {\n const data = await this.fetchWithTimeout<{ id: string }>(\"/threads\", {\n method: \"POST\",\n body: JSON.stringify({\n ...options,\n assistantId: this.assistantId,\n }),\n });\n return data.id;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves thread information\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the thread information\n */\n async getThread(threadId: string): Promise<Thread> {\n try {\n const url = new URL(`${this.config.baseURL}/threads/${threadId}`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n return await this.fetchWithTimeout<Thread>(url.toString());\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Lists all threads\n * @param options - Options for listing threads\n * @returns A promise that resolves to an array of threads\n */\n async listThreads(options?: ListThreadsOptions): Promise<Thread[]> {\n try {\n const url = new URL(`${this.config.baseURL}/threads`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n if (options?.limit) {\n url.searchParams.append(\"limit\", options.limit.toString());\n }\n\n if (options?.offset !== undefined) {\n url.searchParams.append(\"offset\", options.offset.toString());\n }\n\n const data = await this.fetchWithTimeout<{ threads: Thread[] }>(\n url.toString()\n );\n return data.threads;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Deletes a thread\n * @param threadId - Thread identifier\n * @returns A promise that resolves when the thread is deleted\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n const url = new URL(`${this.config.baseURL}/threads/${threadId}`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n await this.fetchWithTimeout<void>(url.toString(), {\n method: \"DELETE\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves messages from a thread\n * @param options - Options for retrieving messages\n * @returns A promise that resolves to an array of messages\n */\n async getMessages(options: GetMessagesOptions): Promise<Message[]> {\n try {\n const url = new URL(\n `${this.config.baseURL}/api/assistants/${this.assistantId}/${options.threadId}/memory`\n );\n\n if (options.limit) {\n url.searchParams.append(\"limit\", options.limit.toString());\n }\n\n if (options.after) {\n url.searchParams.append(\"after\", options.after);\n }\n\n if (options.reverse !== undefined) {\n url.searchParams.append(\"reverse\", options.reverse.toString());\n }\n\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n return await this.fetchWithTimeout<Message[]>(url.toString());\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves agent state\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the agent state\n */\n async getAgentState(threadId: string): Promise<AgentState> {\n try {\n return await this.fetchWithTimeout<AgentState>(\n `/api/assistants/${this.assistantId}/${threadId}/state`\n );\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Gets agent graph visualization\n * @returns A promise that resolves to the graph visualization data\n */\n async getAgentGraph(): Promise<string> {\n try {\n const data = await this.fetchWithTimeout<{ image: string }>(\n `/api/assistants/${this.assistantId}/graph`\n );\n return data.image;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Run agent with options\n * @param options - Options for running the agent\n * @returns A promise that resolves to the run result\n */\n async run(options: RunOptions): Promise<ChatResponse> {\n try {\n const headers: Record<string, string> = {};\n const { command, threadId, message, files, background, ...rest } =\n options;\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n if (options.streaming) {\n throw new Error(\n \"Streaming without callbacks is not supported. Use chat.stream with callbacks instead.\"\n );\n } else {\n return await this.fetchWithTimeout<any>(\"/api/runs\", {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n assistant_id: this.assistantId,\n thread_id: threadId,\n message: message,\n files: files,\n command: command,\n streaming: false,\n background: background || false,\n ...rest,\n }),\n });\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Stream run results\n * @param options - Options for streaming run results\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n private streamRun(\n options: RunOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): () => void {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...this.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n // Create abort controller for cancellation\n const controller = new AbortController();\n const { signal } = controller;\n\n // Start the streaming request\n (async () => {\n try {\n const { command, threadId, message, files, background, ...rest } =\n options;\n const response = await fetch(`${this.config.baseURL}/api/runs`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n assistant_id: this.assistantId,\n thread_id: threadId,\n message: message,\n files: files,\n command: command,\n streaming: true,\n background: background || false,\n ...rest,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // Decode the chunk and append to buffer\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n // Keep the last potentially incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(line.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n console.error(\"Error parsing SSE data:\", line, error);\n if (onError) {\n onError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n }\n }\n }\n\n // Process any remaining data in the buffer\n if (buffer && buffer.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(buffer.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n console.error(\"Error parsing SSE data:\", buffer, error);\n }\n }\n\n if (onComplete) {\n // Fetch agent state before calling onComplete if enabled\n if (options.enableReturnStateWhenSteamCompleted) {\n try {\n const state = await this.getAgentState(options.threadId);\n onComplete(state);\n } catch (error) {\n // If getting state fails, still call onComplete without state\n onComplete();\n }\n } else {\n // Just call onComplete without state if not enabled\n onComplete();\n }\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n // Request was cancelled, no need to call onError\n return;\n }\n\n if (onError) {\n onError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n })();\n\n // Return a function to cancel the fetch request\n return () => {\n controller.abort();\n };\n }\n\n /**\n * Chat namespace for sending messages and streaming responses\n */\n chat = {\n /**\n * Sends a message to a thread and receives a response\n * @param options - Options for sending a message\n * @returns A promise that resolves to the chat response\n */\n send: async (options: ChatSendOptions): Promise<ChatResponse> => {\n try {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n const { command, threadId, files, ...rest } = options;\n\n // Use the run method to send the message\n const result = await this.run({\n threadId: threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: false,\n command: command,\n files: files,\n ...rest,\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n },\n\n /**\n * Sends a message to a thread and streams the response\n * @param options - Options for streaming a message\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n stream: (\n options: ChatStreamOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): (() => void) => {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the streamRun method to stream the response\n return this.streamRun(\n {\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: true,\n command: options.command,\n background: options.background,\n enableReturnStateWhenSteamCompleted:\n options.enableReturnStateWhenSteamCompleted,\n },\n onEvent,\n onComplete,\n onError\n );\n },\n };\n\n /**\n * Tools namespace for registering and unregistering client-side tools\n */\n tools = {\n /**\n * Registers a client-side tool\n * @param options - Options for registering a tool\n */\n register: (options: RegisterToolOptions): void => {\n if (this.config.transport !== \"ws\") {\n throw new Error(\n \"Client-side tools are only supported with WebSocket transport\"\n );\n }\n this.registeredTools.set(options.name, options);\n },\n\n /**\n * Unregisters a client-side tool\n * @param name - Tool name\n */\n unregister: (name: string): void => {\n this.registeredTools.delete(name);\n },\n };\n}\n","import { Message, MessageChunk } from \"@axiom-lattice/protocols\";\nimport {\n AgentState,\n ApiError,\n AuthenticationError,\n ChatResponse,\n ChatSendOptions,\n ChatStreamOptions,\n ClientConfig,\n CreateThreadOptions,\n GetMessagesOptions,\n ListThreadsOptions,\n NetworkError,\n RegisterToolOptions,\n RunOptions,\n Thread,\n} from \"./types\";\n\n/**\n * WeChat Mini Program client for interacting with the Axiom Lattice Agent Service API\n */\nexport class WeChatClient {\n private config: ClientConfig;\n private assistantId: string;\n private tenantId: string = \"\";\n private registeredTools: Map<string, RegisterToolOptions> = new Map();\n\n /**\n * Creates a new WeChatClient instance\n * @param config - Configuration options for the client\n */\n constructor(config: ClientConfig) {\n this.config = {\n timeout: 30000,\n ...config,\n };\n\n this.assistantId = config.assistantId;\n }\n\n /**\n * Set tenant ID for multi-tenant environments\n * @param tenantId - Tenant identifier\n */\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n }\n\n /**\n * Helper method to make WeChat HTTP requests\n * @private\n */\n private async request<T>(options: {\n url: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n data?: any;\n }): Promise<T> {\n const { url, method, data } = options;\n\n // Build full URL with query parameters if provided\n let fullUrl = `${this.config.baseURL}${url}`;\n\n // Prepare headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n return new Promise<T>((resolve, reject) => {\n wx.request({\n url: fullUrl,\n method,\n data,\n header: headers,\n timeout: this.config.timeout,\n success: (res: any) => {\n const statusCode = res.statusCode;\n\n if (statusCode >= 200 && statusCode < 300) {\n resolve(res.data);\n } else if (statusCode === 401) {\n reject(\n new AuthenticationError(\n res.data?.message || \"Authentication failed\"\n )\n );\n } else {\n reject(\n new ApiError(\n res.data?.message || \"API Error\",\n statusCode,\n res.data\n )\n );\n }\n },\n fail: (err) => {\n reject(new NetworkError(`Request failed: ${err.errMsg}`));\n },\n });\n });\n }\n\n /**\n * Creates a new thread\n * @param options - Options for creating a thread\n * @returns A promise that resolves to the thread ID\n */\n async createThread(options: CreateThreadOptions): Promise<string> {\n try {\n const response = await this.request<{ id: string }>({\n url: \"/threads\",\n method: \"POST\",\n data: {\n ...options,\n assistantId: this.assistantId,\n },\n });\n return response.id;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves thread information\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the thread information\n */\n async getThread(threadId: string): Promise<Thread> {\n try {\n return await this.request<Thread>({\n url: `/threads/${threadId}`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Lists all threads\n * @param options - Options for listing threads\n * @returns A promise that resolves to an array of threads\n */\n async listThreads(options?: ListThreadsOptions): Promise<Thread[]> {\n try {\n const response = await this.request<{ threads: Thread[] }>({\n url: \"/threads\",\n method: \"GET\",\n });\n return response.threads;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Deletes a thread\n * @param threadId - Thread identifier\n * @returns A promise that resolves when the thread is deleted\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n await this.request<void>({\n url: `/threads/${threadId}`,\n method: \"DELETE\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves messages from a thread\n * @param options - Options for retrieving messages\n * @returns A promise that resolves to an array of messages\n */\n async getMessages(options: GetMessagesOptions): Promise<Message[]> {\n try {\n return await this.request<Message[]>({\n url: `/api/assistants/${this.assistantId}/${options.threadId}/memory`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves agent state\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the agent state\n */\n async getAgentState(threadId: string): Promise<AgentState> {\n try {\n return await this.request<AgentState>({\n url: `/api/assistants/${this.assistantId}/${threadId}/state`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Gets agent graph visualization\n * @returns A promise that resolves to the graph visualization data\n */\n async getAgentGraph(): Promise<string> {\n try {\n const response = await this.request<{ image: string }>({\n url: `/api/assistants/${this.assistantId}/graph`,\n method: \"GET\",\n });\n return response.image;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Run agent with options\n * @param options - Options for running the agent\n * @returns A promise that resolves to the run result\n */\n async run(options: RunOptions): Promise<any> {\n try {\n if (options.streaming) {\n throw new Error(\n \"Streaming without callbacks is not supported. Use chat.stream with callbacks instead.\"\n );\n } else {\n return await this.request<any>({\n url: \"/api/runs\",\n method: \"POST\",\n data: {\n assistant_id: this.assistantId,\n thread_id: options.threadId,\n message: options.message,\n files: options.files,\n command: options.command,\n streaming: false,\n background: options.background || false,\n },\n });\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Stream run results using WeChat's downloadFile API\n * @param options - Options for streaming run results\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n private streamRun(\n options: RunOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): () => void {\n // Prepare headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n // Create a task ID to track and potentially abort the request\n const taskId = wx.request({\n url: `${this.config.baseURL}/api/runs`,\n method: \"POST\",\n data: {\n assistant_id: this.assistantId,\n thread_id: options.threadId,\n message: options.message,\n files: options.files,\n command: options.command,\n streaming: true,\n background: options.background || false,\n },\n header: headers,\n responseType: \"text\",\n enableChunked: true,\n success: async () => {\n // This will be called when the connection is established\n // Actual data processing happens in the dataReceived callback\n },\n fail: (err) => {\n if (onError) {\n onError(new Error(`Stream request failed: ${err.errMsg}`));\n }\n },\n complete: async () => {\n if (onComplete) {\n // Fetch agent state before calling onComplete if enabled\n if (options.enableReturnStateWhenSteamCompleted) {\n try {\n const state = await this.getAgentState(options.threadId);\n onComplete(state);\n } catch (error) {\n // If getting state fails, still call onComplete without state\n onComplete();\n }\n } else {\n // Just call onComplete without state if not enabled\n onComplete();\n }\n }\n },\n // Using WeChat's chunked data capability\n dataReceived: (res) => {\n if (!res.data) return;\n\n // Process the raw data line by line\n const textDecoder = new TextDecoder();\n const text = textDecoder.decode(res.data);\n const lines = text.split(\"\\n\");\n\n for (const line of lines) {\n if (line.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(line.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n if (onError) {\n onError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n }\n }\n },\n });\n\n // Return a function to abort the request\n return () => {\n wx.abortRequest({\n requestId: taskId,\n success: () => console.log(\"Stream request aborted\"),\n fail: (err) =>\n console.error(\"Failed to abort stream request:\", err.errMsg),\n });\n };\n }\n\n /**\n * Chat namespace for sending messages and streaming responses\n */\n chat = {\n /**\n * Sends a message to a thread and receives a response\n * @param options - Options for sending a message\n * @returns A promise that resolves to the chat response\n */\n send: async (options: ChatSendOptions): Promise<ChatResponse> => {\n try {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the run method to send the message\n const result = await this.run({\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: false,\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n },\n\n /**\n * Sends a message to a thread and streams the response\n * @param options - Options for streaming a message\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n stream: (\n options: ChatStreamOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): (() => void) => {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the streamRun method to stream the response\n return this.streamRun(\n {\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: true,\n background: options.background,\n enableReturnStateWhenSteamCompleted:\n options.enableReturnStateWhenSteamCompleted,\n },\n onEvent,\n onComplete,\n onError\n );\n },\n };\n\n /**\n * Tools namespace for registering and unregistering client-side tools\n */\n tools = {\n /**\n * Registers a client-side tool\n * @param options - Options for registering a tool\n */\n register: (options: RegisterToolOptions): void => {\n if (this.config.transport !== \"ws\") {\n throw new Error(\n \"Client-side tools are only supported with WebSocket transport\"\n );\n }\n this.registeredTools.set(options.name, options);\n },\n\n /**\n * Unregisters a client-side tool\n * @param name - Tool name\n */\n unregister: (name: string): void => {\n this.registeredTools.delete(name);\n },\n };\n}\n","/**\n * ChunkMessageMerger\n *\n * A utility for handling streaming message chunks and merging them into complete messages.\n */\n\nimport { Message, MessageChunk } from \"@axiom-lattice/protocols\";\n\n/**\n * Creates a simple message merger for handling streaming message chunks\n * @returns An object with methods to push chunks and retrieve merged messages\n */\nexport function createSimpleMessageMerger() {\n let messages: Message[] = [];\n const messageMap = new Map<string, number>();\n\n // Tool call builder: messageId -> index -> build state\n const toolBuilders = new Map<\n string,\n Map<\n number,\n {\n id?: string;\n name?: string;\n args: string; // Accumulated parameter string\n }\n >\n >();\n\n /**\n * Normalizes role string to standard role\n * @param type - Role string from the input\n * @returns Normalized role\n */\n function normalizeRole(type: string): string {\n switch (type) {\n case \"ai\":\n return \"ai\";\n case \"human\":\n case \"user\":\n return \"human\";\n case \"system\":\n return \"system\";\n case \"tool\":\n return \"tool\";\n case \"developer\":\n return \"developer\";\n default:\n return \"ai\";\n }\n }\n\n /**\n * Safely parses JSON string\n * @param str - JSON string to parse\n * @returns Parsed object or original string if parsing fails\n */\n function safeJsonParse(str: string): any {\n try {\n return JSON.parse(str);\n } catch {\n return str; // Return original string if parsing fails\n }\n }\n\n /**\n * Ensures a message exists, creating it if needed\n * @param id - Message ID\n * @param role - Message role\n * @returns The message object\n */\n function ensureMessage(id: string, role: string): any {\n const index = messageMap.get(id);\n if (index !== undefined) {\n return messages[index];\n }\n\n // Create new message\n let newMessage: any;\n switch (role) {\n case \"human\":\n newMessage = { id, role: \"human\", content: \"\" };\n break;\n case \"system\":\n newMessage = { id, role: \"system\", content: \"\" };\n break;\n case \"tool\":\n newMessage = { id, role: \"tool\", content: \"\", tool_call_id: \"\" };\n break;\n case \"developer\":\n newMessage = { id, role: \"developer\", content: \"\" };\n break;\n default:\n newMessage = { id, role: \"ai\", content: \"\" };\n }\n\n messages.push(newMessage);\n messageMap.set(id, messages.length - 1);\n return newMessage;\n }\n\n /**\n * Updates tool calls for a message\n * @param message - Message to update\n */\n function updateToolCalls(message: any) {\n if (message.role !== \"ai\") return;\n\n const builders = toolBuilders.get(message.id);\n if (!builders || builders.size === 0) return;\n\n const toolCalls: any[] = [];\n for (const [index, builder] of Array.from(builders.entries())) {\n if (builder.name && builder.id) {\n // Try to parse arguments as JSON object\n const args = builder.args.trim();\n const parsedArgs = safeJsonParse(args);\n\n // Create ToolCall object\n toolCalls.push({\n id: builder.id,\n name: builder.name,\n args:\n typeof parsedArgs === \"object\" ? parsedArgs : { value: parsedArgs },\n type: \"tool_call\",\n });\n }\n }\n\n // Only set tool_calls if there are any\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n\n /**\n * Initialize messages\n * @param msgs - Initial messages\n */\n function initialMessages(msgs: any[]) {\n // Just store the messages as-is\n messages = msgs;\n }\n\n /**\n * Processes a message chunk\n * @param chunk - Message chunk to process\n */\n function push(chunk: MessageChunk) {\n const role = normalizeRole(chunk.type);\n const message = ensureMessage(chunk.data.id, role);\n\n // Accumulate content\n if (chunk.data.content) {\n message.content = (message.content || \"\") + chunk.data.content;\n }\n\n // Handle tool call ID (for tool messages)\n if (message.role === \"tool\" && chunk.data.tool_call_id) {\n message.tool_call_id = chunk.data.tool_call_id;\n }\n\n // Handle tool call chunks (incremental)\n if (chunk.data.tool_call_chunks && message.role === \"ai\") {\n let builders = toolBuilders.get(message.id);\n if (!builders) {\n builders = new Map();\n toolBuilders.set(message.id, builders);\n }\n\n for (const chunk_item of chunk.data.tool_call_chunks) {\n let builder = builders.get(chunk_item.index);\n if (!builder) {\n builder = { args: \"\" };\n builders.set(chunk_item.index, builder);\n }\n\n if (chunk_item.name) builder.name = chunk_item.name;\n if (chunk_item.id) builder.id = chunk_item.id;\n if (chunk_item.args) builder.args += chunk_item.args;\n }\n\n updateToolCalls(message);\n }\n\n // Handle complete tool calls (overwrite)\n if (chunk.data.tool_calls && message.role === \"ai\") {\n const toolCalls: any[] = chunk.data.tool_calls\n .filter((tc) => tc.name && tc.id)\n .map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n type: \"tool_call\",\n response: tc.response,\n status: \"success\",\n }));\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n\n // Handle tool calls in additional_kwargs\n if (\n chunk.data.additional_kwargs?.tool_calls &&\n message.role === \"ai\" &&\n !message.tool_calls\n ) {\n const toolCalls: any[] = [];\n\n for (const tc of chunk.data.additional_kwargs.tool_calls) {\n if (tc.function?.name && tc.id) {\n // Convert to our format\n const args =\n typeof tc.function.arguments === \"string\"\n ? safeJsonParse(tc.function.arguments)\n : tc.function.arguments || {};\n\n toolCalls.push({\n id: tc.id,\n name: tc.function.name,\n args,\n type: \"tool_call\",\n });\n }\n }\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n }\n\n /**\n * Gets all messages with tool responses merged into tool calls\n * @returns Array of messages with tool responses merged into tool calls\n */\n function getMessages(): any[] {\n // Create a map to store tool responses by their tool_call_id\n const toolResponsesMap: Record<string, any> = {};\n\n // First pass: collect all tool responses\n messages.forEach((message) => {\n if (message.role === \"tool\" && message.tool_call_id) {\n toolResponsesMap[message.tool_call_id] = message;\n }\n });\n\n // Second pass: merge tool responses with their corresponding AI messages\n return messages\n .filter((message) => {\n // Keep all messages except tool messages\n return message.role !== \"tool\";\n })\n .map((message) => {\n if (message.role === \"ai\" && message.tool_calls) {\n // Create a new message object with merged tool responses\n const mergedMessage = { ...message };\n\n // Add tool responses to the corresponding tool calls\n if (mergedMessage.tool_calls) {\n mergedMessage.tool_calls = mergedMessage.tool_calls.map(\n (toolCall: any) => {\n const toolResponse = toolResponsesMap[toolCall.id];\n if (toolResponse) {\n return {\n ...toolCall,\n response: toolResponse.content,\n status: \"success\",\n };\n }\n return toolCall;\n }\n );\n }\n\n return mergedMessage;\n }\n return message;\n });\n }\n\n /**\n * Gets messages without tool calls\n * @returns Array of messages without tool calls\n */\n function getMessagesWithoutToolCalls(): any[] {\n return messages.filter(\n (message) =>\n message.role !== \"tool\" &&\n (message.role !== \"ai\" || !message.tool_calls)\n );\n }\n\n /**\n * Resets the message merger state\n */\n function reset() {\n messages.length = 0;\n messageMap.clear();\n toolBuilders.clear();\n }\n\n return {\n push,\n initialMessages,\n getMessages,\n getMessagesWithoutToolCalls,\n reset,\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -311,6 +311,7 @@ var Client = class {
|
|
|
311
311
|
async run(options) {
|
|
312
312
|
try {
|
|
313
313
|
const headers = {};
|
|
314
|
+
const { command, threadId, message, files, background, ...rest } = options;
|
|
314
315
|
if (this.tenantId) {
|
|
315
316
|
headers["x-tenant-id"] = this.tenantId;
|
|
316
317
|
}
|
|
@@ -324,12 +325,13 @@ var Client = class {
|
|
|
324
325
|
headers,
|
|
325
326
|
body: JSON.stringify({
|
|
326
327
|
assistant_id: this.assistantId,
|
|
327
|
-
thread_id:
|
|
328
|
-
message
|
|
329
|
-
files
|
|
330
|
-
command
|
|
328
|
+
thread_id: threadId,
|
|
329
|
+
message,
|
|
330
|
+
files,
|
|
331
|
+
command,
|
|
331
332
|
streaming: false,
|
|
332
|
-
background:
|
|
333
|
+
background: background || false,
|
|
334
|
+
...rest
|
|
333
335
|
})
|
|
334
336
|
});
|
|
335
337
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/client.ts","../src/wechat-client.ts","../src/ChunkMessageMerger.ts"],"sourcesContent":["/**\n * Core types for the Axiom Lattice Client SDK\n */\n\nimport {\n Message,\n UserMessage,\n AssistantMessage,\n SystemMessage,\n ToolMessage,\n DeveloperMessage,\n MessageChunk,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Transport method for client-server communication\n * Note: Currently only \"ws\" is used for tool registration\n */\nexport type Transport = \"sse\" | \"ws\";\n\n/**\n * Configuration options for the Client\n */\nexport interface ClientConfig {\n /**\n * Base URL for the API\n */\n baseURL: string;\n\n /**\n * API key for authentication\n */\n apiKey: string;\n\n /**\n * Assistant identifier\n */\n assistantId: string;\n\n /**\n * Transport method (Server-Sent Events or WebSocket)\n */\n transport: Transport;\n\n /**\n * Request timeout in milliseconds (optional, defaults to 30000)\n */\n timeout?: number;\n\n /**\n * Additional headers to include in requests (optional)\n */\n headers?: Record<string, string>;\n\n /**\n * Configuration for retry behavior (optional)\n */\n retry?: RetryConfig;\n}\n\n/**\n * Configuration for retry behavior\n */\nexport interface RetryConfig {\n /**\n * Maximum number of retry attempts\n */\n maxRetries: number;\n\n /**\n * Initial delay between retries in milliseconds\n */\n initialDelayMs: number;\n\n /**\n * Maximum delay between retries in milliseconds\n */\n maxDelayMs: number;\n\n /**\n * Factor to multiply delay by after each retry attempt\n */\n backoffFactor: number;\n}\n\n/**\n * Thread creation options\n */\nexport interface CreateThreadOptions {\n /**\n * Optional metadata for the thread\n */\n metadata?: Record<string, any>;\n}\n\n/**\n * Thread information\n */\nexport interface Thread {\n /**\n * Thread identifier\n */\n id: string;\n\n /**\n * Thread metadata\n */\n metadata?: Record<string, any>;\n\n /**\n * Thread creation timestamp\n */\n createdAt: string;\n}\n\n/**\n * Chat send options\n */\nexport interface ChatSendOptions {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Messages to send\n */\n messages: Message[];\n /**\n * Files to attach (optional)\n */\n files?: any[];\n\n /**\n * Command to execute (optional)\n */\n command?: {\n resume?: {\n action: string;\n data: Record<string, any> & {\n config?: { thread_id?: string; work_log_id?: string };\n };\n message: string;\n };\n update?: any;\n send?: { node: string; input: any };\n };\n}\n\n/**\n * Chat stream options\n */\nexport interface ChatStreamOptions extends ChatSendOptions {\n /**\n * Whether to run in background (optional)\n */\n background?: boolean;\n\n /**\n * Whether to return agent state when stream completes (optional)\n */\n enableReturnStateWhenSteamCompleted?: boolean;\n}\n\n/**\n * Stream callbacks interface\n */\nexport interface StreamCallbacks {\n /**\n * Called when a stream event is received\n */\n onEvent: (event: MessageChunk) => void;\n\n /**\n * Called when the stream completes, with optional agent state\n */\n onComplete?: (state?: AgentState) => void;\n\n /**\n * Called when an error occurs\n */\n onError?: (error: Error) => void;\n}\n\n/**\n * Chat response\n */\nexport interface ChatResponse {\n /**\n * Response messages\n */\n messages: Message[];\n\n /**\n * Trace ID for debugging\n */\n traceId?: string;\n}\n\n/**\n * Tool registration options\n */\nexport interface RegisterToolOptions {\n /**\n * Tool name\n */\n name: string;\n\n /**\n * Tool parameter schema\n */\n schema: object;\n\n /**\n * Tool handler function\n */\n handler: (params: any) => Promise<any>;\n}\n\n/**\n * Get messages options\n */\nexport interface GetMessagesOptions {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Maximum number of messages to return\n */\n limit?: number;\n\n /**\n * Message ID to start from (for pagination)\n */\n after?: string;\n\n /**\n * Whether to return messages in reverse chronological order\n */\n reverse?: boolean;\n}\n\n/**\n * Thread list options\n */\nexport interface ListThreadsOptions {\n /**\n * Maximum number of threads to return\n */\n limit?: number;\n\n /**\n * Offset for pagination\n */\n offset?: number;\n}\n\n/**\n * Run options\n */\nexport type RunOptions = {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Message to send\n */\n message: string;\n\n /**\n * Files to attach (optional)\n */\n files?: any[];\n\n /**\n * Command to execute (optional)\n */\n command?: any;\n\n /**\n * Whether to stream the response (optional)\n */\n streaming?: boolean;\n\n /**\n * Whether to run in background (optional)\n */\n background?: boolean;\n\n /**\n * Whether to return agent state when stream completes (optional)\n */\n enableReturnStateWhenSteamCompleted?: boolean;\n} & Record<string, any>;\n\n/**\n * Agent state\n */\nexport interface AgentState {\n values: {\n messages: Message[];\n [key: string]: any;\n };\n tasks: Array<{\n interrupts: Array<{\n value: any;\n }>;\n }>;\n}\n\n/**\n * Custom error classes\n */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public responseBody?: any\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class NetworkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NetworkError\";\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n","import { Message, MessageChunk } from \"@axiom-lattice/protocols\";\nimport {\n AgentState,\n ApiError,\n AuthenticationError,\n ChatResponse,\n ChatSendOptions,\n ChatStreamOptions,\n ClientConfig,\n CreateThreadOptions,\n GetMessagesOptions,\n ListThreadsOptions,\n NetworkError,\n RegisterToolOptions,\n RunOptions,\n Thread,\n} from \"./types\";\n\n/**\n * Main client class for interacting with the Axiom Lattice Agent Service API\n */\nexport class Client {\n private config: ClientConfig;\n private assistantId: string;\n private tenantId: string = \"\";\n private registeredTools: Map<string, RegisterToolOptions> = new Map();\n private headers: Record<string, string>;\n\n /**\n * Creates a new Client instance\n * @param config - Configuration options for the client\n */\n constructor(config: ClientConfig) {\n this.config = {\n timeout: 300000,\n ...config,\n };\n\n this.assistantId = config.assistantId;\n\n this.headers = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n }\n\n /**\n * Helper method to handle fetch responses and errors\n * @private\n */\n private async handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthenticationError(\"Authentication failed\");\n } else {\n const errorData = (await response.json().catch(() => ({}))) as {\n message?: string;\n };\n throw new ApiError(\n errorData.message || \"API Error\",\n response.status,\n errorData\n );\n }\n }\n\n // For 204 No Content responses\n if (response.status === 204) {\n return {} as T;\n }\n\n try {\n return (await response.json()) as T;\n } catch (error) {\n throw new Error(`Failed to parse response: ${error}`);\n }\n }\n\n /**\n * Helper method to make fetch requests\n * @private\n */\n private async fetchWithTimeout<T>(\n url: string,\n options: RequestInit = {}\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const fullUrl = url.startsWith(\"http\")\n ? url\n : `${this.config.baseURL}${url}`;\n\n const response = await fetch(fullUrl, {\n ...options,\n headers: {\n ...this.headers,\n ...(options.headers || {}),\n },\n signal: controller.signal,\n });\n\n return await this.handleResponse<T>(response);\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new NetworkError(\"Request timed out\");\n } else if (\n error instanceof TypeError &&\n error.message.includes(\"fetch\")\n ) {\n throw new NetworkError(\"Network request failed\");\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Set tenant ID for multi-tenant environments\n * @param tenantId - Tenant identifier\n */\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n this.headers[\"x-tenant-id\"] = tenantId;\n }\n\n /**\n * Creates a new thread\n * @param options - Options for creating a thread\n * @returns A promise that resolves to the thread ID\n */\n async createThread(options: CreateThreadOptions): Promise<string> {\n try {\n const data = await this.fetchWithTimeout<{ id: string }>(\"/threads\", {\n method: \"POST\",\n body: JSON.stringify({\n ...options,\n assistantId: this.assistantId,\n }),\n });\n return data.id;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves thread information\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the thread information\n */\n async getThread(threadId: string): Promise<Thread> {\n try {\n const url = new URL(`${this.config.baseURL}/threads/${threadId}`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n return await this.fetchWithTimeout<Thread>(url.toString());\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Lists all threads\n * @param options - Options for listing threads\n * @returns A promise that resolves to an array of threads\n */\n async listThreads(options?: ListThreadsOptions): Promise<Thread[]> {\n try {\n const url = new URL(`${this.config.baseURL}/threads`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n if (options?.limit) {\n url.searchParams.append(\"limit\", options.limit.toString());\n }\n\n if (options?.offset !== undefined) {\n url.searchParams.append(\"offset\", options.offset.toString());\n }\n\n const data = await this.fetchWithTimeout<{ threads: Thread[] }>(\n url.toString()\n );\n return data.threads;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Deletes a thread\n * @param threadId - Thread identifier\n * @returns A promise that resolves when the thread is deleted\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n const url = new URL(`${this.config.baseURL}/threads/${threadId}`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n await this.fetchWithTimeout<void>(url.toString(), {\n method: \"DELETE\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves messages from a thread\n * @param options - Options for retrieving messages\n * @returns A promise that resolves to an array of messages\n */\n async getMessages(options: GetMessagesOptions): Promise<Message[]> {\n try {\n const url = new URL(\n `${this.config.baseURL}/api/assistants/${this.assistantId}/${options.threadId}/memory`\n );\n\n if (options.limit) {\n url.searchParams.append(\"limit\", options.limit.toString());\n }\n\n if (options.after) {\n url.searchParams.append(\"after\", options.after);\n }\n\n if (options.reverse !== undefined) {\n url.searchParams.append(\"reverse\", options.reverse.toString());\n }\n\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n return await this.fetchWithTimeout<Message[]>(url.toString());\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves agent state\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the agent state\n */\n async getAgentState(threadId: string): Promise<AgentState> {\n try {\n return await this.fetchWithTimeout<AgentState>(\n `/api/assistants/${this.assistantId}/${threadId}/state`\n );\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Gets agent graph visualization\n * @returns A promise that resolves to the graph visualization data\n */\n async getAgentGraph(): Promise<string> {\n try {\n const data = await this.fetchWithTimeout<{ image: string }>(\n `/api/assistants/${this.assistantId}/graph`\n );\n return data.image;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Run agent with options\n * @param options - Options for running the agent\n * @returns A promise that resolves to the run result\n */\n async run(options: RunOptions): Promise<ChatResponse> {\n try {\n const headers: Record<string, string> = {};\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n if (options.streaming) {\n throw new Error(\n \"Streaming without callbacks is not supported. Use chat.stream with callbacks instead.\"\n );\n } else {\n return await this.fetchWithTimeout<any>(\"/api/runs\", {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n assistant_id: this.assistantId,\n thread_id: options.threadId,\n message: options.message,\n files: options.files,\n command: options.command,\n streaming: false,\n background: options.background || false,\n }),\n });\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Stream run results\n * @param options - Options for streaming run results\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n private streamRun(\n options: RunOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): () => void {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...this.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n // Create abort controller for cancellation\n const controller = new AbortController();\n const { signal } = controller;\n\n // Start the streaming request\n (async () => {\n try {\n const { command, threadId, message, files, background, ...rest } =\n options;\n const response = await fetch(`${this.config.baseURL}/api/runs`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n assistant_id: this.assistantId,\n thread_id: threadId,\n message: message,\n files: files,\n command: command,\n streaming: true,\n background: background || false,\n ...rest,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // Decode the chunk and append to buffer\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n // Keep the last potentially incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(line.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n console.error(\"Error parsing SSE data:\", line, error);\n if (onError) {\n onError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n }\n }\n }\n\n // Process any remaining data in the buffer\n if (buffer && buffer.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(buffer.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n console.error(\"Error parsing SSE data:\", buffer, error);\n }\n }\n\n if (onComplete) {\n // Fetch agent state before calling onComplete if enabled\n if (options.enableReturnStateWhenSteamCompleted) {\n try {\n const state = await this.getAgentState(options.threadId);\n onComplete(state);\n } catch (error) {\n // If getting state fails, still call onComplete without state\n onComplete();\n }\n } else {\n // Just call onComplete without state if not enabled\n onComplete();\n }\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n // Request was cancelled, no need to call onError\n return;\n }\n\n if (onError) {\n onError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n })();\n\n // Return a function to cancel the fetch request\n return () => {\n controller.abort();\n };\n }\n\n /**\n * Chat namespace for sending messages and streaming responses\n */\n chat = {\n /**\n * Sends a message to a thread and receives a response\n * @param options - Options for sending a message\n * @returns A promise that resolves to the chat response\n */\n send: async (options: ChatSendOptions): Promise<ChatResponse> => {\n try {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n const { command, threadId, files, ...rest } = options;\n\n // Use the run method to send the message\n const result = await this.run({\n threadId: threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: false,\n command: command,\n files: files,\n ...rest,\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n },\n\n /**\n * Sends a message to a thread and streams the response\n * @param options - Options for streaming a message\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n stream: (\n options: ChatStreamOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): (() => void) => {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the streamRun method to stream the response\n return this.streamRun(\n {\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: true,\n command: options.command,\n background: options.background,\n enableReturnStateWhenSteamCompleted:\n options.enableReturnStateWhenSteamCompleted,\n },\n onEvent,\n onComplete,\n onError\n );\n },\n };\n\n /**\n * Tools namespace for registering and unregistering client-side tools\n */\n tools = {\n /**\n * Registers a client-side tool\n * @param options - Options for registering a tool\n */\n register: (options: RegisterToolOptions): void => {\n if (this.config.transport !== \"ws\") {\n throw new Error(\n \"Client-side tools are only supported with WebSocket transport\"\n );\n }\n this.registeredTools.set(options.name, options);\n },\n\n /**\n * Unregisters a client-side tool\n * @param name - Tool name\n */\n unregister: (name: string): void => {\n this.registeredTools.delete(name);\n },\n };\n}\n","import { Message, MessageChunk } from \"@axiom-lattice/protocols\";\nimport {\n AgentState,\n ApiError,\n AuthenticationError,\n ChatResponse,\n ChatSendOptions,\n ChatStreamOptions,\n ClientConfig,\n CreateThreadOptions,\n GetMessagesOptions,\n ListThreadsOptions,\n NetworkError,\n RegisterToolOptions,\n RunOptions,\n Thread,\n} from \"./types\";\n\n/**\n * WeChat Mini Program client for interacting with the Axiom Lattice Agent Service API\n */\nexport class WeChatClient {\n private config: ClientConfig;\n private assistantId: string;\n private tenantId: string = \"\";\n private registeredTools: Map<string, RegisterToolOptions> = new Map();\n\n /**\n * Creates a new WeChatClient instance\n * @param config - Configuration options for the client\n */\n constructor(config: ClientConfig) {\n this.config = {\n timeout: 30000,\n ...config,\n };\n\n this.assistantId = config.assistantId;\n }\n\n /**\n * Set tenant ID for multi-tenant environments\n * @param tenantId - Tenant identifier\n */\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n }\n\n /**\n * Helper method to make WeChat HTTP requests\n * @private\n */\n private async request<T>(options: {\n url: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n data?: any;\n }): Promise<T> {\n const { url, method, data } = options;\n\n // Build full URL with query parameters if provided\n let fullUrl = `${this.config.baseURL}${url}`;\n\n // Prepare headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n return new Promise<T>((resolve, reject) => {\n wx.request({\n url: fullUrl,\n method,\n data,\n header: headers,\n timeout: this.config.timeout,\n success: (res: any) => {\n const statusCode = res.statusCode;\n\n if (statusCode >= 200 && statusCode < 300) {\n resolve(res.data);\n } else if (statusCode === 401) {\n reject(\n new AuthenticationError(\n res.data?.message || \"Authentication failed\"\n )\n );\n } else {\n reject(\n new ApiError(\n res.data?.message || \"API Error\",\n statusCode,\n res.data\n )\n );\n }\n },\n fail: (err) => {\n reject(new NetworkError(`Request failed: ${err.errMsg}`));\n },\n });\n });\n }\n\n /**\n * Creates a new thread\n * @param options - Options for creating a thread\n * @returns A promise that resolves to the thread ID\n */\n async createThread(options: CreateThreadOptions): Promise<string> {\n try {\n const response = await this.request<{ id: string }>({\n url: \"/threads\",\n method: \"POST\",\n data: {\n ...options,\n assistantId: this.assistantId,\n },\n });\n return response.id;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves thread information\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the thread information\n */\n async getThread(threadId: string): Promise<Thread> {\n try {\n return await this.request<Thread>({\n url: `/threads/${threadId}`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Lists all threads\n * @param options - Options for listing threads\n * @returns A promise that resolves to an array of threads\n */\n async listThreads(options?: ListThreadsOptions): Promise<Thread[]> {\n try {\n const response = await this.request<{ threads: Thread[] }>({\n url: \"/threads\",\n method: \"GET\",\n });\n return response.threads;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Deletes a thread\n * @param threadId - Thread identifier\n * @returns A promise that resolves when the thread is deleted\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n await this.request<void>({\n url: `/threads/${threadId}`,\n method: \"DELETE\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves messages from a thread\n * @param options - Options for retrieving messages\n * @returns A promise that resolves to an array of messages\n */\n async getMessages(options: GetMessagesOptions): Promise<Message[]> {\n try {\n return await this.request<Message[]>({\n url: `/api/assistants/${this.assistantId}/${options.threadId}/memory`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves agent state\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the agent state\n */\n async getAgentState(threadId: string): Promise<AgentState> {\n try {\n return await this.request<AgentState>({\n url: `/api/assistants/${this.assistantId}/${threadId}/state`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Gets agent graph visualization\n * @returns A promise that resolves to the graph visualization data\n */\n async getAgentGraph(): Promise<string> {\n try {\n const response = await this.request<{ image: string }>({\n url: `/api/assistants/${this.assistantId}/graph`,\n method: \"GET\",\n });\n return response.image;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Run agent with options\n * @param options - Options for running the agent\n * @returns A promise that resolves to the run result\n */\n async run(options: RunOptions): Promise<any> {\n try {\n if (options.streaming) {\n throw new Error(\n \"Streaming without callbacks is not supported. Use chat.stream with callbacks instead.\"\n );\n } else {\n return await this.request<any>({\n url: \"/api/runs\",\n method: \"POST\",\n data: {\n assistant_id: this.assistantId,\n thread_id: options.threadId,\n message: options.message,\n files: options.files,\n command: options.command,\n streaming: false,\n background: options.background || false,\n },\n });\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Stream run results using WeChat's downloadFile API\n * @param options - Options for streaming run results\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n private streamRun(\n options: RunOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): () => void {\n // Prepare headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n // Create a task ID to track and potentially abort the request\n const taskId = wx.request({\n url: `${this.config.baseURL}/api/runs`,\n method: \"POST\",\n data: {\n assistant_id: this.assistantId,\n thread_id: options.threadId,\n message: options.message,\n files: options.files,\n command: options.command,\n streaming: true,\n background: options.background || false,\n },\n header: headers,\n responseType: \"text\",\n enableChunked: true,\n success: async () => {\n // This will be called when the connection is established\n // Actual data processing happens in the dataReceived callback\n },\n fail: (err) => {\n if (onError) {\n onError(new Error(`Stream request failed: ${err.errMsg}`));\n }\n },\n complete: async () => {\n if (onComplete) {\n // Fetch agent state before calling onComplete if enabled\n if (options.enableReturnStateWhenSteamCompleted) {\n try {\n const state = await this.getAgentState(options.threadId);\n onComplete(state);\n } catch (error) {\n // If getting state fails, still call onComplete without state\n onComplete();\n }\n } else {\n // Just call onComplete without state if not enabled\n onComplete();\n }\n }\n },\n // Using WeChat's chunked data capability\n dataReceived: (res) => {\n if (!res.data) return;\n\n // Process the raw data line by line\n const textDecoder = new TextDecoder();\n const text = textDecoder.decode(res.data);\n const lines = text.split(\"\\n\");\n\n for (const line of lines) {\n if (line.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(line.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n if (onError) {\n onError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n }\n }\n },\n });\n\n // Return a function to abort the request\n return () => {\n wx.abortRequest({\n requestId: taskId,\n success: () => console.log(\"Stream request aborted\"),\n fail: (err) =>\n console.error(\"Failed to abort stream request:\", err.errMsg),\n });\n };\n }\n\n /**\n * Chat namespace for sending messages and streaming responses\n */\n chat = {\n /**\n * Sends a message to a thread and receives a response\n * @param options - Options for sending a message\n * @returns A promise that resolves to the chat response\n */\n send: async (options: ChatSendOptions): Promise<ChatResponse> => {\n try {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the run method to send the message\n const result = await this.run({\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: false,\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n },\n\n /**\n * Sends a message to a thread and streams the response\n * @param options - Options for streaming a message\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n stream: (\n options: ChatStreamOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): (() => void) => {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the streamRun method to stream the response\n return this.streamRun(\n {\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: true,\n background: options.background,\n enableReturnStateWhenSteamCompleted:\n options.enableReturnStateWhenSteamCompleted,\n },\n onEvent,\n onComplete,\n onError\n );\n },\n };\n\n /**\n * Tools namespace for registering and unregistering client-side tools\n */\n tools = {\n /**\n * Registers a client-side tool\n * @param options - Options for registering a tool\n */\n register: (options: RegisterToolOptions): void => {\n if (this.config.transport !== \"ws\") {\n throw new Error(\n \"Client-side tools are only supported with WebSocket transport\"\n );\n }\n this.registeredTools.set(options.name, options);\n },\n\n /**\n * Unregisters a client-side tool\n * @param name - Tool name\n */\n unregister: (name: string): void => {\n this.registeredTools.delete(name);\n },\n };\n}\n","/**\n * ChunkMessageMerger\n *\n * A utility for handling streaming message chunks and merging them into complete messages.\n */\n\nimport { Message, MessageChunk } from \"@axiom-lattice/protocols\";\n\n/**\n * Creates a simple message merger for handling streaming message chunks\n * @returns An object with methods to push chunks and retrieve merged messages\n */\nexport function createSimpleMessageMerger() {\n let messages: Message[] = [];\n const messageMap = new Map<string, number>();\n\n // Tool call builder: messageId -> index -> build state\n const toolBuilders = new Map<\n string,\n Map<\n number,\n {\n id?: string;\n name?: string;\n args: string; // Accumulated parameter string\n }\n >\n >();\n\n /**\n * Normalizes role string to standard role\n * @param type - Role string from the input\n * @returns Normalized role\n */\n function normalizeRole(type: string): string {\n switch (type) {\n case \"ai\":\n return \"ai\";\n case \"human\":\n case \"user\":\n return \"human\";\n case \"system\":\n return \"system\";\n case \"tool\":\n return \"tool\";\n case \"developer\":\n return \"developer\";\n default:\n return \"ai\";\n }\n }\n\n /**\n * Safely parses JSON string\n * @param str - JSON string to parse\n * @returns Parsed object or original string if parsing fails\n */\n function safeJsonParse(str: string): any {\n try {\n return JSON.parse(str);\n } catch {\n return str; // Return original string if parsing fails\n }\n }\n\n /**\n * Ensures a message exists, creating it if needed\n * @param id - Message ID\n * @param role - Message role\n * @returns The message object\n */\n function ensureMessage(id: string, role: string): any {\n const index = messageMap.get(id);\n if (index !== undefined) {\n return messages[index];\n }\n\n // Create new message\n let newMessage: any;\n switch (role) {\n case \"human\":\n newMessage = { id, role: \"human\", content: \"\" };\n break;\n case \"system\":\n newMessage = { id, role: \"system\", content: \"\" };\n break;\n case \"tool\":\n newMessage = { id, role: \"tool\", content: \"\", tool_call_id: \"\" };\n break;\n case \"developer\":\n newMessage = { id, role: \"developer\", content: \"\" };\n break;\n default:\n newMessage = { id, role: \"ai\", content: \"\" };\n }\n\n messages.push(newMessage);\n messageMap.set(id, messages.length - 1);\n return newMessage;\n }\n\n /**\n * Updates tool calls for a message\n * @param message - Message to update\n */\n function updateToolCalls(message: any) {\n if (message.role !== \"ai\") return;\n\n const builders = toolBuilders.get(message.id);\n if (!builders || builders.size === 0) return;\n\n const toolCalls: any[] = [];\n for (const [index, builder] of Array.from(builders.entries())) {\n if (builder.name && builder.id) {\n // Try to parse arguments as JSON object\n const args = builder.args.trim();\n const parsedArgs = safeJsonParse(args);\n\n // Create ToolCall object\n toolCalls.push({\n id: builder.id,\n name: builder.name,\n args:\n typeof parsedArgs === \"object\" ? parsedArgs : { value: parsedArgs },\n type: \"tool_call\",\n });\n }\n }\n\n // Only set tool_calls if there are any\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n\n /**\n * Initialize messages\n * @param msgs - Initial messages\n */\n function initialMessages(msgs: any[]) {\n // Just store the messages as-is\n messages = msgs;\n }\n\n /**\n * Processes a message chunk\n * @param chunk - Message chunk to process\n */\n function push(chunk: MessageChunk) {\n const role = normalizeRole(chunk.type);\n const message = ensureMessage(chunk.data.id, role);\n\n // Accumulate content\n if (chunk.data.content) {\n message.content = (message.content || \"\") + chunk.data.content;\n }\n\n // Handle tool call ID (for tool messages)\n if (message.role === \"tool\" && chunk.data.tool_call_id) {\n message.tool_call_id = chunk.data.tool_call_id;\n }\n\n // Handle tool call chunks (incremental)\n if (chunk.data.tool_call_chunks && message.role === \"ai\") {\n let builders = toolBuilders.get(message.id);\n if (!builders) {\n builders = new Map();\n toolBuilders.set(message.id, builders);\n }\n\n for (const chunk_item of chunk.data.tool_call_chunks) {\n let builder = builders.get(chunk_item.index);\n if (!builder) {\n builder = { args: \"\" };\n builders.set(chunk_item.index, builder);\n }\n\n if (chunk_item.name) builder.name = chunk_item.name;\n if (chunk_item.id) builder.id = chunk_item.id;\n if (chunk_item.args) builder.args += chunk_item.args;\n }\n\n updateToolCalls(message);\n }\n\n // Handle complete tool calls (overwrite)\n if (chunk.data.tool_calls && message.role === \"ai\") {\n const toolCalls: any[] = chunk.data.tool_calls\n .filter((tc) => tc.name && tc.id)\n .map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n type: \"tool_call\",\n response: tc.response,\n status: \"success\",\n }));\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n\n // Handle tool calls in additional_kwargs\n if (\n chunk.data.additional_kwargs?.tool_calls &&\n message.role === \"ai\" &&\n !message.tool_calls\n ) {\n const toolCalls: any[] = [];\n\n for (const tc of chunk.data.additional_kwargs.tool_calls) {\n if (tc.function?.name && tc.id) {\n // Convert to our format\n const args =\n typeof tc.function.arguments === \"string\"\n ? safeJsonParse(tc.function.arguments)\n : tc.function.arguments || {};\n\n toolCalls.push({\n id: tc.id,\n name: tc.function.name,\n args,\n type: \"tool_call\",\n });\n }\n }\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n }\n\n /**\n * Gets all messages with tool responses merged into tool calls\n * @returns Array of messages with tool responses merged into tool calls\n */\n function getMessages(): any[] {\n // Create a map to store tool responses by their tool_call_id\n const toolResponsesMap: Record<string, any> = {};\n\n // First pass: collect all tool responses\n messages.forEach((message) => {\n if (message.role === \"tool\" && message.tool_call_id) {\n toolResponsesMap[message.tool_call_id] = message;\n }\n });\n\n // Second pass: merge tool responses with their corresponding AI messages\n return messages\n .filter((message) => {\n // Keep all messages except tool messages\n return message.role !== \"tool\";\n })\n .map((message) => {\n if (message.role === \"ai\" && message.tool_calls) {\n // Create a new message object with merged tool responses\n const mergedMessage = { ...message };\n\n // Add tool responses to the corresponding tool calls\n if (mergedMessage.tool_calls) {\n mergedMessage.tool_calls = mergedMessage.tool_calls.map(\n (toolCall: any) => {\n const toolResponse = toolResponsesMap[toolCall.id];\n if (toolResponse) {\n return {\n ...toolCall,\n response: toolResponse.content,\n status: \"success\",\n };\n }\n return toolCall;\n }\n );\n }\n\n return mergedMessage;\n }\n return message;\n });\n }\n\n /**\n * Gets messages without tool calls\n * @returns Array of messages without tool calls\n */\n function getMessagesWithoutToolCalls(): any[] {\n return messages.filter(\n (message) =>\n message.role !== \"tool\" &&\n (message.role !== \"ai\" || !message.tool_calls)\n );\n }\n\n /**\n * Resets the message merger state\n */\n function reset() {\n messages.length = 0;\n messageMap.clear();\n toolBuilders.clear();\n }\n\n return {\n push,\n initialMessages,\n getMessages,\n getMessagesWithoutToolCalls,\n reset,\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/client.ts","../src/wechat-client.ts","../src/ChunkMessageMerger.ts"],"sourcesContent":["/**\n * Core types for the Axiom Lattice Client SDK\n */\n\nimport {\n Message,\n UserMessage,\n AssistantMessage,\n SystemMessage,\n ToolMessage,\n DeveloperMessage,\n MessageChunk,\n} from \"@axiom-lattice/protocols\";\n\n/**\n * Transport method for client-server communication\n * Note: Currently only \"ws\" is used for tool registration\n */\nexport type Transport = \"sse\" | \"ws\";\n\n/**\n * Configuration options for the Client\n */\nexport interface ClientConfig {\n /**\n * Base URL for the API\n */\n baseURL: string;\n\n /**\n * API key for authentication\n */\n apiKey: string;\n\n /**\n * Assistant identifier\n */\n assistantId: string;\n\n /**\n * Transport method (Server-Sent Events or WebSocket)\n */\n transport: Transport;\n\n /**\n * Request timeout in milliseconds (optional, defaults to 30000)\n */\n timeout?: number;\n\n /**\n * Additional headers to include in requests (optional)\n */\n headers?: Record<string, string>;\n\n /**\n * Configuration for retry behavior (optional)\n */\n retry?: RetryConfig;\n}\n\n/**\n * Configuration for retry behavior\n */\nexport interface RetryConfig {\n /**\n * Maximum number of retry attempts\n */\n maxRetries: number;\n\n /**\n * Initial delay between retries in milliseconds\n */\n initialDelayMs: number;\n\n /**\n * Maximum delay between retries in milliseconds\n */\n maxDelayMs: number;\n\n /**\n * Factor to multiply delay by after each retry attempt\n */\n backoffFactor: number;\n}\n\n/**\n * Thread creation options\n */\nexport interface CreateThreadOptions {\n /**\n * Optional metadata for the thread\n */\n metadata?: Record<string, any>;\n}\n\n/**\n * Thread information\n */\nexport interface Thread {\n /**\n * Thread identifier\n */\n id: string;\n\n /**\n * Thread metadata\n */\n metadata?: Record<string, any>;\n\n /**\n * Thread creation timestamp\n */\n createdAt: string;\n}\n\n/**\n * Chat send options\n */\nexport interface ChatSendOptions {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Messages to send\n */\n messages: Message[];\n /**\n * Files to attach (optional)\n */\n files?: any[];\n\n /**\n * Command to execute (optional)\n */\n command?: {\n resume?: {\n action: string;\n data: Record<string, any> & {\n config?: { thread_id?: string; work_log_id?: string };\n };\n message: string;\n };\n update?: any;\n send?: { node: string; input: any };\n };\n}\n\n/**\n * Chat stream options\n */\nexport interface ChatStreamOptions extends ChatSendOptions {\n /**\n * Whether to run in background (optional)\n */\n background?: boolean;\n\n /**\n * Whether to return agent state when stream completes (optional)\n */\n enableReturnStateWhenSteamCompleted?: boolean;\n}\n\n/**\n * Stream callbacks interface\n */\nexport interface StreamCallbacks {\n /**\n * Called when a stream event is received\n */\n onEvent: (event: MessageChunk) => void;\n\n /**\n * Called when the stream completes, with optional agent state\n */\n onComplete?: (state?: AgentState) => void;\n\n /**\n * Called when an error occurs\n */\n onError?: (error: Error) => void;\n}\n\n/**\n * Chat response\n */\nexport interface ChatResponse {\n /**\n * Response messages\n */\n messages: Message[];\n\n /**\n * Trace ID for debugging\n */\n traceId?: string;\n}\n\n/**\n * Tool registration options\n */\nexport interface RegisterToolOptions {\n /**\n * Tool name\n */\n name: string;\n\n /**\n * Tool parameter schema\n */\n schema: object;\n\n /**\n * Tool handler function\n */\n handler: (params: any) => Promise<any>;\n}\n\n/**\n * Get messages options\n */\nexport interface GetMessagesOptions {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Maximum number of messages to return\n */\n limit?: number;\n\n /**\n * Message ID to start from (for pagination)\n */\n after?: string;\n\n /**\n * Whether to return messages in reverse chronological order\n */\n reverse?: boolean;\n}\n\n/**\n * Thread list options\n */\nexport interface ListThreadsOptions {\n /**\n * Maximum number of threads to return\n */\n limit?: number;\n\n /**\n * Offset for pagination\n */\n offset?: number;\n}\n\n/**\n * Run options\n */\nexport type RunOptions = {\n /**\n * Thread identifier\n */\n threadId: string;\n\n /**\n * Message to send\n */\n message: string;\n\n /**\n * Files to attach (optional)\n */\n files?: any[];\n\n /**\n * Command to execute (optional)\n */\n command?: any;\n\n /**\n * Whether to stream the response (optional)\n */\n streaming?: boolean;\n\n /**\n * Whether to run in background (optional)\n */\n background?: boolean;\n\n /**\n * Whether to return agent state when stream completes (optional)\n */\n enableReturnStateWhenSteamCompleted?: boolean;\n} & Record<string, any>;\n\n/**\n * Agent state\n */\nexport interface AgentState {\n values: {\n messages: Message[];\n [key: string]: any;\n };\n tasks: Array<{\n interrupts: Array<{\n value: any;\n }>;\n }>;\n}\n\n/**\n * Custom error classes\n */\nexport class ApiError extends Error {\n constructor(\n message: string,\n public statusCode: number,\n public responseBody?: any\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class NetworkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NetworkError\";\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n","import { Message, MessageChunk } from \"@axiom-lattice/protocols\";\nimport {\n AgentState,\n ApiError,\n AuthenticationError,\n ChatResponse,\n ChatSendOptions,\n ChatStreamOptions,\n ClientConfig,\n CreateThreadOptions,\n GetMessagesOptions,\n ListThreadsOptions,\n NetworkError,\n RegisterToolOptions,\n RunOptions,\n Thread,\n} from \"./types\";\n\n/**\n * Main client class for interacting with the Axiom Lattice Agent Service API\n */\nexport class Client {\n private config: ClientConfig;\n private assistantId: string;\n private tenantId: string = \"\";\n private registeredTools: Map<string, RegisterToolOptions> = new Map();\n private headers: Record<string, string>;\n\n /**\n * Creates a new Client instance\n * @param config - Configuration options for the client\n */\n constructor(config: ClientConfig) {\n this.config = {\n timeout: 300000,\n ...config,\n };\n\n this.assistantId = config.assistantId;\n\n this.headers = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n }\n\n /**\n * Helper method to handle fetch responses and errors\n * @private\n */\n private async handleResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthenticationError(\"Authentication failed\");\n } else {\n const errorData = (await response.json().catch(() => ({}))) as {\n message?: string;\n };\n throw new ApiError(\n errorData.message || \"API Error\",\n response.status,\n errorData\n );\n }\n }\n\n // For 204 No Content responses\n if (response.status === 204) {\n return {} as T;\n }\n\n try {\n return (await response.json()) as T;\n } catch (error) {\n throw new Error(`Failed to parse response: ${error}`);\n }\n }\n\n /**\n * Helper method to make fetch requests\n * @private\n */\n private async fetchWithTimeout<T>(\n url: string,\n options: RequestInit = {}\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const fullUrl = url.startsWith(\"http\")\n ? url\n : `${this.config.baseURL}${url}`;\n\n const response = await fetch(fullUrl, {\n ...options,\n headers: {\n ...this.headers,\n ...(options.headers || {}),\n },\n signal: controller.signal,\n });\n\n return await this.handleResponse<T>(response);\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new NetworkError(\"Request timed out\");\n } else if (\n error instanceof TypeError &&\n error.message.includes(\"fetch\")\n ) {\n throw new NetworkError(\"Network request failed\");\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Set tenant ID for multi-tenant environments\n * @param tenantId - Tenant identifier\n */\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n this.headers[\"x-tenant-id\"] = tenantId;\n }\n\n /**\n * Creates a new thread\n * @param options - Options for creating a thread\n * @returns A promise that resolves to the thread ID\n */\n async createThread(options: CreateThreadOptions): Promise<string> {\n try {\n const data = await this.fetchWithTimeout<{ id: string }>(\"/threads\", {\n method: \"POST\",\n body: JSON.stringify({\n ...options,\n assistantId: this.assistantId,\n }),\n });\n return data.id;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves thread information\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the thread information\n */\n async getThread(threadId: string): Promise<Thread> {\n try {\n const url = new URL(`${this.config.baseURL}/threads/${threadId}`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n return await this.fetchWithTimeout<Thread>(url.toString());\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Lists all threads\n * @param options - Options for listing threads\n * @returns A promise that resolves to an array of threads\n */\n async listThreads(options?: ListThreadsOptions): Promise<Thread[]> {\n try {\n const url = new URL(`${this.config.baseURL}/threads`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n if (options?.limit) {\n url.searchParams.append(\"limit\", options.limit.toString());\n }\n\n if (options?.offset !== undefined) {\n url.searchParams.append(\"offset\", options.offset.toString());\n }\n\n const data = await this.fetchWithTimeout<{ threads: Thread[] }>(\n url.toString()\n );\n return data.threads;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Deletes a thread\n * @param threadId - Thread identifier\n * @returns A promise that resolves when the thread is deleted\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n const url = new URL(`${this.config.baseURL}/threads/${threadId}`);\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n await this.fetchWithTimeout<void>(url.toString(), {\n method: \"DELETE\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves messages from a thread\n * @param options - Options for retrieving messages\n * @returns A promise that resolves to an array of messages\n */\n async getMessages(options: GetMessagesOptions): Promise<Message[]> {\n try {\n const url = new URL(\n `${this.config.baseURL}/api/assistants/${this.assistantId}/${options.threadId}/memory`\n );\n\n if (options.limit) {\n url.searchParams.append(\"limit\", options.limit.toString());\n }\n\n if (options.after) {\n url.searchParams.append(\"after\", options.after);\n }\n\n if (options.reverse !== undefined) {\n url.searchParams.append(\"reverse\", options.reverse.toString());\n }\n\n url.searchParams.append(\"assistantId\", this.assistantId);\n\n return await this.fetchWithTimeout<Message[]>(url.toString());\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves agent state\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the agent state\n */\n async getAgentState(threadId: string): Promise<AgentState> {\n try {\n return await this.fetchWithTimeout<AgentState>(\n `/api/assistants/${this.assistantId}/${threadId}/state`\n );\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Gets agent graph visualization\n * @returns A promise that resolves to the graph visualization data\n */\n async getAgentGraph(): Promise<string> {\n try {\n const data = await this.fetchWithTimeout<{ image: string }>(\n `/api/assistants/${this.assistantId}/graph`\n );\n return data.image;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Run agent with options\n * @param options - Options for running the agent\n * @returns A promise that resolves to the run result\n */\n async run(options: RunOptions): Promise<ChatResponse> {\n try {\n const headers: Record<string, string> = {};\n const { command, threadId, message, files, background, ...rest } =\n options;\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n if (options.streaming) {\n throw new Error(\n \"Streaming without callbacks is not supported. Use chat.stream with callbacks instead.\"\n );\n } else {\n return await this.fetchWithTimeout<any>(\"/api/runs\", {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n assistant_id: this.assistantId,\n thread_id: threadId,\n message: message,\n files: files,\n command: command,\n streaming: false,\n background: background || false,\n ...rest,\n }),\n });\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Stream run results\n * @param options - Options for streaming run results\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n private streamRun(\n options: RunOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): () => void {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...this.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n // Create abort controller for cancellation\n const controller = new AbortController();\n const { signal } = controller;\n\n // Start the streaming request\n (async () => {\n try {\n const { command, threadId, message, files, background, ...rest } =\n options;\n const response = await fetch(`${this.config.baseURL}/api/runs`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n assistant_id: this.assistantId,\n thread_id: threadId,\n message: message,\n files: files,\n command: command,\n streaming: true,\n background: background || false,\n ...rest,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! Status: ${response.status}`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // Decode the chunk and append to buffer\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n // Keep the last potentially incomplete line in the buffer\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(line.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n console.error(\"Error parsing SSE data:\", line, error);\n if (onError) {\n onError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n }\n }\n }\n\n // Process any remaining data in the buffer\n if (buffer && buffer.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(buffer.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n console.error(\"Error parsing SSE data:\", buffer, error);\n }\n }\n\n if (onComplete) {\n // Fetch agent state before calling onComplete if enabled\n if (options.enableReturnStateWhenSteamCompleted) {\n try {\n const state = await this.getAgentState(options.threadId);\n onComplete(state);\n } catch (error) {\n // If getting state fails, still call onComplete without state\n onComplete();\n }\n } else {\n // Just call onComplete without state if not enabled\n onComplete();\n }\n }\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n // Request was cancelled, no need to call onError\n return;\n }\n\n if (onError) {\n onError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n })();\n\n // Return a function to cancel the fetch request\n return () => {\n controller.abort();\n };\n }\n\n /**\n * Chat namespace for sending messages and streaming responses\n */\n chat = {\n /**\n * Sends a message to a thread and receives a response\n * @param options - Options for sending a message\n * @returns A promise that resolves to the chat response\n */\n send: async (options: ChatSendOptions): Promise<ChatResponse> => {\n try {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n const { command, threadId, files, ...rest } = options;\n\n // Use the run method to send the message\n const result = await this.run({\n threadId: threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: false,\n command: command,\n files: files,\n ...rest,\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n },\n\n /**\n * Sends a message to a thread and streams the response\n * @param options - Options for streaming a message\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n stream: (\n options: ChatStreamOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): (() => void) => {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the streamRun method to stream the response\n return this.streamRun(\n {\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: true,\n command: options.command,\n background: options.background,\n enableReturnStateWhenSteamCompleted:\n options.enableReturnStateWhenSteamCompleted,\n },\n onEvent,\n onComplete,\n onError\n );\n },\n };\n\n /**\n * Tools namespace for registering and unregistering client-side tools\n */\n tools = {\n /**\n * Registers a client-side tool\n * @param options - Options for registering a tool\n */\n register: (options: RegisterToolOptions): void => {\n if (this.config.transport !== \"ws\") {\n throw new Error(\n \"Client-side tools are only supported with WebSocket transport\"\n );\n }\n this.registeredTools.set(options.name, options);\n },\n\n /**\n * Unregisters a client-side tool\n * @param name - Tool name\n */\n unregister: (name: string): void => {\n this.registeredTools.delete(name);\n },\n };\n}\n","import { Message, MessageChunk } from \"@axiom-lattice/protocols\";\nimport {\n AgentState,\n ApiError,\n AuthenticationError,\n ChatResponse,\n ChatSendOptions,\n ChatStreamOptions,\n ClientConfig,\n CreateThreadOptions,\n GetMessagesOptions,\n ListThreadsOptions,\n NetworkError,\n RegisterToolOptions,\n RunOptions,\n Thread,\n} from \"./types\";\n\n/**\n * WeChat Mini Program client for interacting with the Axiom Lattice Agent Service API\n */\nexport class WeChatClient {\n private config: ClientConfig;\n private assistantId: string;\n private tenantId: string = \"\";\n private registeredTools: Map<string, RegisterToolOptions> = new Map();\n\n /**\n * Creates a new WeChatClient instance\n * @param config - Configuration options for the client\n */\n constructor(config: ClientConfig) {\n this.config = {\n timeout: 30000,\n ...config,\n };\n\n this.assistantId = config.assistantId;\n }\n\n /**\n * Set tenant ID for multi-tenant environments\n * @param tenantId - Tenant identifier\n */\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n }\n\n /**\n * Helper method to make WeChat HTTP requests\n * @private\n */\n private async request<T>(options: {\n url: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n data?: any;\n }): Promise<T> {\n const { url, method, data } = options;\n\n // Build full URL with query parameters if provided\n let fullUrl = `${this.config.baseURL}${url}`;\n\n // Prepare headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n return new Promise<T>((resolve, reject) => {\n wx.request({\n url: fullUrl,\n method,\n data,\n header: headers,\n timeout: this.config.timeout,\n success: (res: any) => {\n const statusCode = res.statusCode;\n\n if (statusCode >= 200 && statusCode < 300) {\n resolve(res.data);\n } else if (statusCode === 401) {\n reject(\n new AuthenticationError(\n res.data?.message || \"Authentication failed\"\n )\n );\n } else {\n reject(\n new ApiError(\n res.data?.message || \"API Error\",\n statusCode,\n res.data\n )\n );\n }\n },\n fail: (err) => {\n reject(new NetworkError(`Request failed: ${err.errMsg}`));\n },\n });\n });\n }\n\n /**\n * Creates a new thread\n * @param options - Options for creating a thread\n * @returns A promise that resolves to the thread ID\n */\n async createThread(options: CreateThreadOptions): Promise<string> {\n try {\n const response = await this.request<{ id: string }>({\n url: \"/threads\",\n method: \"POST\",\n data: {\n ...options,\n assistantId: this.assistantId,\n },\n });\n return response.id;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves thread information\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the thread information\n */\n async getThread(threadId: string): Promise<Thread> {\n try {\n return await this.request<Thread>({\n url: `/threads/${threadId}`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Lists all threads\n * @param options - Options for listing threads\n * @returns A promise that resolves to an array of threads\n */\n async listThreads(options?: ListThreadsOptions): Promise<Thread[]> {\n try {\n const response = await this.request<{ threads: Thread[] }>({\n url: \"/threads\",\n method: \"GET\",\n });\n return response.threads;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Deletes a thread\n * @param threadId - Thread identifier\n * @returns A promise that resolves when the thread is deleted\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n await this.request<void>({\n url: `/threads/${threadId}`,\n method: \"DELETE\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves messages from a thread\n * @param options - Options for retrieving messages\n * @returns A promise that resolves to an array of messages\n */\n async getMessages(options: GetMessagesOptions): Promise<Message[]> {\n try {\n return await this.request<Message[]>({\n url: `/api/assistants/${this.assistantId}/${options.threadId}/memory`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Retrieves agent state\n * @param threadId - Thread identifier\n * @returns A promise that resolves to the agent state\n */\n async getAgentState(threadId: string): Promise<AgentState> {\n try {\n return await this.request<AgentState>({\n url: `/api/assistants/${this.assistantId}/${threadId}/state`,\n method: \"GET\",\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Gets agent graph visualization\n * @returns A promise that resolves to the graph visualization data\n */\n async getAgentGraph(): Promise<string> {\n try {\n const response = await this.request<{ image: string }>({\n url: `/api/assistants/${this.assistantId}/graph`,\n method: \"GET\",\n });\n return response.image;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Run agent with options\n * @param options - Options for running the agent\n * @returns A promise that resolves to the run result\n */\n async run(options: RunOptions): Promise<any> {\n try {\n if (options.streaming) {\n throw new Error(\n \"Streaming without callbacks is not supported. Use chat.stream with callbacks instead.\"\n );\n } else {\n return await this.request<any>({\n url: \"/api/runs\",\n method: \"POST\",\n data: {\n assistant_id: this.assistantId,\n thread_id: options.threadId,\n message: options.message,\n files: options.files,\n command: options.command,\n streaming: false,\n background: options.background || false,\n },\n });\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Stream run results using WeChat's downloadFile API\n * @param options - Options for streaming run results\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n private streamRun(\n options: RunOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): () => void {\n // Prepare headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n ...this.config.headers,\n };\n\n if (this.tenantId) {\n headers[\"x-tenant-id\"] = this.tenantId;\n }\n\n // Create a task ID to track and potentially abort the request\n const taskId = wx.request({\n url: `${this.config.baseURL}/api/runs`,\n method: \"POST\",\n data: {\n assistant_id: this.assistantId,\n thread_id: options.threadId,\n message: options.message,\n files: options.files,\n command: options.command,\n streaming: true,\n background: options.background || false,\n },\n header: headers,\n responseType: \"text\",\n enableChunked: true,\n success: async () => {\n // This will be called when the connection is established\n // Actual data processing happens in the dataReceived callback\n },\n fail: (err) => {\n if (onError) {\n onError(new Error(`Stream request failed: ${err.errMsg}`));\n }\n },\n complete: async () => {\n if (onComplete) {\n // Fetch agent state before calling onComplete if enabled\n if (options.enableReturnStateWhenSteamCompleted) {\n try {\n const state = await this.getAgentState(options.threadId);\n onComplete(state);\n } catch (error) {\n // If getting state fails, still call onComplete without state\n onComplete();\n }\n } else {\n // Just call onComplete without state if not enabled\n onComplete();\n }\n }\n },\n // Using WeChat's chunked data capability\n dataReceived: (res) => {\n if (!res.data) return;\n\n // Process the raw data line by line\n const textDecoder = new TextDecoder();\n const text = textDecoder.decode(res.data);\n const lines = text.split(\"\\n\");\n\n for (const line of lines) {\n if (line.trim().startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(line.trim().slice(6));\n onEvent(eventData);\n } catch (error) {\n if (onError) {\n onError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n }\n }\n },\n });\n\n // Return a function to abort the request\n return () => {\n wx.abortRequest({\n requestId: taskId,\n success: () => console.log(\"Stream request aborted\"),\n fail: (err) =>\n console.error(\"Failed to abort stream request:\", err.errMsg),\n });\n };\n }\n\n /**\n * Chat namespace for sending messages and streaming responses\n */\n chat = {\n /**\n * Sends a message to a thread and receives a response\n * @param options - Options for sending a message\n * @returns A promise that resolves to the chat response\n */\n send: async (options: ChatSendOptions): Promise<ChatResponse> => {\n try {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the run method to send the message\n const result = await this.run({\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: false,\n });\n\n return result;\n } catch (error) {\n throw error;\n }\n },\n\n /**\n * Sends a message to a thread and streams the response\n * @param options - Options for streaming a message\n * @param onEvent - Callback function that receives stream events\n * @param onComplete - Optional callback function called when streaming completes\n * @param onError - Optional callback function called when an error occurs\n * @returns A function that can be called to stop the stream\n */\n stream: (\n options: ChatStreamOptions,\n onEvent: (event: MessageChunk) => void,\n onComplete?: (state?: AgentState) => void,\n onError?: (error: Error) => void\n ): (() => void) => {\n // Extract the message from the messages array (assuming the last message is the one to send)\n const message = options.messages[options.messages.length - 1];\n\n // Use the streamRun method to stream the response\n return this.streamRun(\n {\n threadId: options.threadId,\n message:\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content),\n streaming: true,\n background: options.background,\n enableReturnStateWhenSteamCompleted:\n options.enableReturnStateWhenSteamCompleted,\n },\n onEvent,\n onComplete,\n onError\n );\n },\n };\n\n /**\n * Tools namespace for registering and unregistering client-side tools\n */\n tools = {\n /**\n * Registers a client-side tool\n * @param options - Options for registering a tool\n */\n register: (options: RegisterToolOptions): void => {\n if (this.config.transport !== \"ws\") {\n throw new Error(\n \"Client-side tools are only supported with WebSocket transport\"\n );\n }\n this.registeredTools.set(options.name, options);\n },\n\n /**\n * Unregisters a client-side tool\n * @param name - Tool name\n */\n unregister: (name: string): void => {\n this.registeredTools.delete(name);\n },\n };\n}\n","/**\n * ChunkMessageMerger\n *\n * A utility for handling streaming message chunks and merging them into complete messages.\n */\n\nimport { Message, MessageChunk } from \"@axiom-lattice/protocols\";\n\n/**\n * Creates a simple message merger for handling streaming message chunks\n * @returns An object with methods to push chunks and retrieve merged messages\n */\nexport function createSimpleMessageMerger() {\n let messages: Message[] = [];\n const messageMap = new Map<string, number>();\n\n // Tool call builder: messageId -> index -> build state\n const toolBuilders = new Map<\n string,\n Map<\n number,\n {\n id?: string;\n name?: string;\n args: string; // Accumulated parameter string\n }\n >\n >();\n\n /**\n * Normalizes role string to standard role\n * @param type - Role string from the input\n * @returns Normalized role\n */\n function normalizeRole(type: string): string {\n switch (type) {\n case \"ai\":\n return \"ai\";\n case \"human\":\n case \"user\":\n return \"human\";\n case \"system\":\n return \"system\";\n case \"tool\":\n return \"tool\";\n case \"developer\":\n return \"developer\";\n default:\n return \"ai\";\n }\n }\n\n /**\n * Safely parses JSON string\n * @param str - JSON string to parse\n * @returns Parsed object or original string if parsing fails\n */\n function safeJsonParse(str: string): any {\n try {\n return JSON.parse(str);\n } catch {\n return str; // Return original string if parsing fails\n }\n }\n\n /**\n * Ensures a message exists, creating it if needed\n * @param id - Message ID\n * @param role - Message role\n * @returns The message object\n */\n function ensureMessage(id: string, role: string): any {\n const index = messageMap.get(id);\n if (index !== undefined) {\n return messages[index];\n }\n\n // Create new message\n let newMessage: any;\n switch (role) {\n case \"human\":\n newMessage = { id, role: \"human\", content: \"\" };\n break;\n case \"system\":\n newMessage = { id, role: \"system\", content: \"\" };\n break;\n case \"tool\":\n newMessage = { id, role: \"tool\", content: \"\", tool_call_id: \"\" };\n break;\n case \"developer\":\n newMessage = { id, role: \"developer\", content: \"\" };\n break;\n default:\n newMessage = { id, role: \"ai\", content: \"\" };\n }\n\n messages.push(newMessage);\n messageMap.set(id, messages.length - 1);\n return newMessage;\n }\n\n /**\n * Updates tool calls for a message\n * @param message - Message to update\n */\n function updateToolCalls(message: any) {\n if (message.role !== \"ai\") return;\n\n const builders = toolBuilders.get(message.id);\n if (!builders || builders.size === 0) return;\n\n const toolCalls: any[] = [];\n for (const [index, builder] of Array.from(builders.entries())) {\n if (builder.name && builder.id) {\n // Try to parse arguments as JSON object\n const args = builder.args.trim();\n const parsedArgs = safeJsonParse(args);\n\n // Create ToolCall object\n toolCalls.push({\n id: builder.id,\n name: builder.name,\n args:\n typeof parsedArgs === \"object\" ? parsedArgs : { value: parsedArgs },\n type: \"tool_call\",\n });\n }\n }\n\n // Only set tool_calls if there are any\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n\n /**\n * Initialize messages\n * @param msgs - Initial messages\n */\n function initialMessages(msgs: any[]) {\n // Just store the messages as-is\n messages = msgs;\n }\n\n /**\n * Processes a message chunk\n * @param chunk - Message chunk to process\n */\n function push(chunk: MessageChunk) {\n const role = normalizeRole(chunk.type);\n const message = ensureMessage(chunk.data.id, role);\n\n // Accumulate content\n if (chunk.data.content) {\n message.content = (message.content || \"\") + chunk.data.content;\n }\n\n // Handle tool call ID (for tool messages)\n if (message.role === \"tool\" && chunk.data.tool_call_id) {\n message.tool_call_id = chunk.data.tool_call_id;\n }\n\n // Handle tool call chunks (incremental)\n if (chunk.data.tool_call_chunks && message.role === \"ai\") {\n let builders = toolBuilders.get(message.id);\n if (!builders) {\n builders = new Map();\n toolBuilders.set(message.id, builders);\n }\n\n for (const chunk_item of chunk.data.tool_call_chunks) {\n let builder = builders.get(chunk_item.index);\n if (!builder) {\n builder = { args: \"\" };\n builders.set(chunk_item.index, builder);\n }\n\n if (chunk_item.name) builder.name = chunk_item.name;\n if (chunk_item.id) builder.id = chunk_item.id;\n if (chunk_item.args) builder.args += chunk_item.args;\n }\n\n updateToolCalls(message);\n }\n\n // Handle complete tool calls (overwrite)\n if (chunk.data.tool_calls && message.role === \"ai\") {\n const toolCalls: any[] = chunk.data.tool_calls\n .filter((tc) => tc.name && tc.id)\n .map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n type: \"tool_call\",\n response: tc.response,\n status: \"success\",\n }));\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n\n // Handle tool calls in additional_kwargs\n if (\n chunk.data.additional_kwargs?.tool_calls &&\n message.role === \"ai\" &&\n !message.tool_calls\n ) {\n const toolCalls: any[] = [];\n\n for (const tc of chunk.data.additional_kwargs.tool_calls) {\n if (tc.function?.name && tc.id) {\n // Convert to our format\n const args =\n typeof tc.function.arguments === \"string\"\n ? safeJsonParse(tc.function.arguments)\n : tc.function.arguments || {};\n\n toolCalls.push({\n id: tc.id,\n name: tc.function.name,\n args,\n type: \"tool_call\",\n });\n }\n }\n\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n }\n }\n }\n\n /**\n * Gets all messages with tool responses merged into tool calls\n * @returns Array of messages with tool responses merged into tool calls\n */\n function getMessages(): any[] {\n // Create a map to store tool responses by their tool_call_id\n const toolResponsesMap: Record<string, any> = {};\n\n // First pass: collect all tool responses\n messages.forEach((message) => {\n if (message.role === \"tool\" && message.tool_call_id) {\n toolResponsesMap[message.tool_call_id] = message;\n }\n });\n\n // Second pass: merge tool responses with their corresponding AI messages\n return messages\n .filter((message) => {\n // Keep all messages except tool messages\n return message.role !== \"tool\";\n })\n .map((message) => {\n if (message.role === \"ai\" && message.tool_calls) {\n // Create a new message object with merged tool responses\n const mergedMessage = { ...message };\n\n // Add tool responses to the corresponding tool calls\n if (mergedMessage.tool_calls) {\n mergedMessage.tool_calls = mergedMessage.tool_calls.map(\n (toolCall: any) => {\n const toolResponse = toolResponsesMap[toolCall.id];\n if (toolResponse) {\n return {\n ...toolCall,\n response: toolResponse.content,\n status: \"success\",\n };\n }\n return toolCall;\n }\n );\n }\n\n return mergedMessage;\n }\n return message;\n });\n }\n\n /**\n * Gets messages without tool calls\n * @returns Array of messages without tool calls\n */\n function getMessagesWithoutToolCalls(): any[] {\n return messages.filter(\n (message) =>\n message.role !== \"tool\" &&\n (message.role !== \"ai\" || !message.tool_calls)\n );\n }\n\n /**\n * Resets the message merger state\n */\n function reset() {\n messages.length = 0;\n messageMap.clear();\n toolBuilders.clear();\n }\n\n return {\n push,\n initialMessages,\n getMessages,\n getMessagesWithoutToolCalls,\n reset,\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axiom-lattice/client-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.41",
|
|
4
4
|
"description": "TypeScript client SDK for interacting with the Agent Service API",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"typescript": "^5.0.3"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@axiom-lattice/protocols": "1.0.
|
|
33
|
+
"@axiom-lattice/protocols": "1.0.41"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "tsup src/index.ts --format cjs,esm --dts --sourcemap",
|