@amaster.ai/copilot-client 1.0.0-beta.4 → 1.0.0-beta.6

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.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var sdk=require('@a2a-js/sdk'),eventsourceParser=require('eventsource-parser'),httpClient=require('@amaster.ai/http-client');function c(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():typeof crypto<"u"&&typeof crypto.getRandomValues=="function"?"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,s=>{let n=(crypto.getRandomValues(new Uint8Array(1))[0]??0)%16;return (s==="x"?n:n&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,s=>{let e=Math.random()*16|0;return (s==="x"?e:e&3|8).toString(16)})}function h(){if(typeof window>"u")return null;try{let s=window.location.href,e=/\/app\/([\da-f-]+)(?:\/|$)/.exec(s);if(e&&e[1])return e[1];let n=window.location.hostname,t=/^([\da-f-]+)(?:-[^.]+)?\.amaster\.(?:local|ai)$/.exec(n);return t&&t[1]?t[1]:null}catch{return null}}async function*d(s){if(!s.body)return;let e=s.body.getReader(),n=new TextDecoder,t=[],a=eventsourceParser.createParser({onEvent:r=>{try{t.push(JSON.parse(r.data));}catch{}}});try{for(;;){let{done:r,value:u}=await e.read();if(r)break;for(a.feed(n.decode(u,{stream:!0}));t.length>0;){let o=t.shift();o&&(yield o);}}}finally{e.releaseLock();}}function f(s){if("error"in s)return "";let e=s.result;if(!e)return "";if("kind"in e&&e.kind==="status-update"){let n=e.status?.message?.parts;return n?n.filter(t=>t.kind==="text").map(t=>t.text).join(""):""}return ""}function k(s){if("error"in s)return null;let e=s.result;return e&&"kind"in e&&e.kind==="status-update"?{taskId:e.taskId,text:f(s),status:e.status.state,isFinal:e.final??false}:null}function y(s=httpClient.createHttpClient()){let e="/api/proxy/builtin/platform/copilot",n={getAgentCard(){return s.request({url:`${e}/${sdk.AGENT_CARD_PATH}`,method:"GET"})},sendMessage(t){return s.request({url:e,method:"POST",data:t})},async*sendMessageStream(t){try{let a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(t)});if(!a.ok)throw new Error(`Stream request failed: ${a.statusText}`);yield*d(a);}catch{}},cancelTask(t){return s.request({url:e,method:"POST",data:t})},getTask(t){return s.request({url:e,method:"POST",data:t})},async*resubscribeTask(t){try{let a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(t)});if(!a.ok)throw new Error(`Stream request failed: ${a.statusText}`);yield*d(a);}catch{}},async*chat(t,a={}){let{taskId:r}=a,u=t.find(i=>i.role==="system"),o=t.filter(i=>i.role!=="system"),p=o[o.length-1],x={jsonrpc:"2.0",id:c(),method:"message/stream",params:{message:{contextId:h()||c(),kind:"message",messageId:c(),role:"user",parts:[{kind:"text",text:p?.content??""}],...r&&{taskId:r},...u&&{metadata:{systemPrompt:u.content}}}}};for await(let i of this.sendMessageStream(x)){let l=k(i);l&&(yield l);}},cancelChat(t){let a={jsonrpc:"2.0",id:c(),method:"tasks/cancel",params:{id:t}};return this.cancelTask(a)},getChatStatus(t){let a={jsonrpc:"2.0",id:c(),method:"tasks/get",params:{id:t}};return this.getTask(a)}};return {chat:n.chat.bind(n),cancelChat:n.cancelChat.bind(n),getChatStatus:n.getChatStatus.bind(n)}}exports.createCopilotClient=y;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var sdk=require('@a2a-js/sdk'),eventsourceParser=require('eventsource-parser'),httpClient=require('@amaster.ai/http-client');function c(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():typeof crypto<"u"&&typeof crypto.getRandomValues=="function"?"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,s=>{let n=(crypto.getRandomValues(new Uint8Array(1))[0]??0)%16;return (s==="x"?n:n&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,s=>{let e=Math.random()*16|0;return (s==="x"?e:e&3|8).toString(16)})}function h(){if(typeof window>"u")return null;try{let s=window.location.href,e=/\/app\/([\da-f-]+)(?:\/|$)/.exec(s);if(e&&e[1])return e[1];let n=window.location.hostname,t=/^([\da-f-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai)$/.exec(n);return t&&t[1]?t[1]:null}catch{return null}}async function*d(s){if(!s.body)return;let e=s.body.getReader(),n=new TextDecoder,t=[],a=eventsourceParser.createParser({onEvent:r=>{try{t.push(JSON.parse(r.data));}catch{}}});try{for(;;){let{done:r,value:u}=await e.read();if(r)break;for(a.feed(n.decode(u,{stream:!0}));t.length>0;){let o=t.shift();o&&(yield o);}}}finally{e.releaseLock();}}function f(s){if("error"in s)return "";let e=s.result;if(!e)return "";if("kind"in e&&e.kind==="status-update"){let n=e.status?.message?.parts;return n?n.filter(t=>t.kind==="text").map(t=>t.text).join(""):""}return ""}function k(s){if("error"in s)return null;let e=s.result;return e&&"kind"in e&&e.kind==="status-update"?{taskId:e.taskId,text:f(s),status:e.status.state,isFinal:e.final??false}:null}function y(s=httpClient.createHttpClient()){let e="/api/proxy/builtin/platform/copilot",n={getAgentCard(){return s.request({url:`${e}/${sdk.AGENT_CARD_PATH}`,method:"GET"})},sendMessage(t){return s.request({url:e,method:"POST",data:t})},async*sendMessageStream(t){try{let a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(t)});if(!a.ok)throw new Error(`Stream request failed: ${a.statusText}`);yield*d(a);}catch{}},cancelTask(t){return s.request({url:e,method:"POST",data:t})},getTask(t){return s.request({url:e,method:"POST",data:t})},async*resubscribeTask(t){try{let a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(t)});if(!a.ok)throw new Error(`Stream request failed: ${a.statusText}`);yield*d(a);}catch{}},async*chat(t,a={}){let{taskId:r}=a,u=t.find(i=>i.role==="system"),o=t.filter(i=>i.role!=="system"),p=o[o.length-1],x={jsonrpc:"2.0",id:c(),method:"message/stream",params:{message:{contextId:h()||c(),kind:"message",messageId:c(),role:"user",parts:[{kind:"text",text:p?.content??""}],...r&&{taskId:r},...u&&{metadata:{systemPrompt:u.content}}}}};for await(let i of this.sendMessageStream(x)){let l=k(i);l&&(yield l);}},cancelChat(t){let a={jsonrpc:"2.0",id:c(),method:"tasks/cancel",params:{id:t}};return this.cancelTask(a)},getChatStatus(t){let a={jsonrpc:"2.0",id:c(),method:"tasks/get",params:{id:t}};return this.getTask(a)}};return {chat:n.chat.bind(n),cancelChat:n.cancelChat.bind(n),getChatStatus:n.getChatStatus.bind(n)}}exports.createCopilotClient=y;//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/copilot-client.ts"],"names":["generateUUID","c","r","extractAppIdFromUrl","url","pathMatch","hostname","domainMatch","streamSSEResponse","response","reader","decoder","queue","parser","createParser","event","done","value","item","extractTextFromResponse","result","parts","part","parseChunk","createCopilotClient","http","createHttpClient","baseUrl","internal","AGENT_CARD_PATH","request","messages","options","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","chunk"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n AgentCard,\n CancelTaskRequest,\n CancelTaskResponse,\n GetTaskRequest,\n GetTaskResponse,\n SendMessageRequest,\n SendMessageResponse,\n SendStreamingMessageRequest,\n SendStreamingMessageResponse,\n TaskResubscriptionRequest,\n TaskState,\n} from \"@a2a-js/sdk\";\nimport { AGENT_CARD_PATH } from \"@a2a-js/sdk\";\nimport { createParser } from \"eventsource-parser\";\nimport { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\n\n// ============ UUID Generator with fallback ============\n\n/**\n * Generate a UUID v4 with better browser compatibility\n * Falls back to crypto.getRandomValues if crypto.randomUUID is not available\n */\nfunction generateUUID(): string {\n // Try using crypto.randomUUID if available (modern browsers)\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n // Fallback: use crypto.getRandomValues (better compatibility)\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const randomValues = crypto.getRandomValues(new Uint8Array(1));\n const r = (randomValues[0] ?? 0) % 16;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Extract app_id from current page URL or domain\n * Method 1: From URL path - /app/{app_id}/...\n * Method 2: From domain (subdomain) - {app_id}-{env}.amaster.local\n */\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n try {\n // Method 1: Try to extract from URL path first\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-f-]+)(?:\\/|$)/.exec(url);\n if (pathMatch && pathMatch[1]) {\n return pathMatch[1];\n }\n\n // Method 2: Try to extract from domain (subdomain)\n const hostname = window.location.hostname;\n const domainMatch = /^([\\da-f-]+)(?:-[^.]+)?\\.amaster\\.(?:local|ai)$/.exec(hostname);\n if (domainMatch && domainMatch[1]) {\n return domainMatch[1];\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n// ============ Simplified API Types ============\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ChatOptions {\n taskId?: string;\n}\n\nexport interface ChatChunk {\n taskId: string;\n text: string;\n status: TaskState;\n isFinal: boolean | undefined;\n}\n\n// ============ Client Types ============\n\n// Internal client with all A2A methods\ntype InternalCopilotClient = {\n getAgentCard(): Promise<ClientResult<AgentCard>>;\n sendMessage(request: SendMessageRequest): Promise<ClientResult<SendMessageResponse>>;\n sendMessageStream(\n request: SendStreamingMessageRequest\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n cancelTask(request: CancelTaskRequest): Promise<ClientResult<CancelTaskResponse>>;\n getTask(request: GetTaskRequest): Promise<ClientResult<GetTaskResponse>>;\n resubscribeTask(\n request: TaskResubscriptionRequest\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ChatChunk, void, unknown>;\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\n// Public client with only simplified API\nexport type CopilotClient = {\n chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ChatChunk, void, unknown>;\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\nasync function* streamSSEResponse(\n response: Response\n): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n const queue: SendStreamingMessageResponse[] = [];\n\n const parser = createParser({\n onEvent: (event) => {\n try {\n queue.push(JSON.parse(event.data));\n } catch {\n // Ignore parse errors for malformed SSE data\n }\n },\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n parser.feed(decoder.decode(value, { stream: true }));\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n yield item;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction extractTextFromResponse(response: SendStreamingMessageResponse): string {\n if (\"error\" in response) {\n return \"\";\n }\n const result = response.result;\n if (!result) {\n return \"\";\n }\n\n // TaskStatusUpdateEvent has kind: 'status-update'\n if (\"kind\" in result && result.kind === \"status-update\") {\n const parts = result.status?.message?.parts;\n if (!parts) {\n return \"\";\n }\n return parts\n .filter((part): part is { kind: \"text\"; text: string } => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\");\n }\n return \"\";\n}\n\nfunction parseChunk(response: SendStreamingMessageResponse): ChatChunk | null {\n if (\"error\" in response) {\n return null;\n }\n const result = response.result;\n if (!result) {\n return null;\n }\n\n // TaskStatusUpdateEvent has kind: 'status-update'\n if (\"kind\" in result && result.kind === \"status-update\") {\n return {\n taskId: result.taskId,\n text: extractTextFromResponse(response),\n status: result.status.state,\n isFinal: result.final ?? false,\n };\n }\n return null;\n}\n\nexport function createCopilotClient(http: HttpClient = createHttpClient()): CopilotClient {\n const baseUrl = \"/api/proxy/builtin/platform/copilot\";\n\n const internal: InternalCopilotClient = {\n getAgentCard() {\n return http.request<AgentCard>({\n url: `${baseUrl}/${AGENT_CARD_PATH}`,\n method: \"GET\",\n });\n },\n\n sendMessage(request) {\n return http.request<SendMessageResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n async *sendMessageStream(request) {\n try {\n const response = await fetch(baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText}`);\n }\n\n yield* streamSSEResponse(response);\n } catch {\n // Ignore stream errors - caller should handle connection issues\n }\n },\n\n cancelTask(request) {\n return http.request<CancelTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n getTask(request) {\n return http.request<GetTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n async *resubscribeTask(request) {\n try {\n const response = await fetch(baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText}`);\n }\n\n yield* streamSSEResponse(response);\n } catch {\n // Ignore resubscribe errors - caller should handle reconnection\n }\n },\n\n // ============ Simplified API Implementation ============\n\n async *chat(messages, options = {}) {\n const { taskId } = options;\n\n const systemMsg = messages.find((m) => m.role === \"system\");\n const nonSystemMsgs = messages.filter((m) => m.role !== \"system\");\n const lastUserMsg = nonSystemMsgs[nonSystemMsgs.length - 1];\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId: extractAppIdFromUrl() || generateUUID(),\n kind: \"message\",\n messageId: generateUUID(),\n role: \"user\",\n parts: [{ kind: \"text\", text: lastUserMsg?.content ?? \"\" }],\n ...(taskId && { taskId }),\n ...(systemMsg && {\n metadata: { systemPrompt: systemMsg.content },\n }),\n },\n },\n };\n\n for await (const response of this.sendMessageStream(request)) {\n const chunk = parseChunk(response);\n if (chunk) {\n yield chunk;\n }\n }\n },\n\n cancelChat(taskId) {\n const request: CancelTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/cancel\",\n params: { id: taskId },\n };\n return this.cancelTask(request);\n },\n\n getChatStatus(taskId) {\n const request: GetTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/get\",\n params: { id: taskId },\n };\n return this.getTask(request);\n },\n };\n\n // Return only the public API\n return {\n chat: internal.chat.bind(internal),\n cancelChat: internal.cancelChat.bind(internal),\n getChatStatus: internal.getChatStatus.bind(internal),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/copilot-client.ts"],"names":["generateUUID","c","r","extractAppIdFromUrl","url","pathMatch","hostname","domainMatch","streamSSEResponse","response","reader","decoder","queue","parser","createParser","event","done","value","item","extractTextFromResponse","result","parts","part","parseChunk","createCopilotClient","http","createHttpClient","baseUrl","internal","AGENT_CARD_PATH","request","messages","options","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","chunk"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n AgentCard,\n CancelTaskRequest,\n CancelTaskResponse,\n GetTaskRequest,\n GetTaskResponse,\n SendMessageRequest,\n SendMessageResponse,\n SendStreamingMessageRequest,\n SendStreamingMessageResponse,\n TaskResubscriptionRequest,\n TaskState,\n} from \"@a2a-js/sdk\";\nimport { AGENT_CARD_PATH } from \"@a2a-js/sdk\";\nimport { createParser } from \"eventsource-parser\";\nimport { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\n\n// ============ UUID Generator with fallback ============\n\n/**\n * Generate a UUID v4 with better browser compatibility\n * Falls back to crypto.getRandomValues if crypto.randomUUID is not available\n */\nfunction generateUUID(): string {\n // Try using crypto.randomUUID if available (modern browsers)\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n // Fallback: use crypto.getRandomValues (better compatibility)\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const randomValues = crypto.getRandomValues(new Uint8Array(1));\n const r = (randomValues[0] ?? 0) % 16;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Extract app_id from current page URL or domain\n * Method 1: From URL path - /app/{app_id}/...\n * Method 2: From domain (subdomain) - {app_id}-{env}.amaster.local\n */\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n try {\n // Method 1: Try to extract from URL path first\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-f-]+)(?:\\/|$)/.exec(url);\n if (pathMatch && pathMatch[1]) {\n return pathMatch[1];\n }\n\n // Method 2: Try to extract from domain (subdomain)\n // Matches patterns like: {app_id}-{env}.{domain}.{tld}\n // Examples: abc123-dev.amaster.ai, abc123-prod.appok.ai, abc123.amaster.local\n const hostname = window.location.hostname;\n const domainMatch = /^([\\da-f-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai)$/.exec(hostname);\n if (domainMatch && domainMatch[1]) {\n return domainMatch[1];\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n// ============ Simplified API Types ============\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ChatOptions {\n taskId?: string;\n}\n\nexport interface ChatChunk {\n taskId: string;\n text: string;\n status: TaskState;\n isFinal: boolean | undefined;\n}\n\n// ============ Client Types ============\n\n// Internal client with all A2A methods\ntype InternalCopilotClient = {\n getAgentCard(): Promise<ClientResult<AgentCard>>;\n sendMessage(request: SendMessageRequest): Promise<ClientResult<SendMessageResponse>>;\n sendMessageStream(\n request: SendStreamingMessageRequest\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n cancelTask(request: CancelTaskRequest): Promise<ClientResult<CancelTaskResponse>>;\n getTask(request: GetTaskRequest): Promise<ClientResult<GetTaskResponse>>;\n resubscribeTask(\n request: TaskResubscriptionRequest\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ChatChunk, void, unknown>;\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\n// Public client with only simplified API\nexport type CopilotClient = {\n chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ChatChunk, void, unknown>;\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\nasync function* streamSSEResponse(\n response: Response\n): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n const queue: SendStreamingMessageResponse[] = [];\n\n const parser = createParser({\n onEvent: (event) => {\n try {\n queue.push(JSON.parse(event.data));\n } catch {\n // Ignore parse errors for malformed SSE data\n }\n },\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n parser.feed(decoder.decode(value, { stream: true }));\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n yield item;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction extractTextFromResponse(response: SendStreamingMessageResponse): string {\n if (\"error\" in response) {\n return \"\";\n }\n const result = response.result;\n if (!result) {\n return \"\";\n }\n\n // TaskStatusUpdateEvent has kind: 'status-update'\n if (\"kind\" in result && result.kind === \"status-update\") {\n const parts = result.status?.message?.parts;\n if (!parts) {\n return \"\";\n }\n return parts\n .filter((part): part is { kind: \"text\"; text: string } => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\");\n }\n return \"\";\n}\n\nfunction parseChunk(response: SendStreamingMessageResponse): ChatChunk | null {\n if (\"error\" in response) {\n return null;\n }\n const result = response.result;\n if (!result) {\n return null;\n }\n\n // TaskStatusUpdateEvent has kind: 'status-update'\n if (\"kind\" in result && result.kind === \"status-update\") {\n return {\n taskId: result.taskId,\n text: extractTextFromResponse(response),\n status: result.status.state,\n isFinal: result.final ?? false,\n };\n }\n return null;\n}\n\nexport function createCopilotClient(http: HttpClient = createHttpClient()): CopilotClient {\n const baseUrl = \"/api/proxy/builtin/platform/copilot\";\n\n const internal: InternalCopilotClient = {\n getAgentCard() {\n return http.request<AgentCard>({\n url: `${baseUrl}/${AGENT_CARD_PATH}`,\n method: \"GET\",\n });\n },\n\n sendMessage(request) {\n return http.request<SendMessageResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n async *sendMessageStream(request) {\n try {\n const response = await fetch(baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText}`);\n }\n\n yield* streamSSEResponse(response);\n } catch {\n // Ignore stream errors - caller should handle connection issues\n }\n },\n\n cancelTask(request) {\n return http.request<CancelTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n getTask(request) {\n return http.request<GetTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n async *resubscribeTask(request) {\n try {\n const response = await fetch(baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText}`);\n }\n\n yield* streamSSEResponse(response);\n } catch {\n // Ignore resubscribe errors - caller should handle reconnection\n }\n },\n\n // ============ Simplified API Implementation ============\n\n async *chat(messages, options = {}) {\n const { taskId } = options;\n\n const systemMsg = messages.find((m) => m.role === \"system\");\n const nonSystemMsgs = messages.filter((m) => m.role !== \"system\");\n const lastUserMsg = nonSystemMsgs[nonSystemMsgs.length - 1];\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId: extractAppIdFromUrl() || generateUUID(),\n kind: \"message\",\n messageId: generateUUID(),\n role: \"user\",\n parts: [{ kind: \"text\", text: lastUserMsg?.content ?? \"\" }],\n ...(taskId && { taskId }),\n ...(systemMsg && {\n metadata: { systemPrompt: systemMsg.content },\n }),\n },\n },\n };\n\n for await (const response of this.sendMessageStream(request)) {\n const chunk = parseChunk(response);\n if (chunk) {\n yield chunk;\n }\n }\n },\n\n cancelChat(taskId) {\n const request: CancelTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/cancel\",\n params: { id: taskId },\n };\n return this.cancelTask(request);\n },\n\n getChatStatus(taskId) {\n const request: GetTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/get\",\n params: { id: taskId },\n };\n return this.getTask(request);\n },\n };\n\n // Return only the public API\n return {\n chat: internal.chat.bind(internal),\n cancelChat: internal.cancelChat.bind(internal),\n getChatStatus: internal.getChatStatus.bind(internal),\n };\n}\n"]}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import {AGENT_CARD_PATH}from'@a2a-js/sdk';import {createParser}from'eventsource-parser';import {createHttpClient}from'@amaster.ai/http-client';function c(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():typeof crypto<"u"&&typeof crypto.getRandomValues=="function"?"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,s=>{let n=(crypto.getRandomValues(new Uint8Array(1))[0]??0)%16;return (s==="x"?n:n&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,s=>{let e=Math.random()*16|0;return (s==="x"?e:e&3|8).toString(16)})}function h(){if(typeof window>"u")return null;try{let s=window.location.href,e=/\/app\/([\da-f-]+)(?:\/|$)/.exec(s);if(e&&e[1])return e[1];let n=window.location.hostname,t=/^([\da-f-]+)(?:-[^.]+)?\.amaster\.(?:local|ai)$/.exec(n);return t&&t[1]?t[1]:null}catch{return null}}async function*d(s){if(!s.body)return;let e=s.body.getReader(),n=new TextDecoder,t=[],a=createParser({onEvent:r=>{try{t.push(JSON.parse(r.data));}catch{}}});try{for(;;){let{done:r,value:u}=await e.read();if(r)break;for(a.feed(n.decode(u,{stream:!0}));t.length>0;){let o=t.shift();o&&(yield o);}}}finally{e.releaseLock();}}function f(s){if("error"in s)return "";let e=s.result;if(!e)return "";if("kind"in e&&e.kind==="status-update"){let n=e.status?.message?.parts;return n?n.filter(t=>t.kind==="text").map(t=>t.text).join(""):""}return ""}function k(s){if("error"in s)return null;let e=s.result;return e&&"kind"in e&&e.kind==="status-update"?{taskId:e.taskId,text:f(s),status:e.status.state,isFinal:e.final??false}:null}function y(s=createHttpClient()){let e="/api/proxy/builtin/platform/copilot",n={getAgentCard(){return s.request({url:`${e}/${AGENT_CARD_PATH}`,method:"GET"})},sendMessage(t){return s.request({url:e,method:"POST",data:t})},async*sendMessageStream(t){try{let a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(t)});if(!a.ok)throw new Error(`Stream request failed: ${a.statusText}`);yield*d(a);}catch{}},cancelTask(t){return s.request({url:e,method:"POST",data:t})},getTask(t){return s.request({url:e,method:"POST",data:t})},async*resubscribeTask(t){try{let a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(t)});if(!a.ok)throw new Error(`Stream request failed: ${a.statusText}`);yield*d(a);}catch{}},async*chat(t,a={}){let{taskId:r}=a,u=t.find(i=>i.role==="system"),o=t.filter(i=>i.role!=="system"),p=o[o.length-1],x={jsonrpc:"2.0",id:c(),method:"message/stream",params:{message:{contextId:h()||c(),kind:"message",messageId:c(),role:"user",parts:[{kind:"text",text:p?.content??""}],...r&&{taskId:r},...u&&{metadata:{systemPrompt:u.content}}}}};for await(let i of this.sendMessageStream(x)){let l=k(i);l&&(yield l);}},cancelChat(t){let a={jsonrpc:"2.0",id:c(),method:"tasks/cancel",params:{id:t}};return this.cancelTask(a)},getChatStatus(t){let a={jsonrpc:"2.0",id:c(),method:"tasks/get",params:{id:t}};return this.getTask(a)}};return {chat:n.chat.bind(n),cancelChat:n.cancelChat.bind(n),getChatStatus:n.getChatStatus.bind(n)}}export{y as createCopilotClient};//# sourceMappingURL=index.js.map
1
+ import {AGENT_CARD_PATH}from'@a2a-js/sdk';import {createParser}from'eventsource-parser';import {createHttpClient}from'@amaster.ai/http-client';function c(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():typeof crypto<"u"&&typeof crypto.getRandomValues=="function"?"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,s=>{let n=(crypto.getRandomValues(new Uint8Array(1))[0]??0)%16;return (s==="x"?n:n&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,s=>{let e=Math.random()*16|0;return (s==="x"?e:e&3|8).toString(16)})}function h(){if(typeof window>"u")return null;try{let s=window.location.href,e=/\/app\/([\da-f-]+)(?:\/|$)/.exec(s);if(e&&e[1])return e[1];let n=window.location.hostname,t=/^([\da-f-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai)$/.exec(n);return t&&t[1]?t[1]:null}catch{return null}}async function*d(s){if(!s.body)return;let e=s.body.getReader(),n=new TextDecoder,t=[],a=createParser({onEvent:r=>{try{t.push(JSON.parse(r.data));}catch{}}});try{for(;;){let{done:r,value:u}=await e.read();if(r)break;for(a.feed(n.decode(u,{stream:!0}));t.length>0;){let o=t.shift();o&&(yield o);}}}finally{e.releaseLock();}}function f(s){if("error"in s)return "";let e=s.result;if(!e)return "";if("kind"in e&&e.kind==="status-update"){let n=e.status?.message?.parts;return n?n.filter(t=>t.kind==="text").map(t=>t.text).join(""):""}return ""}function k(s){if("error"in s)return null;let e=s.result;return e&&"kind"in e&&e.kind==="status-update"?{taskId:e.taskId,text:f(s),status:e.status.state,isFinal:e.final??false}:null}function y(s=createHttpClient()){let e="/api/proxy/builtin/platform/copilot",n={getAgentCard(){return s.request({url:`${e}/${AGENT_CARD_PATH}`,method:"GET"})},sendMessage(t){return s.request({url:e,method:"POST",data:t})},async*sendMessageStream(t){try{let a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(t)});if(!a.ok)throw new Error(`Stream request failed: ${a.statusText}`);yield*d(a);}catch{}},cancelTask(t){return s.request({url:e,method:"POST",data:t})},getTask(t){return s.request({url:e,method:"POST",data:t})},async*resubscribeTask(t){try{let a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(t)});if(!a.ok)throw new Error(`Stream request failed: ${a.statusText}`);yield*d(a);}catch{}},async*chat(t,a={}){let{taskId:r}=a,u=t.find(i=>i.role==="system"),o=t.filter(i=>i.role!=="system"),p=o[o.length-1],x={jsonrpc:"2.0",id:c(),method:"message/stream",params:{message:{contextId:h()||c(),kind:"message",messageId:c(),role:"user",parts:[{kind:"text",text:p?.content??""}],...r&&{taskId:r},...u&&{metadata:{systemPrompt:u.content}}}}};for await(let i of this.sendMessageStream(x)){let l=k(i);l&&(yield l);}},cancelChat(t){let a={jsonrpc:"2.0",id:c(),method:"tasks/cancel",params:{id:t}};return this.cancelTask(a)},getChatStatus(t){let a={jsonrpc:"2.0",id:c(),method:"tasks/get",params:{id:t}};return this.getTask(a)}};return {chat:n.chat.bind(n),cancelChat:n.cancelChat.bind(n),getChatStatus:n.getChatStatus.bind(n)}}export{y as createCopilotClient};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/copilot-client.ts"],"names":["generateUUID","c","r","extractAppIdFromUrl","url","pathMatch","hostname","domainMatch","streamSSEResponse","response","reader","decoder","queue","parser","createParser","event","done","value","item","extractTextFromResponse","result","parts","part","parseChunk","createCopilotClient","http","createHttpClient","baseUrl","internal","AGENT_CARD_PATH","request","messages","options","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","chunk"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n AgentCard,\n CancelTaskRequest,\n CancelTaskResponse,\n GetTaskRequest,\n GetTaskResponse,\n SendMessageRequest,\n SendMessageResponse,\n SendStreamingMessageRequest,\n SendStreamingMessageResponse,\n TaskResubscriptionRequest,\n TaskState,\n} from \"@a2a-js/sdk\";\nimport { AGENT_CARD_PATH } from \"@a2a-js/sdk\";\nimport { createParser } from \"eventsource-parser\";\nimport { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\n\n// ============ UUID Generator with fallback ============\n\n/**\n * Generate a UUID v4 with better browser compatibility\n * Falls back to crypto.getRandomValues if crypto.randomUUID is not available\n */\nfunction generateUUID(): string {\n // Try using crypto.randomUUID if available (modern browsers)\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n // Fallback: use crypto.getRandomValues (better compatibility)\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const randomValues = crypto.getRandomValues(new Uint8Array(1));\n const r = (randomValues[0] ?? 0) % 16;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Extract app_id from current page URL or domain\n * Method 1: From URL path - /app/{app_id}/...\n * Method 2: From domain (subdomain) - {app_id}-{env}.amaster.local\n */\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n try {\n // Method 1: Try to extract from URL path first\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-f-]+)(?:\\/|$)/.exec(url);\n if (pathMatch && pathMatch[1]) {\n return pathMatch[1];\n }\n\n // Method 2: Try to extract from domain (subdomain)\n const hostname = window.location.hostname;\n const domainMatch = /^([\\da-f-]+)(?:-[^.]+)?\\.amaster\\.(?:local|ai)$/.exec(hostname);\n if (domainMatch && domainMatch[1]) {\n return domainMatch[1];\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n// ============ Simplified API Types ============\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ChatOptions {\n taskId?: string;\n}\n\nexport interface ChatChunk {\n taskId: string;\n text: string;\n status: TaskState;\n isFinal: boolean | undefined;\n}\n\n// ============ Client Types ============\n\n// Internal client with all A2A methods\ntype InternalCopilotClient = {\n getAgentCard(): Promise<ClientResult<AgentCard>>;\n sendMessage(request: SendMessageRequest): Promise<ClientResult<SendMessageResponse>>;\n sendMessageStream(\n request: SendStreamingMessageRequest\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n cancelTask(request: CancelTaskRequest): Promise<ClientResult<CancelTaskResponse>>;\n getTask(request: GetTaskRequest): Promise<ClientResult<GetTaskResponse>>;\n resubscribeTask(\n request: TaskResubscriptionRequest\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ChatChunk, void, unknown>;\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\n// Public client with only simplified API\nexport type CopilotClient = {\n chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ChatChunk, void, unknown>;\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\nasync function* streamSSEResponse(\n response: Response\n): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n const queue: SendStreamingMessageResponse[] = [];\n\n const parser = createParser({\n onEvent: (event) => {\n try {\n queue.push(JSON.parse(event.data));\n } catch {\n // Ignore parse errors for malformed SSE data\n }\n },\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n parser.feed(decoder.decode(value, { stream: true }));\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n yield item;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction extractTextFromResponse(response: SendStreamingMessageResponse): string {\n if (\"error\" in response) {\n return \"\";\n }\n const result = response.result;\n if (!result) {\n return \"\";\n }\n\n // TaskStatusUpdateEvent has kind: 'status-update'\n if (\"kind\" in result && result.kind === \"status-update\") {\n const parts = result.status?.message?.parts;\n if (!parts) {\n return \"\";\n }\n return parts\n .filter((part): part is { kind: \"text\"; text: string } => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\");\n }\n return \"\";\n}\n\nfunction parseChunk(response: SendStreamingMessageResponse): ChatChunk | null {\n if (\"error\" in response) {\n return null;\n }\n const result = response.result;\n if (!result) {\n return null;\n }\n\n // TaskStatusUpdateEvent has kind: 'status-update'\n if (\"kind\" in result && result.kind === \"status-update\") {\n return {\n taskId: result.taskId,\n text: extractTextFromResponse(response),\n status: result.status.state,\n isFinal: result.final ?? false,\n };\n }\n return null;\n}\n\nexport function createCopilotClient(http: HttpClient = createHttpClient()): CopilotClient {\n const baseUrl = \"/api/proxy/builtin/platform/copilot\";\n\n const internal: InternalCopilotClient = {\n getAgentCard() {\n return http.request<AgentCard>({\n url: `${baseUrl}/${AGENT_CARD_PATH}`,\n method: \"GET\",\n });\n },\n\n sendMessage(request) {\n return http.request<SendMessageResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n async *sendMessageStream(request) {\n try {\n const response = await fetch(baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText}`);\n }\n\n yield* streamSSEResponse(response);\n } catch {\n // Ignore stream errors - caller should handle connection issues\n }\n },\n\n cancelTask(request) {\n return http.request<CancelTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n getTask(request) {\n return http.request<GetTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n async *resubscribeTask(request) {\n try {\n const response = await fetch(baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText}`);\n }\n\n yield* streamSSEResponse(response);\n } catch {\n // Ignore resubscribe errors - caller should handle reconnection\n }\n },\n\n // ============ Simplified API Implementation ============\n\n async *chat(messages, options = {}) {\n const { taskId } = options;\n\n const systemMsg = messages.find((m) => m.role === \"system\");\n const nonSystemMsgs = messages.filter((m) => m.role !== \"system\");\n const lastUserMsg = nonSystemMsgs[nonSystemMsgs.length - 1];\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId: extractAppIdFromUrl() || generateUUID(),\n kind: \"message\",\n messageId: generateUUID(),\n role: \"user\",\n parts: [{ kind: \"text\", text: lastUserMsg?.content ?? \"\" }],\n ...(taskId && { taskId }),\n ...(systemMsg && {\n metadata: { systemPrompt: systemMsg.content },\n }),\n },\n },\n };\n\n for await (const response of this.sendMessageStream(request)) {\n const chunk = parseChunk(response);\n if (chunk) {\n yield chunk;\n }\n }\n },\n\n cancelChat(taskId) {\n const request: CancelTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/cancel\",\n params: { id: taskId },\n };\n return this.cancelTask(request);\n },\n\n getChatStatus(taskId) {\n const request: GetTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/get\",\n params: { id: taskId },\n };\n return this.getTask(request);\n },\n };\n\n // Return only the public API\n return {\n chat: internal.chat.bind(internal),\n cancelChat: internal.cancelChat.bind(internal),\n getChatStatus: internal.getChatStatus.bind(internal),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/copilot-client.ts"],"names":["generateUUID","c","r","extractAppIdFromUrl","url","pathMatch","hostname","domainMatch","streamSSEResponse","response","reader","decoder","queue","parser","createParser","event","done","value","item","extractTextFromResponse","result","parts","part","parseChunk","createCopilotClient","http","createHttpClient","baseUrl","internal","AGENT_CARD_PATH","request","messages","options","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","chunk"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n AgentCard,\n CancelTaskRequest,\n CancelTaskResponse,\n GetTaskRequest,\n GetTaskResponse,\n SendMessageRequest,\n SendMessageResponse,\n SendStreamingMessageRequest,\n SendStreamingMessageResponse,\n TaskResubscriptionRequest,\n TaskState,\n} from \"@a2a-js/sdk\";\nimport { AGENT_CARD_PATH } from \"@a2a-js/sdk\";\nimport { createParser } from \"eventsource-parser\";\nimport { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\n\n// ============ UUID Generator with fallback ============\n\n/**\n * Generate a UUID v4 with better browser compatibility\n * Falls back to crypto.getRandomValues if crypto.randomUUID is not available\n */\nfunction generateUUID(): string {\n // Try using crypto.randomUUID if available (modern browsers)\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n // Fallback: use crypto.getRandomValues (better compatibility)\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const randomValues = crypto.getRandomValues(new Uint8Array(1));\n const r = (randomValues[0] ?? 0) % 16;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Extract app_id from current page URL or domain\n * Method 1: From URL path - /app/{app_id}/...\n * Method 2: From domain (subdomain) - {app_id}-{env}.amaster.local\n */\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n try {\n // Method 1: Try to extract from URL path first\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-f-]+)(?:\\/|$)/.exec(url);\n if (pathMatch && pathMatch[1]) {\n return pathMatch[1];\n }\n\n // Method 2: Try to extract from domain (subdomain)\n // Matches patterns like: {app_id}-{env}.{domain}.{tld}\n // Examples: abc123-dev.amaster.ai, abc123-prod.appok.ai, abc123.amaster.local\n const hostname = window.location.hostname;\n const domainMatch = /^([\\da-f-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai)$/.exec(hostname);\n if (domainMatch && domainMatch[1]) {\n return domainMatch[1];\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n// ============ Simplified API Types ============\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ChatOptions {\n taskId?: string;\n}\n\nexport interface ChatChunk {\n taskId: string;\n text: string;\n status: TaskState;\n isFinal: boolean | undefined;\n}\n\n// ============ Client Types ============\n\n// Internal client with all A2A methods\ntype InternalCopilotClient = {\n getAgentCard(): Promise<ClientResult<AgentCard>>;\n sendMessage(request: SendMessageRequest): Promise<ClientResult<SendMessageResponse>>;\n sendMessageStream(\n request: SendStreamingMessageRequest\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n cancelTask(request: CancelTaskRequest): Promise<ClientResult<CancelTaskResponse>>;\n getTask(request: GetTaskRequest): Promise<ClientResult<GetTaskResponse>>;\n resubscribeTask(\n request: TaskResubscriptionRequest\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ChatChunk, void, unknown>;\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\n// Public client with only simplified API\nexport type CopilotClient = {\n chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ChatChunk, void, unknown>;\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\nasync function* streamSSEResponse(\n response: Response\n): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n if (!response.body) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n const queue: SendStreamingMessageResponse[] = [];\n\n const parser = createParser({\n onEvent: (event) => {\n try {\n queue.push(JSON.parse(event.data));\n } catch {\n // Ignore parse errors for malformed SSE data\n }\n },\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n parser.feed(decoder.decode(value, { stream: true }));\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n yield item;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction extractTextFromResponse(response: SendStreamingMessageResponse): string {\n if (\"error\" in response) {\n return \"\";\n }\n const result = response.result;\n if (!result) {\n return \"\";\n }\n\n // TaskStatusUpdateEvent has kind: 'status-update'\n if (\"kind\" in result && result.kind === \"status-update\") {\n const parts = result.status?.message?.parts;\n if (!parts) {\n return \"\";\n }\n return parts\n .filter((part): part is { kind: \"text\"; text: string } => part.kind === \"text\")\n .map((part) => part.text)\n .join(\"\");\n }\n return \"\";\n}\n\nfunction parseChunk(response: SendStreamingMessageResponse): ChatChunk | null {\n if (\"error\" in response) {\n return null;\n }\n const result = response.result;\n if (!result) {\n return null;\n }\n\n // TaskStatusUpdateEvent has kind: 'status-update'\n if (\"kind\" in result && result.kind === \"status-update\") {\n return {\n taskId: result.taskId,\n text: extractTextFromResponse(response),\n status: result.status.state,\n isFinal: result.final ?? false,\n };\n }\n return null;\n}\n\nexport function createCopilotClient(http: HttpClient = createHttpClient()): CopilotClient {\n const baseUrl = \"/api/proxy/builtin/platform/copilot\";\n\n const internal: InternalCopilotClient = {\n getAgentCard() {\n return http.request<AgentCard>({\n url: `${baseUrl}/${AGENT_CARD_PATH}`,\n method: \"GET\",\n });\n },\n\n sendMessage(request) {\n return http.request<SendMessageResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n async *sendMessageStream(request) {\n try {\n const response = await fetch(baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText}`);\n }\n\n yield* streamSSEResponse(response);\n } catch {\n // Ignore stream errors - caller should handle connection issues\n }\n },\n\n cancelTask(request) {\n return http.request<CancelTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n getTask(request) {\n return http.request<GetTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n\n async *resubscribeTask(request) {\n try {\n const response = await fetch(baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\",\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText}`);\n }\n\n yield* streamSSEResponse(response);\n } catch {\n // Ignore resubscribe errors - caller should handle reconnection\n }\n },\n\n // ============ Simplified API Implementation ============\n\n async *chat(messages, options = {}) {\n const { taskId } = options;\n\n const systemMsg = messages.find((m) => m.role === \"system\");\n const nonSystemMsgs = messages.filter((m) => m.role !== \"system\");\n const lastUserMsg = nonSystemMsgs[nonSystemMsgs.length - 1];\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId: extractAppIdFromUrl() || generateUUID(),\n kind: \"message\",\n messageId: generateUUID(),\n role: \"user\",\n parts: [{ kind: \"text\", text: lastUserMsg?.content ?? \"\" }],\n ...(taskId && { taskId }),\n ...(systemMsg && {\n metadata: { systemPrompt: systemMsg.content },\n }),\n },\n },\n };\n\n for await (const response of this.sendMessageStream(request)) {\n const chunk = parseChunk(response);\n if (chunk) {\n yield chunk;\n }\n }\n },\n\n cancelChat(taskId) {\n const request: CancelTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/cancel\",\n params: { id: taskId },\n };\n return this.cancelTask(request);\n },\n\n getChatStatus(taskId) {\n const request: GetTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/get\",\n params: { id: taskId },\n };\n return this.getTask(request);\n },\n };\n\n // Return only the public API\n return {\n chat: internal.chat.bind(internal),\n cancelChat: internal.cancelChat.bind(internal),\n getChatStatus: internal.getChatStatus.bind(internal),\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amaster.ai/copilot-client",
3
- "version": "1.0.0-beta.4",
3
+ "version": "1.0.0-beta.6",
4
4
  "description": "AI copilot chat client with streaming support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -31,7 +31,7 @@
31
31
  "registry": "https://registry.npmjs.org/"
32
32
  },
33
33
  "dependencies": {
34
- "@amaster.ai/http-client": "1.0.0-beta.4"
34
+ "@amaster.ai/http-client": "1.0.0-beta.6"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "@a2a-js/sdk": "^0.3.7",