@amaster.ai/copilot-client 1.0.0-beta.1 → 1.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1 +1,136 @@
1
1
  # @amaster.ai/copilot-client
2
+
3
+ A2A to A2UI conversion SDK for Copilot API.
4
+
5
+ ## Overview
6
+
7
+ This SDK converts [A2A protocol](https://github.com/google-a2a/A2A) responses from Copilot Agent to [A2UI](https://a2ui.org/) format for rendering.
8
+
9
+ ```
10
+ ┌─────────────────┐ ┌───────────────────────────┐ ┌─────────────────┐
11
+ │ Your App │ │ copilot-client │ │ Copilot Agent │
12
+ │ │ │ │ │ (A2A Server) │
13
+ │ ChatMessage ──────────► A2A Request ───────────────► │
14
+ │ │ │ │ │ │
15
+ │ │ │ ┌───────────────────┐ │ │ A2A Response │
16
+ │ ServerToClient │ │ │ A2A → A2UI │ │ │ parts[]: │
17
+ │ Message[] ◄──────────────│ Conversion │◄────────── - TextPart │
18
+ │ │ │ │ │ │ │ │ - FilePart │
19
+ │ │ │ │ │ TextPart → Text │ │ │ - DataPart │
20
+ │ │ │ │ │ FilePart → Image │ │ │ │
21
+ │ ▼ │ │ │ DataPart → pass │ │ │ │
22
+ │ @a2ui/lit │ │ └───────────────────┘ │ └─────────────────┘
23
+ │ Renderer │ └───────────────────────────┘
24
+ └─────────────────┘
25
+ ```
26
+
27
+ **A2A → A2UI Conversion:**
28
+
29
+ - `TextPart` → A2UI `Text` component
30
+ - `FilePart` (image) → A2UI `Image` component
31
+ - `DataPart` (thought) → A2UI `Card` with `Text` (💭 subject + description)
32
+ - `DataPart` (toolCall) → A2UI `Card` with `Icon` + `Text` (tool name + status)
33
+ - `DataPart` (mimeType: `application/json+a2ui`) → pass through as-is
34
+
35
+ ## Installation
36
+
37
+ ```bash
38
+ pnpm add @amaster.ai/copilot-client
39
+ ```
40
+
41
+ ### Peer Dependencies
42
+
43
+ ```bash
44
+ pnpm add @a2a-js/sdk @a2ui/lit
45
+ ```
46
+
47
+ ## Usage
48
+
49
+ ```typescript
50
+ import { createCopilotA2UIClient, Data } from "@amaster.ai/copilot-client";
51
+
52
+ const client = createCopilotA2UIClient();
53
+
54
+ // Create A2UI message processor
55
+ const processor = Data.createSignalA2uiMessageProcessor();
56
+
57
+ // Stream and render
58
+ for await (const messages of client.chat([{ role: "user", content: "Hello" }])) {
59
+ // messages is ServerToClientMessage[] (A2UI standard type)
60
+ processor.processMessages(messages);
61
+
62
+ const surfaces = processor.getSurfaces();
63
+ for (const [surfaceId, surface] of surfaces.entries()) {
64
+ // Render with @a2ui/lit
65
+ }
66
+ }
67
+ ```
68
+
69
+ ## API
70
+
71
+ ### `createCopilotA2UIClient(http?)`
72
+
73
+ Creates a Copilot A2UI client.
74
+
75
+ ### `client.chat(messages, options?)`
76
+
77
+ Streams A2UI messages converted from A2A response.
78
+
79
+ **Returns:** `AsyncGenerator<ServerToClientMessage[]>`
80
+
81
+ ```typescript
82
+ interface ChatMessage {
83
+ role: "system" | "user" | "assistant";
84
+ content: string | MessageContent[];
85
+ }
86
+
87
+ interface ChatOptions {
88
+ taskId?: string;
89
+ }
90
+ ```
91
+
92
+ ### `client.cancelChat(taskId)`
93
+
94
+ Cancels an ongoing chat task.
95
+
96
+ ### `client.getChatStatus(taskId)`
97
+
98
+ Gets the current status of a chat task.
99
+
100
+ ## Multimodal Input
101
+
102
+ ```typescript
103
+ // Text
104
+ { role: "user", content: "Hello" }
105
+
106
+ // Image
107
+ { role: "user", content: [
108
+ { type: "text", text: "What's this?" },
109
+ { type: "image", url: "https://..." }
110
+ ]}
111
+
112
+ // File
113
+ { role: "user", content: [
114
+ { type: "file", url: "https://...", name: "doc.pdf" }
115
+ ]}
116
+ ```
117
+
118
+ ## Types
119
+
120
+ All output types are standard A2UI types from `@a2ui/lit`:
121
+
122
+ ```typescript
123
+ import type { ServerToClientMessage, Surface, MessageProcessor } from "@amaster.ai/copilot-client";
124
+ import { Data, Types } from "@amaster.ai/copilot-client";
125
+ ```
126
+
127
+ ## References
128
+
129
+ - [A2UI Documentation](https://a2ui.org/)
130
+ - [A2UI Components](https://a2ui.org/reference/components/)
131
+ - [A2UI Messages](https://a2ui.org/reference/messages/)
132
+ - [A2A Protocol](https://github.com/google-a2a/A2A)
133
+
134
+ ## License
135
+
136
+ MIT
package/dist/index.cjs CHANGED
@@ -1,2 +1,3 @@
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 httpClient=require('@amaster.ai/http-client'),eventsourceParser=require('eventsource-parser'),_0_8=require('@a2ui/lit/0.8');function l(){let t=typeof globalThis<"u"?globalThis.crypto:void 0;return t&&typeof t.randomUUID=="function"?t.randomUUID():t&&typeof t.getRandomValues=="function"?"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let n=(t.getRandomValues(new Uint8Array(1))[0]??0)%16;return (e==="x"?n:n&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let i=Math.random()*16|0;return (e==="x"?i:i&3|8).toString(16)})}function h(){if(typeof window>"u")return null;try{let t=window.location.href,e=/\/app\/([\da-f-]+)(?:\/|$)/.exec(t);if(e&&e[1])return e[1];let i=window.location.hostname,n=/^([\da-f-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai)$/.exec(i);return n&&n[1]?n[1]:null}catch{return null}}function S(t){return typeof t=="string"?[{kind:"text",text:t}]:t.map(e=>{switch(e.type){case "text":return {kind:"text",text:e.text};case "image":return e.data?{kind:"file",file:{bytes:e.data,mimeType:e.mimeType||"image/png"}}:e.url?{kind:"file",file:{uri:e.url,mimeType:e.mimeType||"image/png"}}:null;case "file":return e.data?{kind:"file",file:{bytes:e.data,...e.mimeType&&{mimeType:e.mimeType},...e.name&&{name:e.name}}}:e.url?{kind:"file",file:{uri:e.url,...e.mimeType&&{mimeType:e.mimeType},...e.name&&{name:e.name}}}:null;default:return null}}).filter(e=>e!==null)}function M(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
2
+ `)}var k="application/json+a2ui",R="main",A=0;function p(t){return `${t}-${++A}`}function d(t,e){let i=p("text");return {surfaceUpdate:{surfaceId:e,components:[{id:i,component:{Text:{text:{literalString:t},usageHint:"body"}}}]}}}function I(t,e){let i=t.mimeType||"";if(!i.startsWith("image/"))return null;let n=p("image"),s=t.uri||(t.bytes?`data:${i};base64,${t.bytes}`:null);return s?{surfaceUpdate:{surfaceId:e,components:[{id:n,component:{Image:{url:{literalString:s}}}}]}}:null}function U(t,e){if(!t.subject&&!t.description)return null;let i=p("thought"),n=[];n.push({id:i,component:{Card:{child:`${i}-content`}}});let s=[];return t.subject&&s.push(`${i}-subject`),t.description&&s.push(`${i}-desc`),n.push({id:`${i}-content`,component:{Column:{children:{explicitList:s}}}}),t.subject&&n.push({id:`${i}-subject`,component:{Text:{text:{literalString:`\u{1F4AD} ${t.subject}`},usageHint:"h4"}}}),t.description&&n.push({id:`${i}-desc`,component:{Text:{text:{literalString:t.description},usageHint:"caption"}}}),{surfaceUpdate:{surfaceId:e,components:n}}}function b(t,e){let i=t.tool?.displayName||t.tool?.name||t.request?.name||"Tool",n=t.status||"running",s=p("tool"),r=[];r.push({id:s,component:{Card:{child:`${s}-row`}}}),r.push({id:`${s}-row`,component:{Row:{alignment:"center",children:{explicitList:[`${s}-icon`,`${s}-info`]}}}});let o=n==="completed"?"check_circle":n==="failed"?"error":"build";r.push({id:`${s}-icon`,component:{Icon:{name:{literalString:o}}}}),r.push({id:`${s}-info`,component:{Column:{children:{explicitList:[`${s}-name`,`${s}-status`]}}}}),r.push({id:`${s}-name`,component:{Text:{text:{literalString:i},usageHint:"body"}}});let a=n==="completed"?"\u2713 Completed":n==="failed"?"\u2717 Failed":n==="pending"?"\u23F3 Pending...":"\u2699\uFE0F Running...";return r.push({id:`${s}-status`,component:{Text:{text:{literalString:a},usageHint:"caption"}}}),{surfaceUpdate:{surfaceId:e,components:r}}}var u={THOUGHT:"thought",TOOL_CALL_UPDATE:"tool-call-update",TOOL_CALL_CONFIRMATION:"tool-call-confirmation",TEXT_CONTENT:"text-content"};function w(t,e,i=R){let n=[];for(let s of t)if(s.kind==="text")n.push(d(s.text,i));else if(s.kind==="file"&&"file"in s){let r=s.file,o=I(r,i);o&&n.push(o);}else if(s.kind==="data"){let r=s.data;if(s.metadata?.mimeType===k)n.push(r);else if(e===u.THOUGHT){let o=r;if(o.subject){let a=U(o,i);a&&n.push(a);}else o.description&&n.push(d(o.description,i));}else if(e===u.TOOL_CALL_UPDATE||e===u.TOOL_CALL_CONFIRMATION){let o=b(r,i);o&&n.push(o);}else if(e===u.TEXT_CONTENT){let o=r;o.description&&n.push(d(o.description,i));}}return n}function O(t){if("error"in t)return [];let e=t.result;if(!e||!("kind"in e)||e.kind!=="status-update")return [];let i=e.status?.message?.parts;if(!i||i.length===0)return [];let s=e.metadata?.coderAgent?.kind;return w(i,s)}async function*v(t){if(!t.body)return;let e=t.body.getReader(),i=new TextDecoder,n=[],s=eventsourceParser.createParser({onEvent:r=>{try{n.push(JSON.parse(r.data));}catch{}}});try{for(;;){let{done:r,value:o}=await e.read();if(r)break;for(s.feed(i.decode(o,{stream:!0}));n.length>0;){let a=n.shift();a&&(yield a);}}}finally{e.releaseLock();}}function $(t=httpClient.createHttpClient()){let e="/api/proxy/builtin/platform/copilot";async function*i(n){try{let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(n)});if(!s.ok)throw new Error(`Stream request failed: ${s.statusText}`);yield*v(s);}catch{}}return {async*chat(n,s={}){let{taskId:r}=s,o=n.find(c=>c.role==="system"),a=n.filter(c=>c.role!=="system"),m=a[a.length-1],f=m?S(m.content):[{kind:"text",text:""}],g=o?M(o.content):void 0,T={jsonrpc:"2.0",id:l(),method:"message/stream",params:{message:{contextId:h()||l(),kind:"message",messageId:l(),role:"user",parts:f,...r&&{taskId:r},...g&&{metadata:{systemPrompt:g}}}}};for await(let c of i(T)){let x=O(c);x.length>0&&(yield x);}},cancelChat(n){let s={jsonrpc:"2.0",id:l(),method:"tasks/cancel",params:{id:n}};return t.request({url:e,method:"POST",data:s})},getChatStatus(n){let s={jsonrpc:"2.0",id:l(),method:"tasks/get",params:{id:n}};return t.request({url:e,method:"POST",data:s})}}}Object.defineProperty(exports,"Data",{enumerable:true,get:function(){return _0_8.Data}});Object.defineProperty(exports,"Types",{enumerable:true,get:function(){return _0_8.Types}});exports.createCopilotA2UIClient=$;//# sourceMappingURL=index.cjs.map
2
3
  //# 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-a2ui-client.ts"],"names":["generateUUID","cryptoObj","c","r","extractAppIdFromUrl","url","pathMatch","hostname","domainMatch","convertToA2AParts","content","part","extractTextFromContent","A2UI_MIME_TYPE","DEFAULT_SURFACE_ID","componentIdCounter","generateComponentId","prefix","textPartToA2UI","text","surfaceId","componentId","filePartToA2UI","file","mimeType","thoughtToA2UI","thought","baseId","components","childrenList","toolCallToA2UI","toolCall","toolName","status","iconName","statusText","CODER_AGENT_EVENT","convertA2APartsToA2UI","parts","coderAgentKind","messages","a2uiMsg","data","convertResponseToA2UI","response","result","streamSSEResponse","reader","decoder","queue","parser","createParser","event","done","value","item","createCopilotA2UIClient","http","createHttpClient","baseUrl","sendMessageStream","request","options","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","systemPrompt","a2uiMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["/* eslint-disable no-undef, no-unused-vars */\nimport type {\n CancelTaskRequest,\n CancelTaskResponse,\n GetTaskRequest,\n GetTaskResponse,\n Part,\n SendStreamingMessageRequest,\n SendStreamingMessageResponse,\n} from \"@a2a-js/sdk\";\nimport { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\nimport { createParser } from \"eventsource-parser\";\nimport { Types } from \"@a2ui/lit/0.8\";\n\n// Re-export A2UI types from @a2ui/lit\nexport type ServerToClientMessage = Types.ServerToClientMessage;\nexport type Surface = Types.Surface;\nexport type MessageProcessor = Types.MessageProcessor;\n\n// ============ UUID Generator ============\n\nfunction generateUUID(): string {\n const cryptoObj = typeof globalThis !== \"undefined\" ? globalThis.crypto : undefined;\n\n if (cryptoObj && typeof cryptoObj.randomUUID === \"function\") {\n return cryptoObj.randomUUID();\n }\n\n if (cryptoObj && typeof cryptoObj.getRandomValues === \"function\") {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const randomValues = cryptoObj.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\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\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n try {\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 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// ============ Input Types ============\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface ImageContent {\n type: \"image\";\n data?: string;\n url?: string;\n mimeType?: string;\n}\n\nexport interface FileContent {\n type: \"file\";\n data?: string;\n url?: string;\n mimeType?: string;\n name?: string;\n}\n\nexport type MessageContent = TextContent | ImageContent | FileContent;\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string | MessageContent[];\n}\n\nexport interface ChatOptions {\n taskId?: string;\n}\n\n// ============ Convert Input to A2A Part ============\n\nfunction convertToA2AParts(content: string | MessageContent[]): Part[] {\n if (typeof content === \"string\") {\n return [{ kind: \"text\", text: content }];\n }\n\n return content\n .map((part): Part | null => {\n switch (part.type) {\n case \"text\":\n return { kind: \"text\", text: part.text };\n case \"image\":\n if (part.data) {\n return {\n kind: \"file\",\n file: { bytes: part.data, mimeType: part.mimeType || \"image/png\" },\n };\n }\n if (part.url) {\n return {\n kind: \"file\",\n file: { uri: part.url, mimeType: part.mimeType || \"image/png\" },\n };\n }\n return null;\n case \"file\":\n if (part.data) {\n return {\n kind: \"file\",\n file: {\n bytes: part.data,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n };\n }\n if (part.url) {\n return {\n kind: \"file\",\n file: {\n uri: part.url,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n };\n }\n return null;\n default:\n return null;\n }\n })\n .filter((part): part is Part => part !== null);\n}\n\nfunction extractTextFromContent(content: string | MessageContent[]): string {\n if (typeof content === \"string\") {\n return content;\n }\n return content\n .filter((part): part is TextContent => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\");\n}\n\n// ============ A2A → A2UI Conversion ============\n//\n// Convert A2A Parts to A2UI ServerToClientMessage:\n// - TextPart → surfaceUpdate with Text component\n// - FilePart (image) → surfaceUpdate with Image component\n// - DataPart (mimeType: application/json+a2ui) → pass through as-is\n//\n// Reference:\n// - A2A: https://github.com/google-a2a/A2A\n// - A2UI: https://a2ui.org/reference/messages/\n\nconst A2UI_MIME_TYPE = \"application/json+a2ui\";\nconst DEFAULT_SURFACE_ID = \"main\";\n\nlet componentIdCounter = 0;\n\nfunction generateComponentId(prefix: string): string {\n return `${prefix}-${++componentIdCounter}`;\n}\n\n/**\n * Convert A2A TextPart to A2UI Text component\n * Reference: https://a2ui-composer.ag-ui.com/components\n */\nfunction textPartToA2UI(text: string, surfaceId: string): ServerToClientMessage {\n const componentId = generateComponentId(\"text\");\n return {\n surfaceUpdate: {\n surfaceId,\n components: [\n {\n id: componentId,\n component: {\n Text: {\n text: { literalString: text },\n usageHint: \"body\",\n },\n },\n },\n ],\n },\n };\n}\n\n/**\n * Convert A2A FilePart (image) to A2UI Image component\n */\nfunction filePartToA2UI(\n file: { bytes?: string; uri?: string; mimeType?: string; name?: string },\n surfaceId: string\n): ServerToClientMessage | null {\n // Only handle image files\n const mimeType = file.mimeType || \"\";\n if (!mimeType.startsWith(\"image/\")) {\n return null;\n }\n\n const componentId = generateComponentId(\"image\");\n const url = file.uri || (file.bytes ? `data:${mimeType};base64,${file.bytes}` : null);\n\n if (!url) {\n return null;\n }\n\n return {\n surfaceUpdate: {\n surfaceId,\n components: [\n {\n id: componentId,\n component: {\n Image: {\n url: { literalString: url },\n },\n },\n },\n ],\n },\n };\n}\n\n/**\n * Convert Thought to A2UI Card with Text components\n * Thought: { subject: string, description: string }\n */\nfunction thoughtToA2UI(\n thought: { subject?: string; description?: string },\n surfaceId: string\n): ServerToClientMessage | null {\n if (!thought.subject && !thought.description) {\n return null;\n }\n\n const baseId = generateComponentId(\"thought\");\n const components: Array<{ id: string; component: Record<string, unknown> }> = [];\n\n // Card container\n components.push({\n id: baseId,\n component: {\n Card: {\n child: `${baseId}-content`,\n },\n },\n });\n\n // Column layout\n const childrenList: string[] = [];\n if (thought.subject) {\n childrenList.push(`${baseId}-subject`);\n }\n if (thought.description) {\n childrenList.push(`${baseId}-desc`);\n }\n\n components.push({\n id: `${baseId}-content`,\n component: {\n Column: {\n children: { explicitList: childrenList },\n },\n },\n });\n\n // Subject (title)\n if (thought.subject) {\n components.push({\n id: `${baseId}-subject`,\n component: {\n Text: {\n text: { literalString: `💭 ${thought.subject}` },\n usageHint: \"h4\",\n },\n },\n });\n }\n\n // Description\n if (thought.description) {\n components.push({\n id: `${baseId}-desc`,\n component: {\n Text: {\n text: { literalString: thought.description },\n usageHint: \"caption\",\n },\n },\n });\n }\n\n return {\n surfaceUpdate: {\n surfaceId,\n components,\n },\n };\n}\n\n/**\n * Convert ToolCall to A2UI Card with Icon and Text components\n * ToolCall: { request: { name, args }, status, tool: { name, displayName, description }, response?, ... }\n */\nfunction toolCallToA2UI(\n toolCall: {\n request?: { name?: string; args?: Record<string, unknown> };\n status?: string;\n tool?: { name?: string; displayName?: string; description?: string };\n response?: { content?: string };\n },\n surfaceId: string\n): ServerToClientMessage | null {\n const toolName =\n toolCall.tool?.displayName || toolCall.tool?.name || toolCall.request?.name || \"Tool\";\n const status = toolCall.status || \"running\";\n\n const baseId = generateComponentId(\"tool\");\n const components: Array<{ id: string; component: Record<string, unknown> }> = [];\n\n // Card container\n components.push({\n id: baseId,\n component: {\n Card: {\n child: `${baseId}-row`,\n },\n },\n });\n\n // Row layout (icon + info)\n components.push({\n id: `${baseId}-row`,\n component: {\n Row: {\n alignment: \"center\",\n children: { explicitList: [`${baseId}-icon`, `${baseId}-info`] },\n },\n },\n });\n\n // Icon\n const iconName =\n status === \"completed\" ? \"check_circle\" : status === \"failed\" ? \"error\" : \"build\";\n components.push({\n id: `${baseId}-icon`,\n component: {\n Icon: {\n name: { literalString: iconName },\n },\n },\n });\n\n // Info column\n components.push({\n id: `${baseId}-info`,\n component: {\n Column: {\n children: { explicitList: [`${baseId}-name`, `${baseId}-status`] },\n },\n },\n });\n\n // Tool name\n components.push({\n id: `${baseId}-name`,\n component: {\n Text: {\n text: { literalString: toolName },\n usageHint: \"body\",\n },\n },\n });\n\n // Status\n const statusText =\n status === \"completed\"\n ? \"✓ Completed\"\n : status === \"failed\"\n ? \"✗ Failed\"\n : status === \"pending\"\n ? \"⏳ Pending...\"\n : \"⚙️ Running...\";\n components.push({\n id: `${baseId}-status`,\n component: {\n Text: {\n text: { literalString: statusText },\n usageHint: \"caption\",\n },\n },\n });\n\n return {\n surfaceUpdate: {\n surfaceId,\n components,\n },\n };\n}\n\n// CoderAgent event types (from agent server)\nconst CODER_AGENT_EVENT = {\n THOUGHT: \"thought\",\n TOOL_CALL_UPDATE: \"tool-call-update\",\n TOOL_CALL_CONFIRMATION: \"tool-call-confirmation\",\n TEXT_CONTENT: \"text-content\",\n} as const;\n\n/**\n * Convert A2A Parts to A2UI ServerToClientMessage[]\n * @param parts - A2A message parts\n * @param coderAgentKind - CoderAgent event type from metadata.coderAgent.kind\n * @param surfaceId - Target surface ID\n */\nfunction convertA2APartsToA2UI(\n parts: Part[],\n coderAgentKind?: string,\n surfaceId: string = DEFAULT_SURFACE_ID\n): ServerToClientMessage[] {\n const messages: ServerToClientMessage[] = [];\n\n for (const part of parts) {\n if (part.kind === \"text\") {\n // TextPart → Text component\n messages.push(textPartToA2UI(part.text, surfaceId));\n } else if (part.kind === \"file\" && \"file\" in part) {\n // FilePart → Image component (for images)\n const file = part.file as { bytes?: string; uri?: string; mimeType?: string; name?: string };\n const a2uiMsg = filePartToA2UI(file, surfaceId);\n if (a2uiMsg) {\n messages.push(a2uiMsg);\n }\n } else if (part.kind === \"data\") {\n const data = part.data as Record<string, unknown>;\n\n // Check if it's A2UI format (pass through)\n if (part.metadata?.mimeType === A2UI_MIME_TYPE) {\n messages.push(data as ServerToClientMessage);\n }\n // Check if it's a Thought (only when coderAgentKind is \"thought\")\n else if (coderAgentKind === CODER_AGENT_EVENT.THOUGHT) {\n // Only treat as thought if it has subject (title), otherwise it's just text content\n const thought = data as { subject?: string; description?: string };\n if (thought.subject) {\n const a2uiMsg = thoughtToA2UI(thought, surfaceId);\n if (a2uiMsg) {\n messages.push(a2uiMsg);\n }\n } else if (thought.description) {\n // No subject = just text content, convert to Text component\n messages.push(textPartToA2UI(thought.description, surfaceId));\n }\n }\n // Check if it's a ToolCall\n else if (\n coderAgentKind === CODER_AGENT_EVENT.TOOL_CALL_UPDATE ||\n coderAgentKind === CODER_AGENT_EVENT.TOOL_CALL_CONFIRMATION\n ) {\n const a2uiMsg = toolCallToA2UI(\n data as {\n request?: { name?: string; args?: Record<string, unknown> };\n status?: string;\n tool?: { name?: string; displayName?: string; description?: string };\n response?: { content?: string };\n },\n surfaceId\n );\n if (a2uiMsg) {\n messages.push(a2uiMsg);\n }\n }\n // Check if it's text-content (DataPart with description but no subject)\n else if (coderAgentKind === CODER_AGENT_EVENT.TEXT_CONTENT) {\n const content = data as { subject?: string; description?: string };\n if (content.description) {\n messages.push(textPartToA2UI(content.description, surfaceId));\n }\n }\n }\n }\n\n return messages;\n}\n\n/**\n * Convert A2A streaming response to A2UI messages\n */\nfunction convertResponseToA2UI(response: SendStreamingMessageResponse): ServerToClientMessage[] {\n if (\"error\" in response) {\n return [];\n }\n\n const result = response.result;\n if (!result || !(\"kind\" in result) || result.kind !== \"status-update\") {\n return [];\n }\n\n const parts = result.status?.message?.parts;\n if (!parts || parts.length === 0) {\n return [];\n }\n\n // Extract coderAgent.kind from metadata\n const metadata = result.metadata as { coderAgent?: { kind?: string } } | undefined;\n const coderAgentKind = metadata?.coderAgent?.kind;\n\n return convertA2APartsToA2UI(parts, coderAgentKind);\n}\n\n// ============ SSE Stream Handling ============\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 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\n }\n },\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.feed(decoder.decode(value, { stream: true }));\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) yield item;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ============ Client ============\n\nexport type CopilotA2UIClient = {\n /**\n * Stream A2UI messages from Copilot Agent.\n *\n * Converts A2A response to A2UI format:\n * - TextPart → Text component\n * - FilePart (image) → Image component\n * - DataPart (A2UI) → pass through\n *\n * @example\n * ```typescript\n * import { Data } from \"@a2ui/lit/0.8\";\n *\n * const processor = Data.createSignalA2uiMessageProcessor();\n *\n * for await (const messages of client.chat([{ role: \"user\", content: \"Hello\" }])) {\n * processor.processMessages(messages);\n * const surfaces = processor.getSurfaces();\n * // Render surfaces\n * }\n * ```\n */\n chat(\n messages: ChatMessage[],\n options?: ChatOptions\n ): AsyncGenerator<ServerToClientMessage[], void, unknown>;\n\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\nexport function createCopilotA2UIClient(http: HttpClient = createHttpClient()): CopilotA2UIClient {\n const baseUrl = \"/api/proxy/builtin/platform/copilot\";\n\n async function* sendMessageStream(\n request: SendStreamingMessageRequest\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n try {\n const response = await fetch(baseUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\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\n }\n }\n\n return {\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 parts = lastUserMsg\n ? convertToA2AParts(lastUserMsg.content)\n : [{ kind: \"text\" as const, text: \"\" }];\n\n const systemPrompt = systemMsg ? extractTextFromContent(systemMsg.content) : undefined;\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,\n ...(taskId && { taskId }),\n ...(systemPrompt && { metadata: { systemPrompt } }),\n },\n },\n };\n\n for await (const response of sendMessageStream(request)) {\n const a2uiMessages = convertResponseToA2UI(response);\n if (a2uiMessages.length > 0) {\n yield a2uiMessages;\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 http.request<CancelTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\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 http.request<GetTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,24 +1,62 @@
1
- import { TaskState, CancelTaskResponse, GetTaskResponse } from '@a2a-js/sdk';
1
+ import { CancelTaskResponse, GetTaskResponse } from '@a2a-js/sdk';
2
2
  import { ClientResult, HttpClient } from '@amaster.ai/http-client';
3
+ import { Types } from '@a2ui/lit/0.8';
4
+ export { Data, Types } from '@a2ui/lit/0.8';
3
5
 
6
+ type ServerToClientMessage = Types.ServerToClientMessage;
7
+ type Surface = Types.Surface;
8
+ type MessageProcessor = Types.MessageProcessor;
9
+ interface TextContent {
10
+ type: "text";
11
+ text: string;
12
+ }
13
+ interface ImageContent {
14
+ type: "image";
15
+ data?: string;
16
+ url?: string;
17
+ mimeType?: string;
18
+ }
19
+ interface FileContent {
20
+ type: "file";
21
+ data?: string;
22
+ url?: string;
23
+ mimeType?: string;
24
+ name?: string;
25
+ }
26
+ type MessageContent = TextContent | ImageContent | FileContent;
4
27
  interface ChatMessage {
5
28
  role: "system" | "user" | "assistant";
6
- content: string;
29
+ content: string | MessageContent[];
7
30
  }
8
31
  interface ChatOptions {
9
32
  taskId?: string;
10
33
  }
11
- interface ChatChunk {
12
- taskId: string;
13
- text: string;
14
- status: TaskState;
15
- isFinal: boolean | undefined;
16
- }
17
- type CopilotClient = {
18
- chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ChatChunk, void, unknown>;
34
+ type CopilotA2UIClient = {
35
+ /**
36
+ * Stream A2UI messages from Copilot Agent.
37
+ *
38
+ * Converts A2A response to A2UI format:
39
+ * - TextPart → Text component
40
+ * - FilePart (image) → Image component
41
+ * - DataPart (A2UI) pass through
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * import { Data } from "@a2ui/lit/0.8";
46
+ *
47
+ * const processor = Data.createSignalA2uiMessageProcessor();
48
+ *
49
+ * for await (const messages of client.chat([{ role: "user", content: "Hello" }])) {
50
+ * processor.processMessages(messages);
51
+ * const surfaces = processor.getSurfaces();
52
+ * // Render surfaces
53
+ * }
54
+ * ```
55
+ */
56
+ chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ServerToClientMessage[], void, unknown>;
19
57
  cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;
20
58
  getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;
21
59
  };
22
- declare function createCopilotClient(http?: HttpClient): CopilotClient;
60
+ declare function createCopilotA2UIClient(http?: HttpClient): CopilotA2UIClient;
23
61
 
24
- export { type ChatChunk, type ChatMessage, type ChatOptions, type CopilotClient, createCopilotClient };
62
+ export { type ChatMessage, type ChatOptions, type CopilotA2UIClient, type FileContent, type ImageContent, type MessageContent, type MessageProcessor, type ServerToClientMessage, type Surface, type TextContent, createCopilotA2UIClient };
package/dist/index.d.ts CHANGED
@@ -1,24 +1,62 @@
1
- import { TaskState, CancelTaskResponse, GetTaskResponse } from '@a2a-js/sdk';
1
+ import { CancelTaskResponse, GetTaskResponse } from '@a2a-js/sdk';
2
2
  import { ClientResult, HttpClient } from '@amaster.ai/http-client';
3
+ import { Types } from '@a2ui/lit/0.8';
4
+ export { Data, Types } from '@a2ui/lit/0.8';
3
5
 
6
+ type ServerToClientMessage = Types.ServerToClientMessage;
7
+ type Surface = Types.Surface;
8
+ type MessageProcessor = Types.MessageProcessor;
9
+ interface TextContent {
10
+ type: "text";
11
+ text: string;
12
+ }
13
+ interface ImageContent {
14
+ type: "image";
15
+ data?: string;
16
+ url?: string;
17
+ mimeType?: string;
18
+ }
19
+ interface FileContent {
20
+ type: "file";
21
+ data?: string;
22
+ url?: string;
23
+ mimeType?: string;
24
+ name?: string;
25
+ }
26
+ type MessageContent = TextContent | ImageContent | FileContent;
4
27
  interface ChatMessage {
5
28
  role: "system" | "user" | "assistant";
6
- content: string;
29
+ content: string | MessageContent[];
7
30
  }
8
31
  interface ChatOptions {
9
32
  taskId?: string;
10
33
  }
11
- interface ChatChunk {
12
- taskId: string;
13
- text: string;
14
- status: TaskState;
15
- isFinal: boolean | undefined;
16
- }
17
- type CopilotClient = {
18
- chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ChatChunk, void, unknown>;
34
+ type CopilotA2UIClient = {
35
+ /**
36
+ * Stream A2UI messages from Copilot Agent.
37
+ *
38
+ * Converts A2A response to A2UI format:
39
+ * - TextPart → Text component
40
+ * - FilePart (image) → Image component
41
+ * - DataPart (A2UI) pass through
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * import { Data } from "@a2ui/lit/0.8";
46
+ *
47
+ * const processor = Data.createSignalA2uiMessageProcessor();
48
+ *
49
+ * for await (const messages of client.chat([{ role: "user", content: "Hello" }])) {
50
+ * processor.processMessages(messages);
51
+ * const surfaces = processor.getSurfaces();
52
+ * // Render surfaces
53
+ * }
54
+ * ```
55
+ */
56
+ chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<ServerToClientMessage[], void, unknown>;
19
57
  cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;
20
58
  getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;
21
59
  };
22
- declare function createCopilotClient(http?: HttpClient): CopilotClient;
60
+ declare function createCopilotA2UIClient(http?: HttpClient): CopilotA2UIClient;
23
61
 
24
- export { type ChatChunk, type ChatMessage, type ChatOptions, type CopilotClient, createCopilotClient };
62
+ export { type ChatMessage, type ChatOptions, type CopilotA2UIClient, type FileContent, type ImageContent, type MessageContent, type MessageProcessor, type ServerToClientMessage, type Surface, type TextContent, createCopilotA2UIClient };
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
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 {createHttpClient}from'@amaster.ai/http-client';import {createParser}from'eventsource-parser';export{Data,Types}from'@a2ui/lit/0.8';function l(){let t=typeof globalThis<"u"?globalThis.crypto:void 0;return t&&typeof t.randomUUID=="function"?t.randomUUID():t&&typeof t.getRandomValues=="function"?"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let n=(t.getRandomValues(new Uint8Array(1))[0]??0)%16;return (e==="x"?n:n&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let i=Math.random()*16|0;return (e==="x"?i:i&3|8).toString(16)})}function h(){if(typeof window>"u")return null;try{let t=window.location.href,e=/\/app\/([\da-f-]+)(?:\/|$)/.exec(t);if(e&&e[1])return e[1];let i=window.location.hostname,n=/^([\da-f-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai)$/.exec(i);return n&&n[1]?n[1]:null}catch{return null}}function S(t){return typeof t=="string"?[{kind:"text",text:t}]:t.map(e=>{switch(e.type){case "text":return {kind:"text",text:e.text};case "image":return e.data?{kind:"file",file:{bytes:e.data,mimeType:e.mimeType||"image/png"}}:e.url?{kind:"file",file:{uri:e.url,mimeType:e.mimeType||"image/png"}}:null;case "file":return e.data?{kind:"file",file:{bytes:e.data,...e.mimeType&&{mimeType:e.mimeType},...e.name&&{name:e.name}}}:e.url?{kind:"file",file:{uri:e.url,...e.mimeType&&{mimeType:e.mimeType},...e.name&&{name:e.name}}}:null;default:return null}}).filter(e=>e!==null)}function M(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
2
+ `)}var k="application/json+a2ui",R="main",A=0;function p(t){return `${t}-${++A}`}function d(t,e){let i=p("text");return {surfaceUpdate:{surfaceId:e,components:[{id:i,component:{Text:{text:{literalString:t},usageHint:"body"}}}]}}}function I(t,e){let i=t.mimeType||"";if(!i.startsWith("image/"))return null;let n=p("image"),s=t.uri||(t.bytes?`data:${i};base64,${t.bytes}`:null);return s?{surfaceUpdate:{surfaceId:e,components:[{id:n,component:{Image:{url:{literalString:s}}}}]}}:null}function U(t,e){if(!t.subject&&!t.description)return null;let i=p("thought"),n=[];n.push({id:i,component:{Card:{child:`${i}-content`}}});let s=[];return t.subject&&s.push(`${i}-subject`),t.description&&s.push(`${i}-desc`),n.push({id:`${i}-content`,component:{Column:{children:{explicitList:s}}}}),t.subject&&n.push({id:`${i}-subject`,component:{Text:{text:{literalString:`\u{1F4AD} ${t.subject}`},usageHint:"h4"}}}),t.description&&n.push({id:`${i}-desc`,component:{Text:{text:{literalString:t.description},usageHint:"caption"}}}),{surfaceUpdate:{surfaceId:e,components:n}}}function b(t,e){let i=t.tool?.displayName||t.tool?.name||t.request?.name||"Tool",n=t.status||"running",s=p("tool"),r=[];r.push({id:s,component:{Card:{child:`${s}-row`}}}),r.push({id:`${s}-row`,component:{Row:{alignment:"center",children:{explicitList:[`${s}-icon`,`${s}-info`]}}}});let o=n==="completed"?"check_circle":n==="failed"?"error":"build";r.push({id:`${s}-icon`,component:{Icon:{name:{literalString:o}}}}),r.push({id:`${s}-info`,component:{Column:{children:{explicitList:[`${s}-name`,`${s}-status`]}}}}),r.push({id:`${s}-name`,component:{Text:{text:{literalString:i},usageHint:"body"}}});let a=n==="completed"?"\u2713 Completed":n==="failed"?"\u2717 Failed":n==="pending"?"\u23F3 Pending...":"\u2699\uFE0F Running...";return r.push({id:`${s}-status`,component:{Text:{text:{literalString:a},usageHint:"caption"}}}),{surfaceUpdate:{surfaceId:e,components:r}}}var u={THOUGHT:"thought",TOOL_CALL_UPDATE:"tool-call-update",TOOL_CALL_CONFIRMATION:"tool-call-confirmation",TEXT_CONTENT:"text-content"};function w(t,e,i=R){let n=[];for(let s of t)if(s.kind==="text")n.push(d(s.text,i));else if(s.kind==="file"&&"file"in s){let r=s.file,o=I(r,i);o&&n.push(o);}else if(s.kind==="data"){let r=s.data;if(s.metadata?.mimeType===k)n.push(r);else if(e===u.THOUGHT){let o=r;if(o.subject){let a=U(o,i);a&&n.push(a);}else o.description&&n.push(d(o.description,i));}else if(e===u.TOOL_CALL_UPDATE||e===u.TOOL_CALL_CONFIRMATION){let o=b(r,i);o&&n.push(o);}else if(e===u.TEXT_CONTENT){let o=r;o.description&&n.push(d(o.description,i));}}return n}function O(t){if("error"in t)return [];let e=t.result;if(!e||!("kind"in e)||e.kind!=="status-update")return [];let i=e.status?.message?.parts;if(!i||i.length===0)return [];let s=e.metadata?.coderAgent?.kind;return w(i,s)}async function*v(t){if(!t.body)return;let e=t.body.getReader(),i=new TextDecoder,n=[],s=createParser({onEvent:r=>{try{n.push(JSON.parse(r.data));}catch{}}});try{for(;;){let{done:r,value:o}=await e.read();if(r)break;for(s.feed(i.decode(o,{stream:!0}));n.length>0;){let a=n.shift();a&&(yield a);}}}finally{e.releaseLock();}}function $(t=createHttpClient()){let e="/api/proxy/builtin/platform/copilot";async function*i(n){try{let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify(n)});if(!s.ok)throw new Error(`Stream request failed: ${s.statusText}`);yield*v(s);}catch{}}return {async*chat(n,s={}){let{taskId:r}=s,o=n.find(c=>c.role==="system"),a=n.filter(c=>c.role!=="system"),m=a[a.length-1],f=m?S(m.content):[{kind:"text",text:""}],g=o?M(o.content):void 0,T={jsonrpc:"2.0",id:l(),method:"message/stream",params:{message:{contextId:h()||l(),kind:"message",messageId:l(),role:"user",parts:f,...r&&{taskId:r},...g&&{metadata:{systemPrompt:g}}}}};for await(let c of i(T)){let x=O(c);x.length>0&&(yield x);}},cancelChat(n){let s={jsonrpc:"2.0",id:l(),method:"tasks/cancel",params:{id:n}};return t.request({url:e,method:"POST",data:s})},getChatStatus(n){let s={jsonrpc:"2.0",id:l(),method:"tasks/get",params:{id:n}};return t.request({url:e,method:"POST",data:s})}}}export{$ as createCopilotA2UIClient};//# sourceMappingURL=index.js.map
2
3
  //# 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-a2ui-client.ts"],"names":["generateUUID","cryptoObj","c","r","extractAppIdFromUrl","url","pathMatch","hostname","domainMatch","convertToA2AParts","content","part","extractTextFromContent","A2UI_MIME_TYPE","DEFAULT_SURFACE_ID","componentIdCounter","generateComponentId","prefix","textPartToA2UI","text","surfaceId","componentId","filePartToA2UI","file","mimeType","thoughtToA2UI","thought","baseId","components","childrenList","toolCallToA2UI","toolCall","toolName","status","iconName","statusText","CODER_AGENT_EVENT","convertA2APartsToA2UI","parts","coderAgentKind","messages","a2uiMsg","data","convertResponseToA2UI","response","result","streamSSEResponse","reader","decoder","queue","parser","createParser","event","done","value","item","createCopilotA2UIClient","http","createHttpClient","baseUrl","sendMessageStream","request","options","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","systemPrompt","a2uiMessages"],"mappings":"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","file":"index.js","sourcesContent":["/* eslint-disable no-undef, no-unused-vars */\nimport type {\n CancelTaskRequest,\n CancelTaskResponse,\n GetTaskRequest,\n GetTaskResponse,\n Part,\n SendStreamingMessageRequest,\n SendStreamingMessageResponse,\n} from \"@a2a-js/sdk\";\nimport { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\nimport { createParser } from \"eventsource-parser\";\nimport { Types } from \"@a2ui/lit/0.8\";\n\n// Re-export A2UI types from @a2ui/lit\nexport type ServerToClientMessage = Types.ServerToClientMessage;\nexport type Surface = Types.Surface;\nexport type MessageProcessor = Types.MessageProcessor;\n\n// ============ UUID Generator ============\n\nfunction generateUUID(): string {\n const cryptoObj = typeof globalThis !== \"undefined\" ? globalThis.crypto : undefined;\n\n if (cryptoObj && typeof cryptoObj.randomUUID === \"function\") {\n return cryptoObj.randomUUID();\n }\n\n if (cryptoObj && typeof cryptoObj.getRandomValues === \"function\") {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const randomValues = cryptoObj.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\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\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n try {\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 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// ============ Input Types ============\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface ImageContent {\n type: \"image\";\n data?: string;\n url?: string;\n mimeType?: string;\n}\n\nexport interface FileContent {\n type: \"file\";\n data?: string;\n url?: string;\n mimeType?: string;\n name?: string;\n}\n\nexport type MessageContent = TextContent | ImageContent | FileContent;\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string | MessageContent[];\n}\n\nexport interface ChatOptions {\n taskId?: string;\n}\n\n// ============ Convert Input to A2A Part ============\n\nfunction convertToA2AParts(content: string | MessageContent[]): Part[] {\n if (typeof content === \"string\") {\n return [{ kind: \"text\", text: content }];\n }\n\n return content\n .map((part): Part | null => {\n switch (part.type) {\n case \"text\":\n return { kind: \"text\", text: part.text };\n case \"image\":\n if (part.data) {\n return {\n kind: \"file\",\n file: { bytes: part.data, mimeType: part.mimeType || \"image/png\" },\n };\n }\n if (part.url) {\n return {\n kind: \"file\",\n file: { uri: part.url, mimeType: part.mimeType || \"image/png\" },\n };\n }\n return null;\n case \"file\":\n if (part.data) {\n return {\n kind: \"file\",\n file: {\n bytes: part.data,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n };\n }\n if (part.url) {\n return {\n kind: \"file\",\n file: {\n uri: part.url,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n };\n }\n return null;\n default:\n return null;\n }\n })\n .filter((part): part is Part => part !== null);\n}\n\nfunction extractTextFromContent(content: string | MessageContent[]): string {\n if (typeof content === \"string\") {\n return content;\n }\n return content\n .filter((part): part is TextContent => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\");\n}\n\n// ============ A2A → A2UI Conversion ============\n//\n// Convert A2A Parts to A2UI ServerToClientMessage:\n// - TextPart → surfaceUpdate with Text component\n// - FilePart (image) → surfaceUpdate with Image component\n// - DataPart (mimeType: application/json+a2ui) → pass through as-is\n//\n// Reference:\n// - A2A: https://github.com/google-a2a/A2A\n// - A2UI: https://a2ui.org/reference/messages/\n\nconst A2UI_MIME_TYPE = \"application/json+a2ui\";\nconst DEFAULT_SURFACE_ID = \"main\";\n\nlet componentIdCounter = 0;\n\nfunction generateComponentId(prefix: string): string {\n return `${prefix}-${++componentIdCounter}`;\n}\n\n/**\n * Convert A2A TextPart to A2UI Text component\n * Reference: https://a2ui-composer.ag-ui.com/components\n */\nfunction textPartToA2UI(text: string, surfaceId: string): ServerToClientMessage {\n const componentId = generateComponentId(\"text\");\n return {\n surfaceUpdate: {\n surfaceId,\n components: [\n {\n id: componentId,\n component: {\n Text: {\n text: { literalString: text },\n usageHint: \"body\",\n },\n },\n },\n ],\n },\n };\n}\n\n/**\n * Convert A2A FilePart (image) to A2UI Image component\n */\nfunction filePartToA2UI(\n file: { bytes?: string; uri?: string; mimeType?: string; name?: string },\n surfaceId: string\n): ServerToClientMessage | null {\n // Only handle image files\n const mimeType = file.mimeType || \"\";\n if (!mimeType.startsWith(\"image/\")) {\n return null;\n }\n\n const componentId = generateComponentId(\"image\");\n const url = file.uri || (file.bytes ? `data:${mimeType};base64,${file.bytes}` : null);\n\n if (!url) {\n return null;\n }\n\n return {\n surfaceUpdate: {\n surfaceId,\n components: [\n {\n id: componentId,\n component: {\n Image: {\n url: { literalString: url },\n },\n },\n },\n ],\n },\n };\n}\n\n/**\n * Convert Thought to A2UI Card with Text components\n * Thought: { subject: string, description: string }\n */\nfunction thoughtToA2UI(\n thought: { subject?: string; description?: string },\n surfaceId: string\n): ServerToClientMessage | null {\n if (!thought.subject && !thought.description) {\n return null;\n }\n\n const baseId = generateComponentId(\"thought\");\n const components: Array<{ id: string; component: Record<string, unknown> }> = [];\n\n // Card container\n components.push({\n id: baseId,\n component: {\n Card: {\n child: `${baseId}-content`,\n },\n },\n });\n\n // Column layout\n const childrenList: string[] = [];\n if (thought.subject) {\n childrenList.push(`${baseId}-subject`);\n }\n if (thought.description) {\n childrenList.push(`${baseId}-desc`);\n }\n\n components.push({\n id: `${baseId}-content`,\n component: {\n Column: {\n children: { explicitList: childrenList },\n },\n },\n });\n\n // Subject (title)\n if (thought.subject) {\n components.push({\n id: `${baseId}-subject`,\n component: {\n Text: {\n text: { literalString: `💭 ${thought.subject}` },\n usageHint: \"h4\",\n },\n },\n });\n }\n\n // Description\n if (thought.description) {\n components.push({\n id: `${baseId}-desc`,\n component: {\n Text: {\n text: { literalString: thought.description },\n usageHint: \"caption\",\n },\n },\n });\n }\n\n return {\n surfaceUpdate: {\n surfaceId,\n components,\n },\n };\n}\n\n/**\n * Convert ToolCall to A2UI Card with Icon and Text components\n * ToolCall: { request: { name, args }, status, tool: { name, displayName, description }, response?, ... }\n */\nfunction toolCallToA2UI(\n toolCall: {\n request?: { name?: string; args?: Record<string, unknown> };\n status?: string;\n tool?: { name?: string; displayName?: string; description?: string };\n response?: { content?: string };\n },\n surfaceId: string\n): ServerToClientMessage | null {\n const toolName =\n toolCall.tool?.displayName || toolCall.tool?.name || toolCall.request?.name || \"Tool\";\n const status = toolCall.status || \"running\";\n\n const baseId = generateComponentId(\"tool\");\n const components: Array<{ id: string; component: Record<string, unknown> }> = [];\n\n // Card container\n components.push({\n id: baseId,\n component: {\n Card: {\n child: `${baseId}-row`,\n },\n },\n });\n\n // Row layout (icon + info)\n components.push({\n id: `${baseId}-row`,\n component: {\n Row: {\n alignment: \"center\",\n children: { explicitList: [`${baseId}-icon`, `${baseId}-info`] },\n },\n },\n });\n\n // Icon\n const iconName =\n status === \"completed\" ? \"check_circle\" : status === \"failed\" ? \"error\" : \"build\";\n components.push({\n id: `${baseId}-icon`,\n component: {\n Icon: {\n name: { literalString: iconName },\n },\n },\n });\n\n // Info column\n components.push({\n id: `${baseId}-info`,\n component: {\n Column: {\n children: { explicitList: [`${baseId}-name`, `${baseId}-status`] },\n },\n },\n });\n\n // Tool name\n components.push({\n id: `${baseId}-name`,\n component: {\n Text: {\n text: { literalString: toolName },\n usageHint: \"body\",\n },\n },\n });\n\n // Status\n const statusText =\n status === \"completed\"\n ? \"✓ Completed\"\n : status === \"failed\"\n ? \"✗ Failed\"\n : status === \"pending\"\n ? \"⏳ Pending...\"\n : \"⚙️ Running...\";\n components.push({\n id: `${baseId}-status`,\n component: {\n Text: {\n text: { literalString: statusText },\n usageHint: \"caption\",\n },\n },\n });\n\n return {\n surfaceUpdate: {\n surfaceId,\n components,\n },\n };\n}\n\n// CoderAgent event types (from agent server)\nconst CODER_AGENT_EVENT = {\n THOUGHT: \"thought\",\n TOOL_CALL_UPDATE: \"tool-call-update\",\n TOOL_CALL_CONFIRMATION: \"tool-call-confirmation\",\n TEXT_CONTENT: \"text-content\",\n} as const;\n\n/**\n * Convert A2A Parts to A2UI ServerToClientMessage[]\n * @param parts - A2A message parts\n * @param coderAgentKind - CoderAgent event type from metadata.coderAgent.kind\n * @param surfaceId - Target surface ID\n */\nfunction convertA2APartsToA2UI(\n parts: Part[],\n coderAgentKind?: string,\n surfaceId: string = DEFAULT_SURFACE_ID\n): ServerToClientMessage[] {\n const messages: ServerToClientMessage[] = [];\n\n for (const part of parts) {\n if (part.kind === \"text\") {\n // TextPart → Text component\n messages.push(textPartToA2UI(part.text, surfaceId));\n } else if (part.kind === \"file\" && \"file\" in part) {\n // FilePart → Image component (for images)\n const file = part.file as { bytes?: string; uri?: string; mimeType?: string; name?: string };\n const a2uiMsg = filePartToA2UI(file, surfaceId);\n if (a2uiMsg) {\n messages.push(a2uiMsg);\n }\n } else if (part.kind === \"data\") {\n const data = part.data as Record<string, unknown>;\n\n // Check if it's A2UI format (pass through)\n if (part.metadata?.mimeType === A2UI_MIME_TYPE) {\n messages.push(data as ServerToClientMessage);\n }\n // Check if it's a Thought (only when coderAgentKind is \"thought\")\n else if (coderAgentKind === CODER_AGENT_EVENT.THOUGHT) {\n // Only treat as thought if it has subject (title), otherwise it's just text content\n const thought = data as { subject?: string; description?: string };\n if (thought.subject) {\n const a2uiMsg = thoughtToA2UI(thought, surfaceId);\n if (a2uiMsg) {\n messages.push(a2uiMsg);\n }\n } else if (thought.description) {\n // No subject = just text content, convert to Text component\n messages.push(textPartToA2UI(thought.description, surfaceId));\n }\n }\n // Check if it's a ToolCall\n else if (\n coderAgentKind === CODER_AGENT_EVENT.TOOL_CALL_UPDATE ||\n coderAgentKind === CODER_AGENT_EVENT.TOOL_CALL_CONFIRMATION\n ) {\n const a2uiMsg = toolCallToA2UI(\n data as {\n request?: { name?: string; args?: Record<string, unknown> };\n status?: string;\n tool?: { name?: string; displayName?: string; description?: string };\n response?: { content?: string };\n },\n surfaceId\n );\n if (a2uiMsg) {\n messages.push(a2uiMsg);\n }\n }\n // Check if it's text-content (DataPart with description but no subject)\n else if (coderAgentKind === CODER_AGENT_EVENT.TEXT_CONTENT) {\n const content = data as { subject?: string; description?: string };\n if (content.description) {\n messages.push(textPartToA2UI(content.description, surfaceId));\n }\n }\n }\n }\n\n return messages;\n}\n\n/**\n * Convert A2A streaming response to A2UI messages\n */\nfunction convertResponseToA2UI(response: SendStreamingMessageResponse): ServerToClientMessage[] {\n if (\"error\" in response) {\n return [];\n }\n\n const result = response.result;\n if (!result || !(\"kind\" in result) || result.kind !== \"status-update\") {\n return [];\n }\n\n const parts = result.status?.message?.parts;\n if (!parts || parts.length === 0) {\n return [];\n }\n\n // Extract coderAgent.kind from metadata\n const metadata = result.metadata as { coderAgent?: { kind?: string } } | undefined;\n const coderAgentKind = metadata?.coderAgent?.kind;\n\n return convertA2APartsToA2UI(parts, coderAgentKind);\n}\n\n// ============ SSE Stream Handling ============\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 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\n }\n },\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.feed(decoder.decode(value, { stream: true }));\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) yield item;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ============ Client ============\n\nexport type CopilotA2UIClient = {\n /**\n * Stream A2UI messages from Copilot Agent.\n *\n * Converts A2A response to A2UI format:\n * - TextPart → Text component\n * - FilePart (image) → Image component\n * - DataPart (A2UI) → pass through\n *\n * @example\n * ```typescript\n * import { Data } from \"@a2ui/lit/0.8\";\n *\n * const processor = Data.createSignalA2uiMessageProcessor();\n *\n * for await (const messages of client.chat([{ role: \"user\", content: \"Hello\" }])) {\n * processor.processMessages(messages);\n * const surfaces = processor.getSurfaces();\n * // Render surfaces\n * }\n * ```\n */\n chat(\n messages: ChatMessage[],\n options?: ChatOptions\n ): AsyncGenerator<ServerToClientMessage[], void, unknown>;\n\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\nexport function createCopilotA2UIClient(http: HttpClient = createHttpClient()): CopilotA2UIClient {\n const baseUrl = \"/api/proxy/builtin/platform/copilot\";\n\n async function* sendMessageStream(\n request: SendStreamingMessageRequest\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n try {\n const response = await fetch(baseUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\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\n }\n }\n\n return {\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 parts = lastUserMsg\n ? convertToA2AParts(lastUserMsg.content)\n : [{ kind: \"text\" as const, text: \"\" }];\n\n const systemPrompt = systemMsg ? extractTextFromContent(systemMsg.content) : undefined;\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,\n ...(taskId && { taskId }),\n ...(systemPrompt && { metadata: { systemPrompt } }),\n },\n },\n };\n\n for await (const response of sendMessageStream(request)) {\n const a2uiMessages = convertResponseToA2UI(response);\n if (a2uiMessages.length > 0) {\n yield a2uiMessages;\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 http.request<CancelTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\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 http.request<GetTaskResponse>({\n url: baseUrl,\n method: \"POST\",\n data: request,\n });\n },\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.1",
3
+ "version": "1.0.0-beta.11",
4
4
  "description": "AI copilot chat client with streaming support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -31,17 +31,15 @@
31
31
  "registry": "https://registry.npmjs.org/"
32
32
  },
33
33
  "dependencies": {
34
- "@amaster.ai/http-client": "1.0.0-beta.1"
34
+ "@a2ui/lit": "^0.8.1",
35
+ "eventsource-parser": "^3.0.6",
36
+ "@amaster.ai/http-client": "1.0.0-beta.11"
35
37
  },
36
38
  "peerDependencies": {
37
- "@a2a-js/sdk": "^0.3.7",
38
- "axios": "^1.11.0",
39
- "eventsource-parser": "^3.0.6"
39
+ "@a2a-js/sdk": "^0.3.7"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@a2a-js/sdk": "^0.3.7",
43
- "axios": "^1.11.0",
44
- "eventsource-parser": "^3.0.6",
45
43
  "tsup": "^8.3.5",
46
44
  "typescript": "~5.7.2"
47
45
  },