@amaster.ai/copilot-client 1.1.0-beta.45 → 1.1.0-beta.46

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,4 +1,4 @@
1
- 'use strict';var httpClient=require('@amaster.ai/http-client'),eventsourceParser=require('eventsource-parser'),M=require('miniprogram-text-decoder'),b=require('miniprogram-text-encoder');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var M__default=/*#__PURE__*/_interopDefault(M);var b__default=/*#__PURE__*/_interopDefault(b);var r=globalThis;function v(){return typeof r?.Taro?.request=="function"?r.Taro.request.bind(r.Taro):typeof r?.wx?.request=="function"?r.wx.request.bind(r.wx):typeof r?.tt?.request=="function"?r.tt.request.bind(r.tt):typeof r?.my?.request=="function"?r.my.request.bind(r.my):typeof r?.swan?.request=="function"?r.swan.request.bind(r.swan):typeof r?.qq?.request=="function"?r.qq.request.bind(r.qq):typeof r?.jd?.request=="function"?r.jd.request.bind(r.jd):null}function S(){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 o=(t.getRandomValues(new Uint8Array(1))[0]??0)%16;return (e==="x"?o:o&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let l=Math.random()*16|0;return (e==="x"?l:l&3|8).toString(16)})}function R(t){let e=/^www\.([\da-f-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);if(e?.[1])return e[1];let l=/^([\da-f-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);return l?.[1]?l[1]:null}function I(){if(typeof window>"u")return null;try{let t=window.location.href,e=/\/app\/([\da-f-]+)(?:\/|$)/.exec(t);return e?.[1]?e[1]:R(window.location.hostname)}catch{return null}}var C=null;function k(t){let e=t?R(t):I();return e||(C||(C=S()),C)}async function O(t,e,l={}){return new Promise(o=>{let n=new Uint8Array(0),p=new M__default.default("utf-8",{fatal:false}),x=false,i=false,u=[],d=null,y=()=>new Promise(a=>{u.length>0?a(u.shift()):x?a(null):d=a;}),f=a=>{a&&(u.push(a),d&&(d(u.shift()),d=null));},m=a=>{if(!(i||x||!a.data))try{let s=new Uint8Array(a.data),c=new Uint8Array(n.length+s.length);c.set(n),c.set(s,n.length),n=c;let T=0;for(;T<n.length;){let q=n.subarray(T),w=p.decode(q,{stream:!1});if(w)f(w),T+=new b__default.default().encode(w).length;else break}T<n.length?n=n.subarray(T):n=new Uint8Array(0);}catch(s){console.error("[mini stream] chunk process error:",s);}},h=a=>{a.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},g=r.wx.request.bind(r.wx);try{let a=g({url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...l},data:typeof e=="string"?e:JSON.stringify(e),responseType:"arraybuffer",enableChunked:!0,timeout:3e5,success:()=>{if(n.length>0){let s=p.decode(n,{stream:!0});f(s);}x=!0,d&&d(null);},fail:s=>{console.error("[mini stream] request fail:",s),i=!0,x=!0,d&&d(null);}});a.onChunkReceived?.(m),a.onHeadersReceived?.(h),o({ok:!0,statusText:"OK",read:async()=>i?null:y()});}catch(a){console.error("miniReq error",a);}})}async function U(t,e,l){let o=l?.(),n=o?{Authorization:`Bearer ${o}`}:{};if(typeof r?.wx?.request=="function")return O(t,e,n);let p=v();if(p)return new Promise(y=>{let f="",m=false,h=false,g=0,a={url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...n},data:typeof e=="string"?e:JSON.stringify(e),timeout:6e4,success:s=>{f=typeof s.data=="string"?s.data:JSON.stringify(s.data),m=true;},fail:s=>{console.error("[createStream] wx.request failed:",s),h=true,m=true;},complete:()=>{}};try{let s=p(a);s&&typeof s.then=="function"&&s.then(c=>{f=typeof c.data=="string"?c.data:JSON.stringify(c.data),m=!0;}).catch(()=>{h=!0,m=!0;});}catch(s){console.error("[createStream] Exception:",s),h=true,m=true;}y({ok:true,statusText:"OK",read:async()=>{for(;!m&&g>=f.length;)await new Promise(c=>setTimeout(c,50));if(h)return null;if(g>=f.length)return m?null:"";let s=f.slice(g);return g=f.length,s}});});let x={"Content-Type":"application/json",...n},i=await fetch(t,{method:"POST",headers:x,credentials:"include",body:JSON.stringify(e)});if(!i.body)return {ok:i.ok,statusText:i.statusText,read:async()=>null};let u=i.body.getReader(),d=new TextDecoder;return {ok:i.ok,statusText:i.statusText,read:async()=>{let{done:y,value:f}=await u.read();return y?null:d.decode(f,{stream:true})}}}function E(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 _(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
1
+ 'use strict';var httpClient=require('@amaster.ai/http-client'),eventsourceParser=require('eventsource-parser'),M=require('miniprogram-text-decoder'),b=require('miniprogram-text-encoder');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var M__default=/*#__PURE__*/_interopDefault(M);var b__default=/*#__PURE__*/_interopDefault(b);var r=globalThis;function v(){return typeof r?.Taro?.request=="function"?r.Taro.request.bind(r.Taro):typeof r?.wx?.request=="function"?r.wx.request.bind(r.wx):typeof r?.tt?.request=="function"?r.tt.request.bind(r.tt):typeof r?.my?.request=="function"?r.my.request.bind(r.my):typeof r?.swan?.request=="function"?r.swan.request.bind(r.swan):typeof r?.qq?.request=="function"?r.qq.request.bind(r.qq):typeof r?.jd?.request=="function"?r.jd.request.bind(r.jd):null}function S(){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 o=(t.getRandomValues(new Uint8Array(1))[0]??0)%16;return (e==="x"?o:o&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let l=Math.random()*16|0;return (e==="x"?l:l&3|8).toString(16)})}function R(t){let e=/^www\.([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);if(e?.[1])return e[1];let l=/^([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);return l?.[1]?l[1]:null}function I(){if(typeof window>"u")return null;try{let t=window.location.href,e=/\/app\/([\da-z-]+)(?:\/|$)/.exec(t);return e?.[1]?e[1]:R(window.location.hostname)}catch{return null}}var C=null;function k(t){let e=t?R(t):I();return e||(C||(C=S()),C)}async function O(t,e,l={}){return new Promise(o=>{let n=new Uint8Array(0),p=new M__default.default("utf-8",{fatal:false}),x=false,i=false,u=[],d=null,y=()=>new Promise(a=>{u.length>0?a(u.shift()):x?a(null):d=a;}),f=a=>{a&&(u.push(a),d&&(d(u.shift()),d=null));},m=a=>{if(!(i||x||!a.data))try{let s=new Uint8Array(a.data),c=new Uint8Array(n.length+s.length);c.set(n),c.set(s,n.length),n=c;let T=0;for(;T<n.length;){let q=n.subarray(T),w=p.decode(q,{stream:!1});if(w)f(w),T+=new b__default.default().encode(w).length;else break}T<n.length?n=n.subarray(T):n=new Uint8Array(0);}catch(s){console.error("[mini stream] chunk process error:",s);}},h=a=>{a.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},g=r.wx.request.bind(r.wx);try{let a=g({url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...l},data:typeof e=="string"?e:JSON.stringify(e),responseType:"arraybuffer",enableChunked:!0,timeout:3e5,success:()=>{if(n.length>0){let s=p.decode(n,{stream:!0});f(s);}x=!0,d&&d(null);},fail:s=>{console.error("[mini stream] request fail:",s),i=!0,x=!0,d&&d(null);}});a.onChunkReceived?.(m),a.onHeadersReceived?.(h),o({ok:!0,statusText:"OK",read:async()=>i?null:y()});}catch(a){console.error("miniReq error",a);}})}async function U(t,e,l){let o=l?.(),n=o?{Authorization:`Bearer ${o}`}:{};if(typeof r?.wx?.request=="function")return O(t,e,n);let p=v();if(p)return new Promise(y=>{let f="",m=false,h=false,g=0,a={url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...n},data:typeof e=="string"?e:JSON.stringify(e),timeout:6e4,success:s=>{f=typeof s.data=="string"?s.data:JSON.stringify(s.data),m=true;},fail:s=>{console.error("[createStream] wx.request failed:",s),h=true,m=true;},complete:()=>{}};try{let s=p(a);s&&typeof s.then=="function"&&s.then(c=>{f=typeof c.data=="string"?c.data:JSON.stringify(c.data),m=!0;}).catch(()=>{h=!0,m=!0;});}catch(s){console.error("[createStream] Exception:",s),h=true,m=true;}y({ok:true,statusText:"OK",read:async()=>{for(;!m&&g>=f.length;)await new Promise(c=>setTimeout(c,50));if(h)return null;if(g>=f.length)return m?null:"";let s=f.slice(g);return g=f.length,s}});});let x={"Content-Type":"application/json",...n},i=await fetch(t,{method:"POST",headers:x,credentials:"include",body:JSON.stringify(e)});if(!i.body)return {ok:i.ok,statusText:i.statusText,read:async()=>null};let u=i.body.getReader(),d=new TextDecoder;return {ok:i.ok,statusText:i.statusText,read:async()=>{let{done:y,value:f}=await u.read();return y?null:d.decode(f,{stream:true})}}}function E(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 _(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
2
2
  `)}async function*j(t){let e=[],l=eventsourceParser.createParser({onEvent:o=>{try{e.push(JSON.parse(o.data));}catch(n){console.error("[parseSSEStream] Parse error:",n);}}});try{for(;;){let o=await t.read();if(o===null)break;if(o)for(l.feed(o);e.length>0;){let n=e.shift();n&&(yield n);}}}catch(o){console.error("[parseSSEStream] Stream error:",o);}}function B(t=httpClient.createHttpClient(),e,l){let o="",n=undefined;if(n&&(o=n.TARO_APP_API_BASE_URL||n.VITE_API_BASE_URL||""),!o)try{o=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||"";}catch{}o=String(o||"").trim();let p=`${e||o}/api/proxy/builtin/platform/copilot`;async function*x(i){try{let u=await U(p,i,l);if(!u.ok)throw new Error(`Stream request failed: ${u.statusText}`);yield*j(u);}catch(u){console.error("[sendMessageStream] Error:",u);}}return {async*chat(i,u={}){let{taskId:d}=u,y=i.find(c=>c.role==="system"),f=i.filter(c=>c.role!=="system"),m=f[f.length-1],h=m?E(m.content):[{kind:"text",text:""}],g=y?_(y.content):void 0,a=k();if(typeof r?.wx?.request=="function"){let c=p?p.replace(/^https?:\/\//,"").split("/")[0]:"";a=k(c);}let s={jsonrpc:"2.0",id:S(),method:"message/stream",params:{message:{contextId:a,kind:"message",messageId:S(),role:"user",parts:h,...d&&{taskId:d},...g&&{metadata:{systemPrompt:g}}}}};for await(let c of x(s))yield c;},cancelChat(i){let u={jsonrpc:"2.0",id:S(),method:"tasks/cancel",params:{id:i}};return t.request({url:p,method:"POST",data:u})},getChatStatus(i){let u={jsonrpc:"2.0",id:S(),method:"tasks/get",params:{id:i}};return t.request({url:p,method:"POST",data:u})}}}
3
3
  exports.createCopilotClient=B;//# sourceMappingURL=index.cjs.map
4
4
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/copilot-client.ts"],"names":["g","getMiniProgramRequest","generateUUID","cryptoObj","c","r","getAppIdFromHostname","hostname","wwwMatch","domainMatch","extractAppIdFromUrl","url","pathMatch","cachedAppId","getAppId","urlAppId","createWeChatMiniProgramStream","data","authHeader","resolve","chunkBuffer","textDecoder","MiniProgramTextDecoder","ended","errorOccurred","dataQueue","resolveRead","pendingRead","pushChunk","text","chunkListener","res","newChunk","merged","decodeOffset","partial","decoded","MiniProgramTextEncoder","err","headersListener","miniReq","requestTask","finalText","error","createStream","getAccessToken","token","buffer","completed","failed","position","opts","ret","chunk","headers","response","reader","decoder","done","value","convertToA2AParts","content","part","extractTextFromContent","parseSSEStream","streamResponse","queue","parser","createParser","event","item","createCopilotClient","http","createHttpClient","baseUrl","envBaseUrl","metaEnv","sendMessageStream","request","messages","chatOptions","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","parts","systemPrompt","contextId"],"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 {\n type ClientResult,\n createHttpClient,\n type HttpClient,\n} from \"@amaster.ai/http-client\";\nimport { createParser } from \"eventsource-parser\";\nimport MiniProgramTextDecoder from \"miniprogram-text-decoder\";\nimport MiniProgramTextEncoder from \"miniprogram-text-encoder\";\n\n// ============ Internal: Platform Detection (same as http-client) ============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst g = globalThis as any;\n\nfunction getMiniProgramRequest(): ((_opts: any) => any) | null {\n if (typeof g?.Taro?.request === \"function\")\n return g.Taro.request.bind(g.Taro);\n if (typeof g?.wx?.request === \"function\") return g.wx.request.bind(g.wx);\n if (typeof g?.tt?.request === \"function\") return g.tt.request.bind(g.tt);\n if (typeof g?.my?.request === \"function\") return g.my.request.bind(g.my);\n if (typeof g?.swan?.request === \"function\")\n return g.swan.request.bind(g.swan);\n if (typeof g?.qq?.request === \"function\") return g.qq.request.bind(g.qq);\n if (typeof g?.jd?.request === \"function\") return g.jd.request.bind(g.jd);\n return null;\n}\n\n// ============ Internal: UUID Generator ============\n\nfunction generateUUID(): string {\n const cryptoObj =\n 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\n// ============ Internal: URL Utilities ============\n\nfunction getAppIdFromHostname(hostname: string): string | null {\n // Pattern 1: www.{app_id}.domain.tld or www.{app_id}-{env}.domain.tld\n const wwwMatch =\n /^www\\.([\\da-f-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (wwwMatch?.[1]) return wwwMatch[1];\n\n // Pattern 2: {app_id}-{env}.domain.tld or {app_id}.domain.tld\n const domainMatch = /^([\\da-f-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(\n hostname,\n );\n if (domainMatch?.[1]) return domainMatch[1];\n\n return null;\n}\n\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-f-]+)(?:\\/|$)/.exec(url);\n if (pathMatch?.[1]) return pathMatch[1];\n return getAppIdFromHostname(window.location.hostname);\n } catch {\n return null;\n }\n}\n\n// Cache appId for session consistency\nlet cachedAppId: string | null = null;\n\nfunction getAppId(hostname?: string): string {\n const urlAppId = hostname\n ? getAppIdFromHostname(hostname)\n : extractAppIdFromUrl();\n if (urlAppId) return urlAppId;\n if (!cachedAppId) cachedAppId = generateUUID();\n return cachedAppId;\n}\n\n// ============ Internal: Streaming ============\n\ninterface StreamResponse {\n ok: boolean;\n statusText: string;\n read(): Promise<string | null>;\n}\n\n// 小程序专用的流式请求\nasync function createWeChatMiniProgramStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string> = {},\n): Promise<StreamResponse> {\n return new Promise<StreamResponse>((resolve) => {\n let chunkBuffer = new Uint8Array(0); // 字节缓冲,用于处理 UTF-8 截断\n const textDecoder = new MiniProgramTextDecoder(\"utf-8\", {\n fatal: false,\n });\n\n let ended = false;\n let errorOccurred = false;\n\n // 用于外部调用 read() 时取数据的队列\n const dataQueue: string[] = [];\n let resolveRead: ((value: string | null) => void) | null = null;\n\n const pendingRead = () =>\n new Promise<string | null>((r) => {\n if (dataQueue.length > 0) {\n r(dataQueue.shift()!);\n } else if (ended) {\n r(null);\n } else {\n resolveRead = r;\n }\n });\n\n const pushChunk = (text: string) => {\n if (text) {\n dataQueue.push(text);\n if (resolveRead) {\n resolveRead(dataQueue.shift()!);\n resolveRead = null;\n }\n }\n };\n\n const chunkListener = (res: any) => {\n if (errorOccurred || ended || !res.data) return;\n\n try {\n const newChunk = new Uint8Array(res.data as ArrayBuffer);\n // 追加到缓冲\n const merged = new Uint8Array(chunkBuffer.length + newChunk.length);\n merged.set(chunkBuffer);\n merged.set(newChunk, chunkBuffer.length);\n chunkBuffer = merged;\n\n // 尝试解码尽可能多的完整字符\n let decodeOffset = 0;\n while (decodeOffset < chunkBuffer.length) {\n const partial = chunkBuffer.subarray(decodeOffset);\n const decoded = textDecoder.decode(partial, { stream: false });\n\n // 如果解码出内容,说明前面是完整字符\n if (decoded) {\n pushChunk(decoded);\n // 移动偏移(注意:TextDecoder 内部会处理多字节边界)\n // 但为了安全,我们粗略估算已消费字节(不完美但够用)\n // 实际生产中可使用更精确的边界检测\n decodeOffset += new MiniProgramTextEncoder().encode(decoded).length;\n } else {\n // 剩余部分可能是半个字符,留到下次\n break;\n }\n }\n\n // 保留未解码的部分\n if (decodeOffset < chunkBuffer.length) {\n chunkBuffer = chunkBuffer.subarray(decodeOffset);\n } else {\n chunkBuffer = new Uint8Array(0);\n }\n } catch (err) {\n console.error(\"[mini stream] chunk process error:\", err);\n }\n };\n\n const headersListener = (res: any) => {\n if (\n res.header?.[\"content-type\"]?.includes(\"text/event-stream\") === false\n ) {\n console.warn(\"Warning: server did not return event-stream\");\n }\n };\n\n const miniReq = g.wx.request.bind(g.wx);\n\n try {\n const requestTask = miniReq({\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n responseType: \"arraybuffer\", // 必须!\n enableChunked: true, // 必须!\n timeout: 300000,\n\n success: () => {\n // 成功结束时,把剩余缓冲区解码\n if (chunkBuffer.length > 0) {\n const finalText = textDecoder.decode(chunkBuffer, {\n stream: true,\n });\n pushChunk(finalText);\n }\n ended = true;\n if (resolveRead) resolveRead(null);\n },\n\n fail: (err: any) => {\n console.error(\"[mini stream] request fail:\", err);\n errorOccurred = true;\n ended = true;\n if (resolveRead) resolveRead(null);\n },\n });\n // 关键:监听分块到达\n requestTask.onChunkReceived?.(chunkListener);\n // 可选:监听 HTTP headers 到达(可用于检查状态码)\n requestTask.onHeadersReceived?.(headersListener);\n\n resolve({\n ok: true, // 稍后可根据 headers 更精确判断\n statusText: \"OK\",\n read: async () => {\n if (errorOccurred) return null;\n return pendingRead();\n },\n });\n } catch (error) {\n console.error(\"miniReq error\", error);\n }\n });\n}\n\nasync function createStream(\n url: string,\n data: unknown,\n getAccessToken?: () => string | null,\n): Promise<StreamResponse> {\n // Get token for authentication\n const token = getAccessToken?.();\n const authHeader: Record<string, string> = token\n ? { Authorization: `Bearer ${token}` }\n : {};\n\n if (typeof g?.wx?.request === \"function\") {\n return createWeChatMiniProgramStream(url, data, authHeader);\n }\n const miniReq = getMiniProgramRequest();\n if (miniReq) {\n // Mini-program: buffer full response\n return new Promise((resolve) => {\n let buffer = \"\";\n let completed = false;\n let failed = false;\n let position = 0;\n\n const opts = {\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n timeout: 60000,\n success: (res: any) => {\n buffer =\n typeof res.data === \"string\" ? res.data : JSON.stringify(res.data);\n completed = true;\n },\n fail: (err: any) => {\n console.error(\"[createStream] wx.request failed:\", err);\n failed = true;\n completed = true;\n },\n complete: () => {},\n };\n\n try {\n const ret = miniReq(opts);\n\n if (ret && typeof ret.then === \"function\") {\n ret\n .then((res: any) => {\n buffer =\n typeof res.data === \"string\"\n ? res.data\n : JSON.stringify(res.data);\n completed = true;\n })\n .catch(() => {\n failed = true;\n completed = true;\n });\n }\n } catch (err) {\n console.error(\"[createStream] Exception:\", err);\n failed = true;\n completed = true;\n }\n\n resolve({\n ok: true,\n statusText: \"OK\",\n read: async () => {\n while (!completed && position >= buffer.length) {\n await new Promise((r) => setTimeout(r, 50));\n }\n if (failed) return null;\n if (position >= buffer.length) return completed ? null : \"\";\n const chunk = buffer.slice(position);\n position = buffer.length;\n return chunk;\n },\n });\n });\n }\n\n // Browser: use fetch streaming with authentication\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeader,\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify(data),\n });\n\n if (!response.body) {\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => null,\n };\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => {\n const { done, value } = await reader.read();\n if (done) return null;\n return decoder.decode(value, { stream: true });\n },\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: {\n bytes: part.data,\n mimeType: part.mimeType || \"image/png\",\n },\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// ============ SSE Stream Handling ============\n\nasync function* parseSSEStream(\n streamResponse: StreamResponse,\n): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n const queue: SendStreamingMessageResponse[] = [];\n\n const parser = createParser({\n onEvent: (event) => {\n try {\n queue.push(JSON.parse(event.data));\n } catch (err) {\n console.error(\"[parseSSEStream] Parse error:\", err);\n // Ignore parse errors\n }\n },\n });\n\n try {\n while (true) {\n const chunk = await streamResponse.read();\n if (chunk === null) {\n break;\n }\n if (chunk) {\n parser.feed(chunk);\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n yield item;\n }\n }\n }\n }\n } catch (err) {\n console.error(\"[parseSSEStream] Stream error:\", err);\n // Ignore stream errors\n }\n}\n\n// ============ Client ============\n\nexport type CopilotClient = {\n /**\n * Stream messages from Copilot Agent.\n *\n * @example\n * ```typescript\n * import { createCopilotClient, Data } from \"@amaster.ai/copilot-client\";\n *\n * const client = createCopilotClient();\n *\n * for await (const response of client.chat([{ role: \"user\", content: \"Hello\" }])) {\n * // deal response\n * }\n * ```\n */\n chat(\n messages: ChatMessage[],\n options?: ChatOptions,\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\n/**\n * Create Copilot client\n *\n * Auto-detects runtime environment (Browser/Vite/Taro H5/Taro Mini-program)\n */\nexport function createCopilotClient(\n http: HttpClient = createHttpClient(),\n baseUrl?: string,\n getAccessToken?: () => string | null,\n): CopilotClient {\n let envBaseUrl = \"\";\n\n // Vite/H5:必须直接写 import.meta.env,Vite 才能正确处理\n const metaEnv = (import.meta as any)?.env;\n if (metaEnv) {\n envBaseUrl =\n metaEnv.TARO_APP_API_BASE_URL || metaEnv.VITE_API_BASE_URL || \"\";\n }\n\n // Taro 小程序 build:defineConstants 会把 process.env.xxx 替换为字面量\n // H5 环境:process 不存在会抛 ReferenceError,这里用 try/catch 吞掉\n if (!envBaseUrl) {\n try {\n envBaseUrl =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined -> ignore\n }\n }\n\n envBaseUrl = String(envBaseUrl || \"\").trim();\n const url = `${baseUrl || envBaseUrl}/api/proxy/builtin/platform/copilot`;\n\n async function* sendMessageStream(\n request: SendStreamingMessageRequest,\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n try {\n const streamResponse = await createStream(url, request, getAccessToken);\n\n if (!streamResponse.ok) {\n throw new Error(`Stream request failed: ${streamResponse.statusText}`);\n }\n\n yield* parseSSEStream(streamResponse);\n } catch (err) {\n console.error(\"[sendMessageStream] Error:\", err);\n // Ignore stream errors\n }\n }\n\n return {\n async *chat(messages, chatOptions = {}) {\n const { taskId } = chatOptions;\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\n ? extractTextFromContent(systemMsg.content)\n : undefined;\n\n let contextId = getAppId();\n\n if (typeof g?.wx?.request === \"function\") {\n // 从 url 取 hostname,再从 hostname 取 appId,保证小程序环境下的 session 一致性\n const hostname = url\n ? url.replace(/^https?:\\/\\//, \"\").split(\"/\")[0]\n : \"\";\n contextId = getAppId(hostname);\n }\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId,\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 yield response;\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,\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,\n method: \"POST\",\n data: request,\n });\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/copilot-client.ts"],"names":["g","getMiniProgramRequest","generateUUID","cryptoObj","c","r","getAppIdFromHostname","hostname","wwwMatch","domainMatch","extractAppIdFromUrl","url","pathMatch","cachedAppId","getAppId","urlAppId","createWeChatMiniProgramStream","data","authHeader","resolve","chunkBuffer","textDecoder","MiniProgramTextDecoder","ended","errorOccurred","dataQueue","resolveRead","pendingRead","pushChunk","text","chunkListener","res","newChunk","merged","decodeOffset","partial","decoded","MiniProgramTextEncoder","err","headersListener","miniReq","requestTask","finalText","error","createStream","getAccessToken","token","buffer","completed","failed","position","opts","ret","chunk","headers","response","reader","decoder","done","value","convertToA2AParts","content","part","extractTextFromContent","parseSSEStream","streamResponse","queue","parser","createParser","event","item","createCopilotClient","http","createHttpClient","baseUrl","envBaseUrl","metaEnv","sendMessageStream","request","messages","chatOptions","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","parts","systemPrompt","contextId"],"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 {\n type ClientResult,\n createHttpClient,\n type HttpClient,\n} from \"@amaster.ai/http-client\";\nimport { createParser } from \"eventsource-parser\";\nimport MiniProgramTextDecoder from \"miniprogram-text-decoder\";\nimport MiniProgramTextEncoder from \"miniprogram-text-encoder\";\n\n// ============ Internal: Platform Detection (same as http-client) ============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst g = globalThis as any;\n\nfunction getMiniProgramRequest(): ((_opts: any) => any) | null {\n if (typeof g?.Taro?.request === \"function\")\n return g.Taro.request.bind(g.Taro);\n if (typeof g?.wx?.request === \"function\") return g.wx.request.bind(g.wx);\n if (typeof g?.tt?.request === \"function\") return g.tt.request.bind(g.tt);\n if (typeof g?.my?.request === \"function\") return g.my.request.bind(g.my);\n if (typeof g?.swan?.request === \"function\")\n return g.swan.request.bind(g.swan);\n if (typeof g?.qq?.request === \"function\") return g.qq.request.bind(g.qq);\n if (typeof g?.jd?.request === \"function\") return g.jd.request.bind(g.jd);\n return null;\n}\n\n// ============ Internal: UUID Generator ============\n\nfunction generateUUID(): string {\n const cryptoObj =\n 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\n// ============ Internal: URL Utilities ============\n\nfunction getAppIdFromHostname(hostname: string): string | null {\n // Pattern 1: www.{app_id}.domain.tld or www.{app_id}-{env}.domain.tld\n const wwwMatch =\n /^www\\.([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (wwwMatch?.[1]) return wwwMatch[1];\n\n // Pattern 2: {app_id}-{env}.domain.tld or {app_id}.domain.tld\n const domainMatch = /^([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(\n hostname,\n );\n if (domainMatch?.[1]) return domainMatch[1];\n\n return null;\n}\n\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-z-]+)(?:\\/|$)/.exec(url);\n if (pathMatch?.[1]) return pathMatch[1];\n return getAppIdFromHostname(window.location.hostname);\n } catch {\n return null;\n }\n}\n\n// Cache appId for session consistency\nlet cachedAppId: string | null = null;\n\nfunction getAppId(hostname?: string): string {\n const urlAppId = hostname\n ? getAppIdFromHostname(hostname)\n : extractAppIdFromUrl();\n if (urlAppId) return urlAppId;\n if (!cachedAppId) cachedAppId = generateUUID();\n return cachedAppId;\n}\n\n// ============ Internal: Streaming ============\n\ninterface StreamResponse {\n ok: boolean;\n statusText: string;\n read(): Promise<string | null>;\n}\n\n// 小程序专用的流式请求\nasync function createWeChatMiniProgramStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string> = {},\n): Promise<StreamResponse> {\n return new Promise<StreamResponse>((resolve) => {\n let chunkBuffer = new Uint8Array(0); // 字节缓冲,用于处理 UTF-8 截断\n const textDecoder = new MiniProgramTextDecoder(\"utf-8\", {\n fatal: false,\n });\n\n let ended = false;\n let errorOccurred = false;\n\n // 用于外部调用 read() 时取数据的队列\n const dataQueue: string[] = [];\n let resolveRead: ((value: string | null) => void) | null = null;\n\n const pendingRead = () =>\n new Promise<string | null>((r) => {\n if (dataQueue.length > 0) {\n r(dataQueue.shift()!);\n } else if (ended) {\n r(null);\n } else {\n resolveRead = r;\n }\n });\n\n const pushChunk = (text: string) => {\n if (text) {\n dataQueue.push(text);\n if (resolveRead) {\n resolveRead(dataQueue.shift()!);\n resolveRead = null;\n }\n }\n };\n\n const chunkListener = (res: any) => {\n if (errorOccurred || ended || !res.data) return;\n\n try {\n const newChunk = new Uint8Array(res.data as ArrayBuffer);\n // 追加到缓冲\n const merged = new Uint8Array(chunkBuffer.length + newChunk.length);\n merged.set(chunkBuffer);\n merged.set(newChunk, chunkBuffer.length);\n chunkBuffer = merged;\n\n // 尝试解码尽可能多的完整字符\n let decodeOffset = 0;\n while (decodeOffset < chunkBuffer.length) {\n const partial = chunkBuffer.subarray(decodeOffset);\n const decoded = textDecoder.decode(partial, { stream: false });\n\n // 如果解码出内容,说明前面是完整字符\n if (decoded) {\n pushChunk(decoded);\n // 移动偏移(注意:TextDecoder 内部会处理多字节边界)\n // 但为了安全,我们粗略估算已消费字节(不完美但够用)\n // 实际生产中可使用更精确的边界检测\n decodeOffset += new MiniProgramTextEncoder().encode(decoded).length;\n } else {\n // 剩余部分可能是半个字符,留到下次\n break;\n }\n }\n\n // 保留未解码的部分\n if (decodeOffset < chunkBuffer.length) {\n chunkBuffer = chunkBuffer.subarray(decodeOffset);\n } else {\n chunkBuffer = new Uint8Array(0);\n }\n } catch (err) {\n console.error(\"[mini stream] chunk process error:\", err);\n }\n };\n\n const headersListener = (res: any) => {\n if (\n res.header?.[\"content-type\"]?.includes(\"text/event-stream\") === false\n ) {\n console.warn(\"Warning: server did not return event-stream\");\n }\n };\n\n const miniReq = g.wx.request.bind(g.wx);\n\n try {\n const requestTask = miniReq({\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n responseType: \"arraybuffer\", // 必须!\n enableChunked: true, // 必须!\n timeout: 300000,\n\n success: () => {\n // 成功结束时,把剩余缓冲区解码\n if (chunkBuffer.length > 0) {\n const finalText = textDecoder.decode(chunkBuffer, {\n stream: true,\n });\n pushChunk(finalText);\n }\n ended = true;\n if (resolveRead) resolveRead(null);\n },\n\n fail: (err: any) => {\n console.error(\"[mini stream] request fail:\", err);\n errorOccurred = true;\n ended = true;\n if (resolveRead) resolveRead(null);\n },\n });\n // 关键:监听分块到达\n requestTask.onChunkReceived?.(chunkListener);\n // 可选:监听 HTTP headers 到达(可用于检查状态码)\n requestTask.onHeadersReceived?.(headersListener);\n\n resolve({\n ok: true, // 稍后可根据 headers 更精确判断\n statusText: \"OK\",\n read: async () => {\n if (errorOccurred) return null;\n return pendingRead();\n },\n });\n } catch (error) {\n console.error(\"miniReq error\", error);\n }\n });\n}\n\nasync function createStream(\n url: string,\n data: unknown,\n getAccessToken?: () => string | null,\n): Promise<StreamResponse> {\n // Get token for authentication\n const token = getAccessToken?.();\n const authHeader: Record<string, string> = token\n ? { Authorization: `Bearer ${token}` }\n : {};\n\n if (typeof g?.wx?.request === \"function\") {\n return createWeChatMiniProgramStream(url, data, authHeader);\n }\n const miniReq = getMiniProgramRequest();\n if (miniReq) {\n // Mini-program: buffer full response\n return new Promise((resolve) => {\n let buffer = \"\";\n let completed = false;\n let failed = false;\n let position = 0;\n\n const opts = {\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n timeout: 60000,\n success: (res: any) => {\n buffer =\n typeof res.data === \"string\" ? res.data : JSON.stringify(res.data);\n completed = true;\n },\n fail: (err: any) => {\n console.error(\"[createStream] wx.request failed:\", err);\n failed = true;\n completed = true;\n },\n complete: () => {},\n };\n\n try {\n const ret = miniReq(opts);\n\n if (ret && typeof ret.then === \"function\") {\n ret\n .then((res: any) => {\n buffer =\n typeof res.data === \"string\"\n ? res.data\n : JSON.stringify(res.data);\n completed = true;\n })\n .catch(() => {\n failed = true;\n completed = true;\n });\n }\n } catch (err) {\n console.error(\"[createStream] Exception:\", err);\n failed = true;\n completed = true;\n }\n\n resolve({\n ok: true,\n statusText: \"OK\",\n read: async () => {\n while (!completed && position >= buffer.length) {\n await new Promise((r) => setTimeout(r, 50));\n }\n if (failed) return null;\n if (position >= buffer.length) return completed ? null : \"\";\n const chunk = buffer.slice(position);\n position = buffer.length;\n return chunk;\n },\n });\n });\n }\n\n // Browser: use fetch streaming with authentication\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeader,\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify(data),\n });\n\n if (!response.body) {\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => null,\n };\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => {\n const { done, value } = await reader.read();\n if (done) return null;\n return decoder.decode(value, { stream: true });\n },\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: {\n bytes: part.data,\n mimeType: part.mimeType || \"image/png\",\n },\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// ============ SSE Stream Handling ============\n\nasync function* parseSSEStream(\n streamResponse: StreamResponse,\n): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n const queue: SendStreamingMessageResponse[] = [];\n\n const parser = createParser({\n onEvent: (event) => {\n try {\n queue.push(JSON.parse(event.data));\n } catch (err) {\n console.error(\"[parseSSEStream] Parse error:\", err);\n // Ignore parse errors\n }\n },\n });\n\n try {\n while (true) {\n const chunk = await streamResponse.read();\n if (chunk === null) {\n break;\n }\n if (chunk) {\n parser.feed(chunk);\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n yield item;\n }\n }\n }\n }\n } catch (err) {\n console.error(\"[parseSSEStream] Stream error:\", err);\n // Ignore stream errors\n }\n}\n\n// ============ Client ============\n\nexport type CopilotClient = {\n /**\n * Stream messages from Copilot Agent.\n *\n * @example\n * ```typescript\n * import { createCopilotClient, Data } from \"@amaster.ai/copilot-client\";\n *\n * const client = createCopilotClient();\n *\n * for await (const response of client.chat([{ role: \"user\", content: \"Hello\" }])) {\n * // deal response\n * }\n * ```\n */\n chat(\n messages: ChatMessage[],\n options?: ChatOptions,\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\n/**\n * Create Copilot client\n *\n * Auto-detects runtime environment (Browser/Vite/Taro H5/Taro Mini-program)\n */\nexport function createCopilotClient(\n http: HttpClient = createHttpClient(),\n baseUrl?: string,\n getAccessToken?: () => string | null,\n): CopilotClient {\n let envBaseUrl = \"\";\n\n // Vite/H5:必须直接写 import.meta.env,Vite 才能正确处理\n const metaEnv = (import.meta as any)?.env;\n if (metaEnv) {\n envBaseUrl =\n metaEnv.TARO_APP_API_BASE_URL || metaEnv.VITE_API_BASE_URL || \"\";\n }\n\n // Taro 小程序 build:defineConstants 会把 process.env.xxx 替换为字面量\n // H5 环境:process 不存在会抛 ReferenceError,这里用 try/catch 吞掉\n if (!envBaseUrl) {\n try {\n envBaseUrl =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined -> ignore\n }\n }\n\n envBaseUrl = String(envBaseUrl || \"\").trim();\n const url = `${baseUrl || envBaseUrl}/api/proxy/builtin/platform/copilot`;\n\n async function* sendMessageStream(\n request: SendStreamingMessageRequest,\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n try {\n const streamResponse = await createStream(url, request, getAccessToken);\n\n if (!streamResponse.ok) {\n throw new Error(`Stream request failed: ${streamResponse.statusText}`);\n }\n\n yield* parseSSEStream(streamResponse);\n } catch (err) {\n console.error(\"[sendMessageStream] Error:\", err);\n // Ignore stream errors\n }\n }\n\n return {\n async *chat(messages, chatOptions = {}) {\n const { taskId } = chatOptions;\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\n ? extractTextFromContent(systemMsg.content)\n : undefined;\n\n let contextId = getAppId();\n\n if (typeof g?.wx?.request === \"function\") {\n // 从 url 取 hostname,再从 hostname 取 appId,保证小程序环境下的 session 一致性\n const hostname = url\n ? url.replace(/^https?:\\/\\//, \"\").split(\"/\")[0]\n : \"\";\n contextId = getAppId(hostname);\n }\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId,\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 yield response;\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,\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,\n method: \"POST\",\n data: request,\n });\n },\n };\n}\n"]}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import {createHttpClient}from'@amaster.ai/http-client';import {createParser}from'eventsource-parser';import M from'miniprogram-text-decoder';import b from'miniprogram-text-encoder';var r=globalThis;function v(){return typeof r?.Taro?.request=="function"?r.Taro.request.bind(r.Taro):typeof r?.wx?.request=="function"?r.wx.request.bind(r.wx):typeof r?.tt?.request=="function"?r.tt.request.bind(r.tt):typeof r?.my?.request=="function"?r.my.request.bind(r.my):typeof r?.swan?.request=="function"?r.swan.request.bind(r.swan):typeof r?.qq?.request=="function"?r.qq.request.bind(r.qq):typeof r?.jd?.request=="function"?r.jd.request.bind(r.jd):null}function S(){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 o=(t.getRandomValues(new Uint8Array(1))[0]??0)%16;return (e==="x"?o:o&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let l=Math.random()*16|0;return (e==="x"?l:l&3|8).toString(16)})}function R(t){let e=/^www\.([\da-f-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);if(e?.[1])return e[1];let l=/^([\da-f-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);return l?.[1]?l[1]:null}function I(){if(typeof window>"u")return null;try{let t=window.location.href,e=/\/app\/([\da-f-]+)(?:\/|$)/.exec(t);return e?.[1]?e[1]:R(window.location.hostname)}catch{return null}}var C=null;function k(t){let e=t?R(t):I();return e||(C||(C=S()),C)}async function O(t,e,l={}){return new Promise(o=>{let n=new Uint8Array(0),p=new M("utf-8",{fatal:false}),x=false,i=false,u=[],d=null,y=()=>new Promise(a=>{u.length>0?a(u.shift()):x?a(null):d=a;}),f=a=>{a&&(u.push(a),d&&(d(u.shift()),d=null));},m=a=>{if(!(i||x||!a.data))try{let s=new Uint8Array(a.data),c=new Uint8Array(n.length+s.length);c.set(n),c.set(s,n.length),n=c;let T=0;for(;T<n.length;){let q=n.subarray(T),w=p.decode(q,{stream:!1});if(w)f(w),T+=new b().encode(w).length;else break}T<n.length?n=n.subarray(T):n=new Uint8Array(0);}catch(s){console.error("[mini stream] chunk process error:",s);}},h=a=>{a.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},g=r.wx.request.bind(r.wx);try{let a=g({url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...l},data:typeof e=="string"?e:JSON.stringify(e),responseType:"arraybuffer",enableChunked:!0,timeout:3e5,success:()=>{if(n.length>0){let s=p.decode(n,{stream:!0});f(s);}x=!0,d&&d(null);},fail:s=>{console.error("[mini stream] request fail:",s),i=!0,x=!0,d&&d(null);}});a.onChunkReceived?.(m),a.onHeadersReceived?.(h),o({ok:!0,statusText:"OK",read:async()=>i?null:y()});}catch(a){console.error("miniReq error",a);}})}async function U(t,e,l){let o=l?.(),n=o?{Authorization:`Bearer ${o}`}:{};if(typeof r?.wx?.request=="function")return O(t,e,n);let p=v();if(p)return new Promise(y=>{let f="",m=false,h=false,g=0,a={url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...n},data:typeof e=="string"?e:JSON.stringify(e),timeout:6e4,success:s=>{f=typeof s.data=="string"?s.data:JSON.stringify(s.data),m=true;},fail:s=>{console.error("[createStream] wx.request failed:",s),h=true,m=true;},complete:()=>{}};try{let s=p(a);s&&typeof s.then=="function"&&s.then(c=>{f=typeof c.data=="string"?c.data:JSON.stringify(c.data),m=!0;}).catch(()=>{h=!0,m=!0;});}catch(s){console.error("[createStream] Exception:",s),h=true,m=true;}y({ok:true,statusText:"OK",read:async()=>{for(;!m&&g>=f.length;)await new Promise(c=>setTimeout(c,50));if(h)return null;if(g>=f.length)return m?null:"";let s=f.slice(g);return g=f.length,s}});});let x={"Content-Type":"application/json",...n},i=await fetch(t,{method:"POST",headers:x,credentials:"include",body:JSON.stringify(e)});if(!i.body)return {ok:i.ok,statusText:i.statusText,read:async()=>null};let u=i.body.getReader(),d=new TextDecoder;return {ok:i.ok,statusText:i.statusText,read:async()=>{let{done:y,value:f}=await u.read();return y?null:d.decode(f,{stream:true})}}}function E(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 _(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
1
+ import {createHttpClient}from'@amaster.ai/http-client';import {createParser}from'eventsource-parser';import M from'miniprogram-text-decoder';import b from'miniprogram-text-encoder';var r=globalThis;function v(){return typeof r?.Taro?.request=="function"?r.Taro.request.bind(r.Taro):typeof r?.wx?.request=="function"?r.wx.request.bind(r.wx):typeof r?.tt?.request=="function"?r.tt.request.bind(r.tt):typeof r?.my?.request=="function"?r.my.request.bind(r.my):typeof r?.swan?.request=="function"?r.swan.request.bind(r.swan):typeof r?.qq?.request=="function"?r.qq.request.bind(r.qq):typeof r?.jd?.request=="function"?r.jd.request.bind(r.jd):null}function S(){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 o=(t.getRandomValues(new Uint8Array(1))[0]??0)%16;return (e==="x"?o:o&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let l=Math.random()*16|0;return (e==="x"?l:l&3|8).toString(16)})}function R(t){let e=/^www\.([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);if(e?.[1])return e[1];let l=/^([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);return l?.[1]?l[1]:null}function I(){if(typeof window>"u")return null;try{let t=window.location.href,e=/\/app\/([\da-z-]+)(?:\/|$)/.exec(t);return e?.[1]?e[1]:R(window.location.hostname)}catch{return null}}var C=null;function k(t){let e=t?R(t):I();return e||(C||(C=S()),C)}async function O(t,e,l={}){return new Promise(o=>{let n=new Uint8Array(0),p=new M("utf-8",{fatal:false}),x=false,i=false,u=[],d=null,y=()=>new Promise(a=>{u.length>0?a(u.shift()):x?a(null):d=a;}),f=a=>{a&&(u.push(a),d&&(d(u.shift()),d=null));},m=a=>{if(!(i||x||!a.data))try{let s=new Uint8Array(a.data),c=new Uint8Array(n.length+s.length);c.set(n),c.set(s,n.length),n=c;let T=0;for(;T<n.length;){let q=n.subarray(T),w=p.decode(q,{stream:!1});if(w)f(w),T+=new b().encode(w).length;else break}T<n.length?n=n.subarray(T):n=new Uint8Array(0);}catch(s){console.error("[mini stream] chunk process error:",s);}},h=a=>{a.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},g=r.wx.request.bind(r.wx);try{let a=g({url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...l},data:typeof e=="string"?e:JSON.stringify(e),responseType:"arraybuffer",enableChunked:!0,timeout:3e5,success:()=>{if(n.length>0){let s=p.decode(n,{stream:!0});f(s);}x=!0,d&&d(null);},fail:s=>{console.error("[mini stream] request fail:",s),i=!0,x=!0,d&&d(null);}});a.onChunkReceived?.(m),a.onHeadersReceived?.(h),o({ok:!0,statusText:"OK",read:async()=>i?null:y()});}catch(a){console.error("miniReq error",a);}})}async function U(t,e,l){let o=l?.(),n=o?{Authorization:`Bearer ${o}`}:{};if(typeof r?.wx?.request=="function")return O(t,e,n);let p=v();if(p)return new Promise(y=>{let f="",m=false,h=false,g=0,a={url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...n},data:typeof e=="string"?e:JSON.stringify(e),timeout:6e4,success:s=>{f=typeof s.data=="string"?s.data:JSON.stringify(s.data),m=true;},fail:s=>{console.error("[createStream] wx.request failed:",s),h=true,m=true;},complete:()=>{}};try{let s=p(a);s&&typeof s.then=="function"&&s.then(c=>{f=typeof c.data=="string"?c.data:JSON.stringify(c.data),m=!0;}).catch(()=>{h=!0,m=!0;});}catch(s){console.error("[createStream] Exception:",s),h=true,m=true;}y({ok:true,statusText:"OK",read:async()=>{for(;!m&&g>=f.length;)await new Promise(c=>setTimeout(c,50));if(h)return null;if(g>=f.length)return m?null:"";let s=f.slice(g);return g=f.length,s}});});let x={"Content-Type":"application/json",...n},i=await fetch(t,{method:"POST",headers:x,credentials:"include",body:JSON.stringify(e)});if(!i.body)return {ok:i.ok,statusText:i.statusText,read:async()=>null};let u=i.body.getReader(),d=new TextDecoder;return {ok:i.ok,statusText:i.statusText,read:async()=>{let{done:y,value:f}=await u.read();return y?null:d.decode(f,{stream:true})}}}function E(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 _(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
2
2
  `)}async function*j(t){let e=[],l=createParser({onEvent:o=>{try{e.push(JSON.parse(o.data));}catch(n){console.error("[parseSSEStream] Parse error:",n);}}});try{for(;;){let o=await t.read();if(o===null)break;if(o)for(l.feed(o);e.length>0;){let n=e.shift();n&&(yield n);}}}catch(o){console.error("[parseSSEStream] Stream error:",o);}}function B(t=createHttpClient(),e,l){let o="",n=import.meta?.env;if(n&&(o=n.TARO_APP_API_BASE_URL||n.VITE_API_BASE_URL||""),!o)try{o=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||"";}catch{}o=String(o||"").trim();let p=`${e||o}/api/proxy/builtin/platform/copilot`;async function*x(i){try{let u=await U(p,i,l);if(!u.ok)throw new Error(`Stream request failed: ${u.statusText}`);yield*j(u);}catch(u){console.error("[sendMessageStream] Error:",u);}}return {async*chat(i,u={}){let{taskId:d}=u,y=i.find(c=>c.role==="system"),f=i.filter(c=>c.role!=="system"),m=f[f.length-1],h=m?E(m.content):[{kind:"text",text:""}],g=y?_(y.content):void 0,a=k();if(typeof r?.wx?.request=="function"){let c=p?p.replace(/^https?:\/\//,"").split("/")[0]:"";a=k(c);}let s={jsonrpc:"2.0",id:S(),method:"message/stream",params:{message:{contextId:a,kind:"message",messageId:S(),role:"user",parts:h,...d&&{taskId:d},...g&&{metadata:{systemPrompt:g}}}}};for await(let c of x(s))yield c;},cancelChat(i){let u={jsonrpc:"2.0",id:S(),method:"tasks/cancel",params:{id:i}};return t.request({url:p,method:"POST",data:u})},getChatStatus(i){let u={jsonrpc:"2.0",id:S(),method:"tasks/get",params:{id:i}};return t.request({url:p,method:"POST",data:u})}}}
3
3
  export{B as createCopilotClient};//# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/copilot-client.ts"],"names":["g","getMiniProgramRequest","generateUUID","cryptoObj","c","r","getAppIdFromHostname","hostname","wwwMatch","domainMatch","extractAppIdFromUrl","url","pathMatch","cachedAppId","getAppId","urlAppId","createWeChatMiniProgramStream","data","authHeader","resolve","chunkBuffer","textDecoder","MiniProgramTextDecoder","ended","errorOccurred","dataQueue","resolveRead","pendingRead","pushChunk","text","chunkListener","res","newChunk","merged","decodeOffset","partial","decoded","MiniProgramTextEncoder","err","headersListener","miniReq","requestTask","finalText","error","createStream","getAccessToken","token","buffer","completed","failed","position","opts","ret","chunk","headers","response","reader","decoder","done","value","convertToA2AParts","content","part","extractTextFromContent","parseSSEStream","streamResponse","queue","parser","createParser","event","item","createCopilotClient","http","createHttpClient","baseUrl","envBaseUrl","metaEnv","sendMessageStream","request","messages","chatOptions","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","parts","systemPrompt","contextId"],"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 {\n type ClientResult,\n createHttpClient,\n type HttpClient,\n} from \"@amaster.ai/http-client\";\nimport { createParser } from \"eventsource-parser\";\nimport MiniProgramTextDecoder from \"miniprogram-text-decoder\";\nimport MiniProgramTextEncoder from \"miniprogram-text-encoder\";\n\n// ============ Internal: Platform Detection (same as http-client) ============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst g = globalThis as any;\n\nfunction getMiniProgramRequest(): ((_opts: any) => any) | null {\n if (typeof g?.Taro?.request === \"function\")\n return g.Taro.request.bind(g.Taro);\n if (typeof g?.wx?.request === \"function\") return g.wx.request.bind(g.wx);\n if (typeof g?.tt?.request === \"function\") return g.tt.request.bind(g.tt);\n if (typeof g?.my?.request === \"function\") return g.my.request.bind(g.my);\n if (typeof g?.swan?.request === \"function\")\n return g.swan.request.bind(g.swan);\n if (typeof g?.qq?.request === \"function\") return g.qq.request.bind(g.qq);\n if (typeof g?.jd?.request === \"function\") return g.jd.request.bind(g.jd);\n return null;\n}\n\n// ============ Internal: UUID Generator ============\n\nfunction generateUUID(): string {\n const cryptoObj =\n 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\n// ============ Internal: URL Utilities ============\n\nfunction getAppIdFromHostname(hostname: string): string | null {\n // Pattern 1: www.{app_id}.domain.tld or www.{app_id}-{env}.domain.tld\n const wwwMatch =\n /^www\\.([\\da-f-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (wwwMatch?.[1]) return wwwMatch[1];\n\n // Pattern 2: {app_id}-{env}.domain.tld or {app_id}.domain.tld\n const domainMatch = /^([\\da-f-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(\n hostname,\n );\n if (domainMatch?.[1]) return domainMatch[1];\n\n return null;\n}\n\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-f-]+)(?:\\/|$)/.exec(url);\n if (pathMatch?.[1]) return pathMatch[1];\n return getAppIdFromHostname(window.location.hostname);\n } catch {\n return null;\n }\n}\n\n// Cache appId for session consistency\nlet cachedAppId: string | null = null;\n\nfunction getAppId(hostname?: string): string {\n const urlAppId = hostname\n ? getAppIdFromHostname(hostname)\n : extractAppIdFromUrl();\n if (urlAppId) return urlAppId;\n if (!cachedAppId) cachedAppId = generateUUID();\n return cachedAppId;\n}\n\n// ============ Internal: Streaming ============\n\ninterface StreamResponse {\n ok: boolean;\n statusText: string;\n read(): Promise<string | null>;\n}\n\n// 小程序专用的流式请求\nasync function createWeChatMiniProgramStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string> = {},\n): Promise<StreamResponse> {\n return new Promise<StreamResponse>((resolve) => {\n let chunkBuffer = new Uint8Array(0); // 字节缓冲,用于处理 UTF-8 截断\n const textDecoder = new MiniProgramTextDecoder(\"utf-8\", {\n fatal: false,\n });\n\n let ended = false;\n let errorOccurred = false;\n\n // 用于外部调用 read() 时取数据的队列\n const dataQueue: string[] = [];\n let resolveRead: ((value: string | null) => void) | null = null;\n\n const pendingRead = () =>\n new Promise<string | null>((r) => {\n if (dataQueue.length > 0) {\n r(dataQueue.shift()!);\n } else if (ended) {\n r(null);\n } else {\n resolveRead = r;\n }\n });\n\n const pushChunk = (text: string) => {\n if (text) {\n dataQueue.push(text);\n if (resolveRead) {\n resolveRead(dataQueue.shift()!);\n resolveRead = null;\n }\n }\n };\n\n const chunkListener = (res: any) => {\n if (errorOccurred || ended || !res.data) return;\n\n try {\n const newChunk = new Uint8Array(res.data as ArrayBuffer);\n // 追加到缓冲\n const merged = new Uint8Array(chunkBuffer.length + newChunk.length);\n merged.set(chunkBuffer);\n merged.set(newChunk, chunkBuffer.length);\n chunkBuffer = merged;\n\n // 尝试解码尽可能多的完整字符\n let decodeOffset = 0;\n while (decodeOffset < chunkBuffer.length) {\n const partial = chunkBuffer.subarray(decodeOffset);\n const decoded = textDecoder.decode(partial, { stream: false });\n\n // 如果解码出内容,说明前面是完整字符\n if (decoded) {\n pushChunk(decoded);\n // 移动偏移(注意:TextDecoder 内部会处理多字节边界)\n // 但为了安全,我们粗略估算已消费字节(不完美但够用)\n // 实际生产中可使用更精确的边界检测\n decodeOffset += new MiniProgramTextEncoder().encode(decoded).length;\n } else {\n // 剩余部分可能是半个字符,留到下次\n break;\n }\n }\n\n // 保留未解码的部分\n if (decodeOffset < chunkBuffer.length) {\n chunkBuffer = chunkBuffer.subarray(decodeOffset);\n } else {\n chunkBuffer = new Uint8Array(0);\n }\n } catch (err) {\n console.error(\"[mini stream] chunk process error:\", err);\n }\n };\n\n const headersListener = (res: any) => {\n if (\n res.header?.[\"content-type\"]?.includes(\"text/event-stream\") === false\n ) {\n console.warn(\"Warning: server did not return event-stream\");\n }\n };\n\n const miniReq = g.wx.request.bind(g.wx);\n\n try {\n const requestTask = miniReq({\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n responseType: \"arraybuffer\", // 必须!\n enableChunked: true, // 必须!\n timeout: 300000,\n\n success: () => {\n // 成功结束时,把剩余缓冲区解码\n if (chunkBuffer.length > 0) {\n const finalText = textDecoder.decode(chunkBuffer, {\n stream: true,\n });\n pushChunk(finalText);\n }\n ended = true;\n if (resolveRead) resolveRead(null);\n },\n\n fail: (err: any) => {\n console.error(\"[mini stream] request fail:\", err);\n errorOccurred = true;\n ended = true;\n if (resolveRead) resolveRead(null);\n },\n });\n // 关键:监听分块到达\n requestTask.onChunkReceived?.(chunkListener);\n // 可选:监听 HTTP headers 到达(可用于检查状态码)\n requestTask.onHeadersReceived?.(headersListener);\n\n resolve({\n ok: true, // 稍后可根据 headers 更精确判断\n statusText: \"OK\",\n read: async () => {\n if (errorOccurred) return null;\n return pendingRead();\n },\n });\n } catch (error) {\n console.error(\"miniReq error\", error);\n }\n });\n}\n\nasync function createStream(\n url: string,\n data: unknown,\n getAccessToken?: () => string | null,\n): Promise<StreamResponse> {\n // Get token for authentication\n const token = getAccessToken?.();\n const authHeader: Record<string, string> = token\n ? { Authorization: `Bearer ${token}` }\n : {};\n\n if (typeof g?.wx?.request === \"function\") {\n return createWeChatMiniProgramStream(url, data, authHeader);\n }\n const miniReq = getMiniProgramRequest();\n if (miniReq) {\n // Mini-program: buffer full response\n return new Promise((resolve) => {\n let buffer = \"\";\n let completed = false;\n let failed = false;\n let position = 0;\n\n const opts = {\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n timeout: 60000,\n success: (res: any) => {\n buffer =\n typeof res.data === \"string\" ? res.data : JSON.stringify(res.data);\n completed = true;\n },\n fail: (err: any) => {\n console.error(\"[createStream] wx.request failed:\", err);\n failed = true;\n completed = true;\n },\n complete: () => {},\n };\n\n try {\n const ret = miniReq(opts);\n\n if (ret && typeof ret.then === \"function\") {\n ret\n .then((res: any) => {\n buffer =\n typeof res.data === \"string\"\n ? res.data\n : JSON.stringify(res.data);\n completed = true;\n })\n .catch(() => {\n failed = true;\n completed = true;\n });\n }\n } catch (err) {\n console.error(\"[createStream] Exception:\", err);\n failed = true;\n completed = true;\n }\n\n resolve({\n ok: true,\n statusText: \"OK\",\n read: async () => {\n while (!completed && position >= buffer.length) {\n await new Promise((r) => setTimeout(r, 50));\n }\n if (failed) return null;\n if (position >= buffer.length) return completed ? null : \"\";\n const chunk = buffer.slice(position);\n position = buffer.length;\n return chunk;\n },\n });\n });\n }\n\n // Browser: use fetch streaming with authentication\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeader,\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify(data),\n });\n\n if (!response.body) {\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => null,\n };\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => {\n const { done, value } = await reader.read();\n if (done) return null;\n return decoder.decode(value, { stream: true });\n },\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: {\n bytes: part.data,\n mimeType: part.mimeType || \"image/png\",\n },\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// ============ SSE Stream Handling ============\n\nasync function* parseSSEStream(\n streamResponse: StreamResponse,\n): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n const queue: SendStreamingMessageResponse[] = [];\n\n const parser = createParser({\n onEvent: (event) => {\n try {\n queue.push(JSON.parse(event.data));\n } catch (err) {\n console.error(\"[parseSSEStream] Parse error:\", err);\n // Ignore parse errors\n }\n },\n });\n\n try {\n while (true) {\n const chunk = await streamResponse.read();\n if (chunk === null) {\n break;\n }\n if (chunk) {\n parser.feed(chunk);\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n yield item;\n }\n }\n }\n }\n } catch (err) {\n console.error(\"[parseSSEStream] Stream error:\", err);\n // Ignore stream errors\n }\n}\n\n// ============ Client ============\n\nexport type CopilotClient = {\n /**\n * Stream messages from Copilot Agent.\n *\n * @example\n * ```typescript\n * import { createCopilotClient, Data } from \"@amaster.ai/copilot-client\";\n *\n * const client = createCopilotClient();\n *\n * for await (const response of client.chat([{ role: \"user\", content: \"Hello\" }])) {\n * // deal response\n * }\n * ```\n */\n chat(\n messages: ChatMessage[],\n options?: ChatOptions,\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\n/**\n * Create Copilot client\n *\n * Auto-detects runtime environment (Browser/Vite/Taro H5/Taro Mini-program)\n */\nexport function createCopilotClient(\n http: HttpClient = createHttpClient(),\n baseUrl?: string,\n getAccessToken?: () => string | null,\n): CopilotClient {\n let envBaseUrl = \"\";\n\n // Vite/H5:必须直接写 import.meta.env,Vite 才能正确处理\n const metaEnv = (import.meta as any)?.env;\n if (metaEnv) {\n envBaseUrl =\n metaEnv.TARO_APP_API_BASE_URL || metaEnv.VITE_API_BASE_URL || \"\";\n }\n\n // Taro 小程序 build:defineConstants 会把 process.env.xxx 替换为字面量\n // H5 环境:process 不存在会抛 ReferenceError,这里用 try/catch 吞掉\n if (!envBaseUrl) {\n try {\n envBaseUrl =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined -> ignore\n }\n }\n\n envBaseUrl = String(envBaseUrl || \"\").trim();\n const url = `${baseUrl || envBaseUrl}/api/proxy/builtin/platform/copilot`;\n\n async function* sendMessageStream(\n request: SendStreamingMessageRequest,\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n try {\n const streamResponse = await createStream(url, request, getAccessToken);\n\n if (!streamResponse.ok) {\n throw new Error(`Stream request failed: ${streamResponse.statusText}`);\n }\n\n yield* parseSSEStream(streamResponse);\n } catch (err) {\n console.error(\"[sendMessageStream] Error:\", err);\n // Ignore stream errors\n }\n }\n\n return {\n async *chat(messages, chatOptions = {}) {\n const { taskId } = chatOptions;\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\n ? extractTextFromContent(systemMsg.content)\n : undefined;\n\n let contextId = getAppId();\n\n if (typeof g?.wx?.request === \"function\") {\n // 从 url 取 hostname,再从 hostname 取 appId,保证小程序环境下的 session 一致性\n const hostname = url\n ? url.replace(/^https?:\\/\\//, \"\").split(\"/\")[0]\n : \"\";\n contextId = getAppId(hostname);\n }\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId,\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 yield response;\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,\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,\n method: \"POST\",\n data: request,\n });\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/copilot-client.ts"],"names":["g","getMiniProgramRequest","generateUUID","cryptoObj","c","r","getAppIdFromHostname","hostname","wwwMatch","domainMatch","extractAppIdFromUrl","url","pathMatch","cachedAppId","getAppId","urlAppId","createWeChatMiniProgramStream","data","authHeader","resolve","chunkBuffer","textDecoder","MiniProgramTextDecoder","ended","errorOccurred","dataQueue","resolveRead","pendingRead","pushChunk","text","chunkListener","res","newChunk","merged","decodeOffset","partial","decoded","MiniProgramTextEncoder","err","headersListener","miniReq","requestTask","finalText","error","createStream","getAccessToken","token","buffer","completed","failed","position","opts","ret","chunk","headers","response","reader","decoder","done","value","convertToA2AParts","content","part","extractTextFromContent","parseSSEStream","streamResponse","queue","parser","createParser","event","item","createCopilotClient","http","createHttpClient","baseUrl","envBaseUrl","metaEnv","sendMessageStream","request","messages","chatOptions","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","parts","systemPrompt","contextId"],"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 {\n type ClientResult,\n createHttpClient,\n type HttpClient,\n} from \"@amaster.ai/http-client\";\nimport { createParser } from \"eventsource-parser\";\nimport MiniProgramTextDecoder from \"miniprogram-text-decoder\";\nimport MiniProgramTextEncoder from \"miniprogram-text-encoder\";\n\n// ============ Internal: Platform Detection (same as http-client) ============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst g = globalThis as any;\n\nfunction getMiniProgramRequest(): ((_opts: any) => any) | null {\n if (typeof g?.Taro?.request === \"function\")\n return g.Taro.request.bind(g.Taro);\n if (typeof g?.wx?.request === \"function\") return g.wx.request.bind(g.wx);\n if (typeof g?.tt?.request === \"function\") return g.tt.request.bind(g.tt);\n if (typeof g?.my?.request === \"function\") return g.my.request.bind(g.my);\n if (typeof g?.swan?.request === \"function\")\n return g.swan.request.bind(g.swan);\n if (typeof g?.qq?.request === \"function\") return g.qq.request.bind(g.qq);\n if (typeof g?.jd?.request === \"function\") return g.jd.request.bind(g.jd);\n return null;\n}\n\n// ============ Internal: UUID Generator ============\n\nfunction generateUUID(): string {\n const cryptoObj =\n 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\n// ============ Internal: URL Utilities ============\n\nfunction getAppIdFromHostname(hostname: string): string | null {\n // Pattern 1: www.{app_id}.domain.tld or www.{app_id}-{env}.domain.tld\n const wwwMatch =\n /^www\\.([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (wwwMatch?.[1]) return wwwMatch[1];\n\n // Pattern 2: {app_id}-{env}.domain.tld or {app_id}.domain.tld\n const domainMatch = /^([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(\n hostname,\n );\n if (domainMatch?.[1]) return domainMatch[1];\n\n return null;\n}\n\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-z-]+)(?:\\/|$)/.exec(url);\n if (pathMatch?.[1]) return pathMatch[1];\n return getAppIdFromHostname(window.location.hostname);\n } catch {\n return null;\n }\n}\n\n// Cache appId for session consistency\nlet cachedAppId: string | null = null;\n\nfunction getAppId(hostname?: string): string {\n const urlAppId = hostname\n ? getAppIdFromHostname(hostname)\n : extractAppIdFromUrl();\n if (urlAppId) return urlAppId;\n if (!cachedAppId) cachedAppId = generateUUID();\n return cachedAppId;\n}\n\n// ============ Internal: Streaming ============\n\ninterface StreamResponse {\n ok: boolean;\n statusText: string;\n read(): Promise<string | null>;\n}\n\n// 小程序专用的流式请求\nasync function createWeChatMiniProgramStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string> = {},\n): Promise<StreamResponse> {\n return new Promise<StreamResponse>((resolve) => {\n let chunkBuffer = new Uint8Array(0); // 字节缓冲,用于处理 UTF-8 截断\n const textDecoder = new MiniProgramTextDecoder(\"utf-8\", {\n fatal: false,\n });\n\n let ended = false;\n let errorOccurred = false;\n\n // 用于外部调用 read() 时取数据的队列\n const dataQueue: string[] = [];\n let resolveRead: ((value: string | null) => void) | null = null;\n\n const pendingRead = () =>\n new Promise<string | null>((r) => {\n if (dataQueue.length > 0) {\n r(dataQueue.shift()!);\n } else if (ended) {\n r(null);\n } else {\n resolveRead = r;\n }\n });\n\n const pushChunk = (text: string) => {\n if (text) {\n dataQueue.push(text);\n if (resolveRead) {\n resolveRead(dataQueue.shift()!);\n resolveRead = null;\n }\n }\n };\n\n const chunkListener = (res: any) => {\n if (errorOccurred || ended || !res.data) return;\n\n try {\n const newChunk = new Uint8Array(res.data as ArrayBuffer);\n // 追加到缓冲\n const merged = new Uint8Array(chunkBuffer.length + newChunk.length);\n merged.set(chunkBuffer);\n merged.set(newChunk, chunkBuffer.length);\n chunkBuffer = merged;\n\n // 尝试解码尽可能多的完整字符\n let decodeOffset = 0;\n while (decodeOffset < chunkBuffer.length) {\n const partial = chunkBuffer.subarray(decodeOffset);\n const decoded = textDecoder.decode(partial, { stream: false });\n\n // 如果解码出内容,说明前面是完整字符\n if (decoded) {\n pushChunk(decoded);\n // 移动偏移(注意:TextDecoder 内部会处理多字节边界)\n // 但为了安全,我们粗略估算已消费字节(不完美但够用)\n // 实际生产中可使用更精确的边界检测\n decodeOffset += new MiniProgramTextEncoder().encode(decoded).length;\n } else {\n // 剩余部分可能是半个字符,留到下次\n break;\n }\n }\n\n // 保留未解码的部分\n if (decodeOffset < chunkBuffer.length) {\n chunkBuffer = chunkBuffer.subarray(decodeOffset);\n } else {\n chunkBuffer = new Uint8Array(0);\n }\n } catch (err) {\n console.error(\"[mini stream] chunk process error:\", err);\n }\n };\n\n const headersListener = (res: any) => {\n if (\n res.header?.[\"content-type\"]?.includes(\"text/event-stream\") === false\n ) {\n console.warn(\"Warning: server did not return event-stream\");\n }\n };\n\n const miniReq = g.wx.request.bind(g.wx);\n\n try {\n const requestTask = miniReq({\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n responseType: \"arraybuffer\", // 必须!\n enableChunked: true, // 必须!\n timeout: 300000,\n\n success: () => {\n // 成功结束时,把剩余缓冲区解码\n if (chunkBuffer.length > 0) {\n const finalText = textDecoder.decode(chunkBuffer, {\n stream: true,\n });\n pushChunk(finalText);\n }\n ended = true;\n if (resolveRead) resolveRead(null);\n },\n\n fail: (err: any) => {\n console.error(\"[mini stream] request fail:\", err);\n errorOccurred = true;\n ended = true;\n if (resolveRead) resolveRead(null);\n },\n });\n // 关键:监听分块到达\n requestTask.onChunkReceived?.(chunkListener);\n // 可选:监听 HTTP headers 到达(可用于检查状态码)\n requestTask.onHeadersReceived?.(headersListener);\n\n resolve({\n ok: true, // 稍后可根据 headers 更精确判断\n statusText: \"OK\",\n read: async () => {\n if (errorOccurred) return null;\n return pendingRead();\n },\n });\n } catch (error) {\n console.error(\"miniReq error\", error);\n }\n });\n}\n\nasync function createStream(\n url: string,\n data: unknown,\n getAccessToken?: () => string | null,\n): Promise<StreamResponse> {\n // Get token for authentication\n const token = getAccessToken?.();\n const authHeader: Record<string, string> = token\n ? { Authorization: `Bearer ${token}` }\n : {};\n\n if (typeof g?.wx?.request === \"function\") {\n return createWeChatMiniProgramStream(url, data, authHeader);\n }\n const miniReq = getMiniProgramRequest();\n if (miniReq) {\n // Mini-program: buffer full response\n return new Promise((resolve) => {\n let buffer = \"\";\n let completed = false;\n let failed = false;\n let position = 0;\n\n const opts = {\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n timeout: 60000,\n success: (res: any) => {\n buffer =\n typeof res.data === \"string\" ? res.data : JSON.stringify(res.data);\n completed = true;\n },\n fail: (err: any) => {\n console.error(\"[createStream] wx.request failed:\", err);\n failed = true;\n completed = true;\n },\n complete: () => {},\n };\n\n try {\n const ret = miniReq(opts);\n\n if (ret && typeof ret.then === \"function\") {\n ret\n .then((res: any) => {\n buffer =\n typeof res.data === \"string\"\n ? res.data\n : JSON.stringify(res.data);\n completed = true;\n })\n .catch(() => {\n failed = true;\n completed = true;\n });\n }\n } catch (err) {\n console.error(\"[createStream] Exception:\", err);\n failed = true;\n completed = true;\n }\n\n resolve({\n ok: true,\n statusText: \"OK\",\n read: async () => {\n while (!completed && position >= buffer.length) {\n await new Promise((r) => setTimeout(r, 50));\n }\n if (failed) return null;\n if (position >= buffer.length) return completed ? null : \"\";\n const chunk = buffer.slice(position);\n position = buffer.length;\n return chunk;\n },\n });\n });\n }\n\n // Browser: use fetch streaming with authentication\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeader,\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify(data),\n });\n\n if (!response.body) {\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => null,\n };\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => {\n const { done, value } = await reader.read();\n if (done) return null;\n return decoder.decode(value, { stream: true });\n },\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: {\n bytes: part.data,\n mimeType: part.mimeType || \"image/png\",\n },\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// ============ SSE Stream Handling ============\n\nasync function* parseSSEStream(\n streamResponse: StreamResponse,\n): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n const queue: SendStreamingMessageResponse[] = [];\n\n const parser = createParser({\n onEvent: (event) => {\n try {\n queue.push(JSON.parse(event.data));\n } catch (err) {\n console.error(\"[parseSSEStream] Parse error:\", err);\n // Ignore parse errors\n }\n },\n });\n\n try {\n while (true) {\n const chunk = await streamResponse.read();\n if (chunk === null) {\n break;\n }\n if (chunk) {\n parser.feed(chunk);\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n yield item;\n }\n }\n }\n }\n } catch (err) {\n console.error(\"[parseSSEStream] Stream error:\", err);\n // Ignore stream errors\n }\n}\n\n// ============ Client ============\n\nexport type CopilotClient = {\n /**\n * Stream messages from Copilot Agent.\n *\n * @example\n * ```typescript\n * import { createCopilotClient, Data } from \"@amaster.ai/copilot-client\";\n *\n * const client = createCopilotClient();\n *\n * for await (const response of client.chat([{ role: \"user\", content: \"Hello\" }])) {\n * // deal response\n * }\n * ```\n */\n chat(\n messages: ChatMessage[],\n options?: ChatOptions,\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId: string): Promise<ClientResult<GetTaskResponse>>;\n};\n\n/**\n * Create Copilot client\n *\n * Auto-detects runtime environment (Browser/Vite/Taro H5/Taro Mini-program)\n */\nexport function createCopilotClient(\n http: HttpClient = createHttpClient(),\n baseUrl?: string,\n getAccessToken?: () => string | null,\n): CopilotClient {\n let envBaseUrl = \"\";\n\n // Vite/H5:必须直接写 import.meta.env,Vite 才能正确处理\n const metaEnv = (import.meta as any)?.env;\n if (metaEnv) {\n envBaseUrl =\n metaEnv.TARO_APP_API_BASE_URL || metaEnv.VITE_API_BASE_URL || \"\";\n }\n\n // Taro 小程序 build:defineConstants 会把 process.env.xxx 替换为字面量\n // H5 环境:process 不存在会抛 ReferenceError,这里用 try/catch 吞掉\n if (!envBaseUrl) {\n try {\n envBaseUrl =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined -> ignore\n }\n }\n\n envBaseUrl = String(envBaseUrl || \"\").trim();\n const url = `${baseUrl || envBaseUrl}/api/proxy/builtin/platform/copilot`;\n\n async function* sendMessageStream(\n request: SendStreamingMessageRequest,\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n try {\n const streamResponse = await createStream(url, request, getAccessToken);\n\n if (!streamResponse.ok) {\n throw new Error(`Stream request failed: ${streamResponse.statusText}`);\n }\n\n yield* parseSSEStream(streamResponse);\n } catch (err) {\n console.error(\"[sendMessageStream] Error:\", err);\n // Ignore stream errors\n }\n }\n\n return {\n async *chat(messages, chatOptions = {}) {\n const { taskId } = chatOptions;\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\n ? extractTextFromContent(systemMsg.content)\n : undefined;\n\n let contextId = getAppId();\n\n if (typeof g?.wx?.request === \"function\") {\n // 从 url 取 hostname,再从 hostname 取 appId,保证小程序环境下的 session 一致性\n const hostname = url\n ? url.replace(/^https?:\\/\\//, \"\").split(\"/\")[0]\n : \"\";\n contextId = getAppId(hostname);\n }\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId,\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 yield response;\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,\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,\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.1.0-beta.45",
3
+ "version": "1.1.0-beta.46",
4
4
  "description": "AI copilot chat client with streaming support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -34,7 +34,7 @@
34
34
  "eventsource-parser": "^3.0.6",
35
35
  "miniprogram-text-decoder": "^2.0.0",
36
36
  "miniprogram-text-encoder": "^2.0.0",
37
- "@amaster.ai/http-client": "1.1.0-beta.45"
37
+ "@amaster.ai/http-client": "1.1.0-beta.46"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@a2a-js/sdk": "^0.3.7"