@huyooo/ai-chat-bridge-electron 0.3.10 → 0.3.12
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/preload/index.d.ts
CHANGED
|
@@ -28,6 +28,8 @@ export interface UserToolDefinition {
|
|
|
28
28
|
export interface AiChatBridge {
|
|
29
29
|
/** 获取可用模型 */
|
|
30
30
|
getModels(): Promise<ModelOption[]>;
|
|
31
|
+
/** 监听模型列表更新 */
|
|
32
|
+
onModelsUpdated?(callback: () => void): () => void;
|
|
31
33
|
/** 获取所有工具列表(用于工具设置或管理视图) */
|
|
32
34
|
getAllTools(): Promise<ToolInfo[]>;
|
|
33
35
|
/**
|
package/dist/preload/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{contextBridge as e,ipcRenderer as t}from"electron";function n(n={}){let{channelPrefix:r=`ai-chat`,exposeName:i=`aiChatBridge`}=n;e.exposeInMainWorld(i,{getModels:()=>t.invoke(`${r}:models`),getAllTools:()=>t.invoke(`${r}:getAllTools`),getToolDefinitions:()=>t.invoke(`${r}:getToolDefinitions`),executeTool:(e,n,i)=>t.invoke(`${r}:executeTool`,{name:e,args:n,...i}),send:e=>t.invoke(`${r}:send`,e),cancel:()=>t.invoke(`${r}:cancel`),setCwd:e=>t.invoke(`${r}:setCwd`,e),getConfig:()=>t.invoke(`${r}:config`),debugLog:e=>t.send(`${r}:debugLog`,e),onProgress:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:progress`,n),()=>{t.removeListener(`${r}:progress`,n)}},onToolApprovalRequest:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:toolApprovalRequest`,n),()=>{t.removeListener(`${r}:toolApprovalRequest`,n)}},respondToolApproval:(e,n)=>t.invoke(`${r}:toolApprovalResponse`,{id:e,approved:n}),getSessions:()=>t.invoke(`${r}:sessions:list`),getSession:e=>t.invoke(`${r}:sessions:get`,e),createSession:e=>t.invoke(`${r}:sessions:create`,e||{}),updateSession:(e,n)=>t.invoke(`${r}:sessions:update`,e,n),deleteSession:e=>t.invoke(`${r}:sessions:delete`,e),getMessages:e=>t.invoke(`${r}:messages:list`,e),getMessagesPage:(e,n)=>t.invoke(`${r}:messages:listPage`,e,n||{}),saveMessage:e=>t.invoke(`${r}:messages:save`,e),updateMessage:e=>t.invoke(`${r}:messages:update`,e),deleteMessagesAfter:(e,n)=>t.invoke(`${r}:messages:deleteAfter`,e,n),deleteMessagesAfterMessageId:(e,n)=>t.invoke(`${r}:messages:deleteAfterMessageId`,e,n),getOperations:e=>t.invoke(`${r}:operations:list`,e),getTrashItems:()=>t.invoke(`${r}:trash:list`),restoreFromTrash:e=>t.invoke(`${r}:trash:restore`,e),openExternal:e=>t.invoke(`${r}:openExternal`,e),listDir:e=>t.invoke(`${r}:fs:listDir`,e),exists:e=>t.invoke(`${r}:fs:exists`,e),stat:e=>t.invoke(`${r}:fs:stat`,e),readFile:e=>t.invoke(`${r}:fs:readFile`,e),resolveAtFileContext:e=>t.invoke(`${r}:fs:resolveAtFileContext`,e),readFileBase64:e=>t.invoke(`${r}:fs:readFileBase64`,e),homeDir:()=>t.invoke(`${r}:fs:homeDir`),resolvePath:e=>t.invoke(`${r}:fs:resolvePath`,e),parentDir:e=>t.invoke(`${r}:fs:parentDir`,e),watchDir:e=>t.invoke(`${r}:fs:watchDir`,e),unwatchDir:e=>t.invoke(`${r}:fs:unwatchDir`,e),onDirChange:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:fs:dirChange`,n),()=>{t.removeListener(`${r}:fs:dirChange`,n)}},getSetting:e=>t.invoke(`${r}:settings:get`,e),setSetting:(e,n)=>t.invoke(`${r}:settings:set`,e,n),getAllSettings:()=>t.invoke(`${r}:settings:getAll`),deleteSetting:e=>t.invoke(`${r}:settings:delete`,e),getIndexStats:()=>t.invoke(`${r}:index:getStats`),getIndexStatus:()=>t.invoke(`${r}:index:status`),syncIndex:()=>t.invoke(`${r}:index:sync`),cancelIndex:()=>t.invoke(`${r}:index:cancel`),deleteIndex:()=>t.invoke(`${r}:index:delete`),registerIndexListener:()=>t.invoke(`${r}:index:registerListener`),unregisterIndexListener:()=>t.invoke(`${r}:index:unregisterListener`),onIndexProgress:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:index:progress`,n),()=>{t.removeListener(`${r}:index:progress`,n)}},searchAtDocuments:async(e,n)=>{let i=e.trim();return i?(await t.invoke(`${r}:search:query`,i,{limit:n?.limit,mode:n?.mode??`hybrid`})).map(e=>({kind:`doc`,id:e.id,documentId:e.id,label:e.name,mention:`@doc:${e.id}`,description:e.id,source:e.projectPath||e.projectName||e.id,snippet:e.snippet,score:e.score,matchType:e.matchType})):(await t.invoke(`${r}:search:listDocuments`,n?.limit)).map(e=>({kind:`doc`,id:e.id,documentId:e.path,label:e.name,mention:`@doc:${e.path}`,description:e.path,source:e.projectPath||e.projectName||e.path}))},listAtTerminals:async e=>{let n=e?.query?.trim().toLowerCase()??``,r=e?.limit??20,i=e?.workspaceRoot,[a,o]=await Promise.all([t.invoke(`terminal:listSessions`,i),i?t.invoke(`terminal:getActiveSessionId`,i):Promise.resolve(null)]);return[...a].sort((e,t)=>{if(o){if(e.id===o)return-1;if(t.id===o)return 1}return t.updatedAt.localeCompare(e.updatedAt)}).filter(e=>n?`${e.title} ${e.cwd} ${e.status}`.toLowerCase().includes(n):!0).slice(0,r).map(e=>({kind:`terminal`,id:e.id,sessionId:e.id,label:e.title,mention:`@terminal:${e.id}`,description:`${e.cwd} · ${e.status}`,cwd:e.cwd,status:e.status,updatedAt:e.updatedAt}))},searchAtChats:async(e,n)=>t.invoke(`${r}:at:chats:search`,e,n),asrStart:e=>t.invoke(`${r}:asr:start`,e),asrSendAudio:e=>t.invoke(`${r}:asr:sendAudio`,e),asrFinish:()=>t.invoke(`${r}:asr:finish`),asrStop:()=>t.invoke(`${r}:asr:stop`),asrStatus:()=>t.invoke(`${r}:asr:status`),asrWarmup:e=>t.invoke(`${r}:asr:warmup`,e),onAsrConnected:e=>{let n=()=>e();return t.on(`${r}:asr:connected`,n),()=>{t.removeListener(`${r}:asr:connected`,n)}},onAsrResult:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:asr:result`,n),()=>{t.removeListener(`${r}:asr:result`,n)}},onAsrError:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:asr:error`,n),()=>{t.removeListener(`${r}:asr:error`,n)}},onAsrClosed:e=>{let n=()=>e();return t.on(`${r}:asr:closed`,n),()=>{t.removeListener(`${r}:asr:closed`,n)}}})}export{n as exposeElectronBridge};
|
|
1
|
+
import{contextBridge as e,ipcRenderer as t}from"electron";function n(n={}){let{channelPrefix:r=`ai-chat`,exposeName:i=`aiChatBridge`}=n;e.exposeInMainWorld(i,{getModels:()=>t.invoke(`${r}:models`),onModelsUpdated:e=>{let n=()=>e();return t.on(`${r}:models:updated`,n),()=>{t.removeListener(`${r}:models:updated`,n)}},getAllTools:()=>t.invoke(`${r}:getAllTools`),getToolDefinitions:()=>t.invoke(`${r}:getToolDefinitions`),executeTool:(e,n,i)=>t.invoke(`${r}:executeTool`,{name:e,args:n,...i}),send:e=>t.invoke(`${r}:send`,e),cancel:()=>t.invoke(`${r}:cancel`),setCwd:e=>t.invoke(`${r}:setCwd`,e),getConfig:()=>t.invoke(`${r}:config`),debugLog:e=>t.send(`${r}:debugLog`,e),onProgress:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:progress`,n),()=>{t.removeListener(`${r}:progress`,n)}},onToolApprovalRequest:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:toolApprovalRequest`,n),()=>{t.removeListener(`${r}:toolApprovalRequest`,n)}},respondToolApproval:(e,n)=>t.invoke(`${r}:toolApprovalResponse`,{id:e,approved:n}),getSessions:()=>t.invoke(`${r}:sessions:list`),getSession:e=>t.invoke(`${r}:sessions:get`,e),createSession:e=>t.invoke(`${r}:sessions:create`,e||{}),updateSession:(e,n)=>t.invoke(`${r}:sessions:update`,e,n),deleteSession:e=>t.invoke(`${r}:sessions:delete`,e),getMessages:e=>t.invoke(`${r}:messages:list`,e),getMessagesPage:(e,n)=>t.invoke(`${r}:messages:listPage`,e,n||{}),saveMessage:e=>t.invoke(`${r}:messages:save`,e),updateMessage:e=>t.invoke(`${r}:messages:update`,e),deleteMessagesAfter:(e,n)=>t.invoke(`${r}:messages:deleteAfter`,e,n),deleteMessagesAfterMessageId:(e,n)=>t.invoke(`${r}:messages:deleteAfterMessageId`,e,n),getOperations:e=>t.invoke(`${r}:operations:list`,e),getTrashItems:()=>t.invoke(`${r}:trash:list`),restoreFromTrash:e=>t.invoke(`${r}:trash:restore`,e),openExternal:e=>t.invoke(`${r}:openExternal`,e),listDir:e=>t.invoke(`${r}:fs:listDir`,e),exists:e=>t.invoke(`${r}:fs:exists`,e),stat:e=>t.invoke(`${r}:fs:stat`,e),readFile:e=>t.invoke(`${r}:fs:readFile`,e),resolveAtFileContext:e=>t.invoke(`${r}:fs:resolveAtFileContext`,e),readFileBase64:e=>t.invoke(`${r}:fs:readFileBase64`,e),homeDir:()=>t.invoke(`${r}:fs:homeDir`),resolvePath:e=>t.invoke(`${r}:fs:resolvePath`,e),parentDir:e=>t.invoke(`${r}:fs:parentDir`,e),watchDir:e=>t.invoke(`${r}:fs:watchDir`,e),unwatchDir:e=>t.invoke(`${r}:fs:unwatchDir`,e),onDirChange:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:fs:dirChange`,n),()=>{t.removeListener(`${r}:fs:dirChange`,n)}},getSetting:e=>t.invoke(`${r}:settings:get`,e),setSetting:(e,n)=>t.invoke(`${r}:settings:set`,e,n),getAllSettings:()=>t.invoke(`${r}:settings:getAll`),deleteSetting:e=>t.invoke(`${r}:settings:delete`,e),getIndexStats:()=>t.invoke(`${r}:index:getStats`),getIndexStatus:()=>t.invoke(`${r}:index:status`),syncIndex:()=>t.invoke(`${r}:index:sync`),cancelIndex:()=>t.invoke(`${r}:index:cancel`),deleteIndex:()=>t.invoke(`${r}:index:delete`),registerIndexListener:()=>t.invoke(`${r}:index:registerListener`),unregisterIndexListener:()=>t.invoke(`${r}:index:unregisterListener`),onIndexProgress:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:index:progress`,n),()=>{t.removeListener(`${r}:index:progress`,n)}},searchAtDocuments:async(e,n)=>{let i=e.trim();return i?(await t.invoke(`${r}:search:query`,i,{limit:n?.limit,mode:n?.mode??`hybrid`})).map(e=>({kind:`doc`,id:e.id,documentId:e.id,label:e.name,mention:`@doc:${e.id}`,description:e.id,source:e.projectPath||e.projectName||e.id,snippet:e.snippet,score:e.score,matchType:e.matchType})):(await t.invoke(`${r}:search:listDocuments`,n?.limit)).map(e=>({kind:`doc`,id:e.id,documentId:e.path,label:e.name,mention:`@doc:${e.path}`,description:e.path,source:e.projectPath||e.projectName||e.path}))},listAtTerminals:async e=>{let n=e?.query?.trim().toLowerCase()??``,r=e?.limit??20,i=e?.workspaceRoot,[a,o]=await Promise.all([t.invoke(`terminal:listSessions`,i),i?t.invoke(`terminal:getActiveSessionId`,i):Promise.resolve(null)]);return[...a].sort((e,t)=>{if(o){if(e.id===o)return-1;if(t.id===o)return 1}return t.updatedAt.localeCompare(e.updatedAt)}).filter(e=>n?`${e.title} ${e.cwd} ${e.status}`.toLowerCase().includes(n):!0).slice(0,r).map(e=>({kind:`terminal`,id:e.id,sessionId:e.id,label:e.title,mention:`@terminal:${e.id}`,description:`${e.cwd} · ${e.status}`,cwd:e.cwd,status:e.status,updatedAt:e.updatedAt}))},searchAtChats:async(e,n)=>t.invoke(`${r}:at:chats:search`,e,n),asrStart:e=>t.invoke(`${r}:asr:start`,e),asrSendAudio:e=>t.invoke(`${r}:asr:sendAudio`,e),asrFinish:()=>t.invoke(`${r}:asr:finish`),asrStop:()=>t.invoke(`${r}:asr:stop`),asrStatus:()=>t.invoke(`${r}:asr:status`),asrWarmup:e=>t.invoke(`${r}:asr:warmup`,e),onAsrConnected:e=>{let n=()=>e();return t.on(`${r}:asr:connected`,n),()=>{t.removeListener(`${r}:asr:connected`,n)}},onAsrResult:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:asr:result`,n),()=>{t.removeListener(`${r}:asr:result`,n)}},onAsrError:e=>{let n=(t,n)=>{e(n)};return t.on(`${r}:asr:error`,n),()=>{t.removeListener(`${r}:asr:error`,n)}},onAsrClosed:e=>{let n=()=>e();return t.on(`${r}:asr:closed`,n),()=>{t.removeListener(`${r}:asr:closed`,n)}}})}export{n as exposeElectronBridge};
|
package/dist/renderer/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export*from"@huyooo/ai-chat-types";function e(){try{return typeof localStorage<`u`&&localStorage.getItem(`AI_CHAT_DEBUG`)===`true`}catch{return!1}}function t(e){if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack};if(e==null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;if(typeof e==`bigint`||typeof e==`symbol`||typeof e==`function`)return String(e);try{return JSON.parse(JSON.stringify(e))}catch{return String(e)}}function n(e,n,r){try{globalThis.aiChatBridge?.debugLog?.({module:e,level:n,args:r.map(t)})}catch{}}function r(t){return`${t}`,{debug:(...r)=>{e()&&n(t,`debug`,r)},info:(...r)=>{e()&&n(t,`info`,r)},warn:(...e)=>void 0,error:(...e)=>void 0}}const i=r(`HybridAdapter`);function a(e={}){let{bridgeName:t=`aiChatBridge`}=e,n=()=>{let e=window[t];if(!e)throw Error(`AI Chat Bridge not found. Make sure to call exposeElectronBridge() in preload.`);return e};return{async getModels(){return n().getModels()},async getAllTools(){let e=n();return typeof e.getAllTools==`function`?e.getAllTools():[]},async*sendMessage(e,t,r,i){let a=n(),o=[],s=null,c=!1,l=a.onProgress(e=>{let t=e;i&&t.sessionId&&t.sessionId!==i||(o.push(e),s?.(),(e.type===`done`||e.type===`error`)&&(c=!0))});a.send({message:e,images:r,options:t,sessionId:i});try{for(;!c||o.length>0;){for(;o.length===0&&!c;)await new Promise(e=>s=e);if(o.length>0){let e=o.shift();if(yield e,e.type===`done`||e.type===`error`)break}}}finally{l()}},cancel(){n().cancel()},setCwd(e){n().setCwd(e)},async getSessions(){return n().getSessions()},async getSession(e){return n().getSession(e)},async createSession(e){return n().createSession(e)},async updateSession(e,t){return n().updateSession(e,t)},async deleteSession(e){await n().deleteSession(e)},async getMessages(e){return n().getMessages(e)},async getMessagesPage(e,t){return n().getMessagesPage(e,t)},async saveMessage(e){return n().saveMessage(e)},async updateMessage(e){await n().updateMessage(e)},async deleteMessagesAfter(e,t){await n().deleteMessagesAfter(e,t)},async deleteMessagesAfterMessageId(e,t){await n().deleteMessagesAfterMessageId(e,t)},async getOperations(e){return n().getOperations(e)},async getTrashItems(){return n().getTrashItems()},async restoreFromTrash(e){return n().restoreFromTrash(e)},async listDir(e){return n().listDir(e)},async exists(e){return n().exists(e)},async stat(e){return n().stat(e)},async readFile(e){return n().readFile(e)},async resolveAtFileContext(e){return n().resolveAtFileContext(e)},async readFileBase64(e){return n().readFileBase64(e)},async homeDir(){return n().homeDir()},async resolvePath(e){return n().resolvePath(e)},async parentDir(e){return n().parentDir(e)},async watchDir(e){return n().watchDir(e)},async unwatchDir(e){return n().unwatchDir(e)},onDirChange(e){return n().onDirChange(e)},async getSetting(e){let t=n();return t.getSetting?t.getSetting(e):null},async setSetting(e,t){let r=n();r.setSetting&&await r.setSetting(e,t)},async getAllSettings(){let e=n();return e.getAllSettings?e.getAllSettings():{}},async deleteSetting(e){let t=n();t.deleteSetting&&await t.deleteSetting(e)},async getIndexStats(){let e=n();return e.getIndexStats?e.getIndexStats():{totalDocuments:0,indexSize:0,lastUpdated:null}},async getIndexStatus(){let e=n();return e.getIndexStatus?e.getIndexStatus():{isIndexing:!1,lastProgress:null}},async syncIndex(){let e=n();return e.syncIndex?e.syncIndex():{success:!1}},async cancelIndex(){let e=n();return e.cancelIndex?e.cancelIndex():{success:!1}},async deleteIndex(){let e=n();return e.deleteIndex?e.deleteIndex():{success:!1}},async registerIndexListener(){let e=n();return e.registerIndexListener?e.registerIndexListener():{success:!1}},async unregisterIndexListener(){let e=n();return e.unregisterIndexListener?e.unregisterIndexListener():{success:!1}},onIndexProgress(e){let t=n();return t.onIndexProgress?t.onIndexProgress(e):()=>{}},async searchAtDocuments(e,t){let r=n();if(!r.searchAtDocuments)return[];try{return await r.searchAtDocuments(e,{limit:t?.limit,mode:`hybrid`})}catch{return[]}},async listAtTerminals(e){let t=n();if(!t.listAtTerminals)return[];try{return await t.listAtTerminals(e)}catch{return[]}},async searchAtChats(e,t){try{return await n().searchAtChats(e,t)}catch{return[]}},onToolApprovalRequest(e){let t=n();return t.onToolApprovalRequest?t.onToolApprovalRequest(e):()=>{}},async respondToolApproval(e,t){let r=n();if(r.respondToolApproval)return r.respondToolApproval(e,t)},async asrStart(e){let t=n();return t.asrStart?t.asrStart(e):{success:!1,error:`ASR not supported`}},async asrSendAudio(e){let t=n();return t.asrSendAudio?t.asrSendAudio(e):{success:!1,error:`ASR not supported`}},async asrFinish(){let e=n();return e.asrFinish?e.asrFinish():{success:!1,error:`ASR not supported`}},async asrStop(){let e=n();return e.asrStop?e.asrStop():{success:!0}},async asrStatus(){let e=n();return e.asrStatus?e.asrStatus():{connected:!1}},async asrWarmup(e){let t=n();return t.asrWarmup?t.asrWarmup(e):{success:!1,error:`ASR not supported`}},onAsrConnected(e){let t=n();return t.onAsrConnected?t.onAsrConnected(e):()=>{}},onAsrResult(e){let t=n();return t.onAsrResult?t.onAsrResult(e):()=>{}},onAsrError(e){let t=n();return t.onAsrError?t.onAsrError(e):()=>{}},onAsrClosed(e){let t=n();return t.onAsrClosed?t.onAsrClosed(e):()=>{}},async openExternal(e){let t=n();if(t.openExternal)return t.openExternal(e)}}}function o(e){let{bridgeName:t=`aiChatBridge`,remote:n}=e,{baseURL:r,getToken:a,getAppId:o}=n,s=()=>{let e=window[t];if(!e)throw Error(`AI Chat Bridge not found. Make sure to call exposeElectronBridge() in preload.`);return e};async function c(){let e=await a(),t=o?await o():null,n={};return e&&(n.Authorization=`Bearer ${e}`),t&&(n[`app-id`]=t),n}async function l(e,t={}){let n=await c(),i=t.method?.toUpperCase()||`GET`;[`POST`,`PUT`,`PATCH`].includes(i)&&(n[`Content-Type`]=`application/json`);let a=await fetch(`${r}${e}`,{...t,headers:{...n,...t.headers||{}}});if(!a.ok)throw Error(`HTTP ${a.status}: ${a.statusText}`);return a.json()}function u(e){try{return JSON.parse(e)}catch{return null}}let d=null;return{async getModels(){return(await l(`/chat/models`)).models||[]},async getAllTools(){let e=s();return typeof e.getAllTools==`function`?e.getAllTools():[]},async*sendMessage(e,t,n,a){d&&d.abort(),d=new AbortController;let{signal:o}=d;try{let l=s(),d=typeof l.getToolDefinitions==`function`?await l.getToolDefinitions():[],f=e,p=t,m=n,h=0;for(let e=0;e<10;e++){i.debug(`开始远端流式请求`,{iteration:e+1,stepNumberOffset:h,hasHistory:!!p?.history?.length});let t=await c(),n=await fetch(`${r}/chat/stream`,{method:`POST`,headers:{...t,"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify({message:f,options:p,images:m,sessionId:a,tools:d}),signal:o});if(!n.ok)throw Error(`HTTP ${n.status}: ${n.statusText}`);let s=n.body?.getReader();if(!s)throw Error(`Response body is not readable`);let g=new TextDecoder,_=``,v=[],y=``,b=!1,x=0;for(;;){let{done:t,value:n}=await s.read();if(t)break;_+=g.decode(n,{stream:!0});let r=_.split(`
|
|
1
|
+
export*from"@huyooo/ai-chat-types";function e(){try{return typeof localStorage<`u`&&localStorage.getItem(`AI_CHAT_DEBUG`)===`true`}catch{return!1}}function t(e){if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack};if(e==null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;if(typeof e==`bigint`||typeof e==`symbol`||typeof e==`function`)return String(e);try{return JSON.parse(JSON.stringify(e))}catch{return String(e)}}function n(e,n,r){try{globalThis.aiChatBridge?.debugLog?.({module:e,level:n,args:r.map(t)})}catch{}}function r(t){return`${t}`,{debug:(...r)=>{e()&&n(t,`debug`,r)},info:(...r)=>{e()&&n(t,`info`,r)},warn:(...e)=>void 0,error:(...e)=>void 0}}const i=r(`HybridAdapter`);function a(e={}){let{bridgeName:t=`aiChatBridge`}=e,n=()=>{let e=window[t];if(!e)throw Error(`AI Chat Bridge not found. Make sure to call exposeElectronBridge() in preload.`);return e};return{async getModels(){return n().getModels()},onModelsUpdated(e){return n().onModelsUpdated?.(e)??(()=>{})},async getAllTools(){let e=n();return typeof e.getAllTools==`function`?e.getAllTools():[]},async*sendMessage(e,t,r,i){let a=n(),o=[],s=null,c=!1,l=a.onProgress(e=>{let t=e;i&&t.sessionId&&t.sessionId!==i||(o.push(e),s?.(),(e.type===`done`||e.type===`error`)&&(c=!0))});a.send({message:e,images:r,options:t,sessionId:i});try{for(;!c||o.length>0;){for(;o.length===0&&!c;)await new Promise(e=>s=e);if(o.length>0){let e=o.shift();if(yield e,e.type===`done`||e.type===`error`)break}}}finally{l()}},cancel(){n().cancel()},setCwd(e){n().setCwd(e)},async getSessions(){return n().getSessions()},async getSession(e){return n().getSession(e)},async createSession(e){return n().createSession(e)},async updateSession(e,t){return n().updateSession(e,t)},async deleteSession(e){await n().deleteSession(e)},async getMessages(e){return n().getMessages(e)},async getMessagesPage(e,t){return n().getMessagesPage(e,t)},async saveMessage(e){return n().saveMessage(e)},async updateMessage(e){await n().updateMessage(e)},async deleteMessagesAfter(e,t){await n().deleteMessagesAfter(e,t)},async deleteMessagesAfterMessageId(e,t){await n().deleteMessagesAfterMessageId(e,t)},async getOperations(e){return n().getOperations(e)},async getTrashItems(){return n().getTrashItems()},async restoreFromTrash(e){return n().restoreFromTrash(e)},async listDir(e){return n().listDir(e)},async exists(e){return n().exists(e)},async stat(e){return n().stat(e)},async readFile(e){return n().readFile(e)},async resolveAtFileContext(e){return n().resolveAtFileContext(e)},async readFileBase64(e){return n().readFileBase64(e)},async homeDir(){return n().homeDir()},async resolvePath(e){return n().resolvePath(e)},async parentDir(e){return n().parentDir(e)},async watchDir(e){return n().watchDir(e)},async unwatchDir(e){return n().unwatchDir(e)},onDirChange(e){return n().onDirChange(e)},async getSetting(e){let t=n();return t.getSetting?t.getSetting(e):null},async setSetting(e,t){let r=n();r.setSetting&&await r.setSetting(e,t)},async getAllSettings(){let e=n();return e.getAllSettings?e.getAllSettings():{}},async deleteSetting(e){let t=n();t.deleteSetting&&await t.deleteSetting(e)},async getIndexStats(){let e=n();return e.getIndexStats?e.getIndexStats():{totalDocuments:0,indexSize:0,lastUpdated:null}},async getIndexStatus(){let e=n();return e.getIndexStatus?e.getIndexStatus():{isIndexing:!1,lastProgress:null}},async syncIndex(){let e=n();return e.syncIndex?e.syncIndex():{success:!1}},async cancelIndex(){let e=n();return e.cancelIndex?e.cancelIndex():{success:!1}},async deleteIndex(){let e=n();return e.deleteIndex?e.deleteIndex():{success:!1}},async registerIndexListener(){let e=n();return e.registerIndexListener?e.registerIndexListener():{success:!1}},async unregisterIndexListener(){let e=n();return e.unregisterIndexListener?e.unregisterIndexListener():{success:!1}},onIndexProgress(e){let t=n();return t.onIndexProgress?t.onIndexProgress(e):()=>{}},async searchAtDocuments(e,t){let r=n();if(!r.searchAtDocuments)return[];try{return await r.searchAtDocuments(e,{limit:t?.limit,mode:`hybrid`})}catch{return[]}},async listAtTerminals(e){let t=n();if(!t.listAtTerminals)return[];try{return await t.listAtTerminals(e)}catch{return[]}},async searchAtChats(e,t){try{return await n().searchAtChats(e,t)}catch{return[]}},onToolApprovalRequest(e){let t=n();return t.onToolApprovalRequest?t.onToolApprovalRequest(e):()=>{}},async respondToolApproval(e,t){let r=n();if(r.respondToolApproval)return r.respondToolApproval(e,t)},async asrStart(e){let t=n();return t.asrStart?t.asrStart(e):{success:!1,error:`ASR not supported`}},async asrSendAudio(e){let t=n();return t.asrSendAudio?t.asrSendAudio(e):{success:!1,error:`ASR not supported`}},async asrFinish(){let e=n();return e.asrFinish?e.asrFinish():{success:!1,error:`ASR not supported`}},async asrStop(){let e=n();return e.asrStop?e.asrStop():{success:!0}},async asrStatus(){let e=n();return e.asrStatus?e.asrStatus():{connected:!1}},async asrWarmup(e){let t=n();return t.asrWarmup?t.asrWarmup(e):{success:!1,error:`ASR not supported`}},onAsrConnected(e){let t=n();return t.onAsrConnected?t.onAsrConnected(e):()=>{}},onAsrResult(e){let t=n();return t.onAsrResult?t.onAsrResult(e):()=>{}},onAsrError(e){let t=n();return t.onAsrError?t.onAsrError(e):()=>{}},onAsrClosed(e){let t=n();return t.onAsrClosed?t.onAsrClosed(e):()=>{}},async openExternal(e){let t=n();if(t.openExternal)return t.openExternal(e)}}}function o(e){let{bridgeName:t=`aiChatBridge`,remote:n}=e,{baseURL:r,getToken:a,getAppId:o}=n,s=()=>{let e=window[t];if(!e)throw Error(`AI Chat Bridge not found. Make sure to call exposeElectronBridge() in preload.`);return e};async function c(){let e=await a(),t=o?await o():null,n={};return e&&(n.Authorization=`Bearer ${e}`),t&&(n[`app-id`]=t),n}async function l(e,t={}){let n=await c(),i=t.method?.toUpperCase()||`GET`;[`POST`,`PUT`,`PATCH`].includes(i)&&(n[`Content-Type`]=`application/json`);let a=await fetch(`${r}${e}`,{...t,headers:{...n,...t.headers||{}}});if(!a.ok)throw Error(`HTTP ${a.status}: ${a.statusText}`);return a.json()}function u(e){try{return JSON.parse(e)}catch{return null}}let d=null;return{async getModels(){return(await l(`/chat/models`)).models||[]},async getAllTools(){let e=s();return typeof e.getAllTools==`function`?e.getAllTools():[]},async*sendMessage(e,t,n,a){d&&d.abort(),d=new AbortController;let{signal:o}=d;try{let l=s(),d=typeof l.getToolDefinitions==`function`?await l.getToolDefinitions():[],f=e,p=t,m=n,h=0;for(let e=0;e<10;e++){i.debug(`开始远端流式请求`,{iteration:e+1,stepNumberOffset:h,hasHistory:!!p?.history?.length});let t=await c(),n=await fetch(`${r}/chat/stream`,{method:`POST`,headers:{...t,"Content-Type":`application/json`,Accept:`text/event-stream`},body:JSON.stringify({message:f,options:p,images:m,sessionId:a,tools:d}),signal:o});if(!n.ok)throw Error(`HTTP ${n.status}: ${n.statusText}`);let s=n.body?.getReader();if(!s)throw Error(`Response body is not readable`);let g=new TextDecoder,_=``,v=[],y=``,b=!1,x=0;for(;;){let{done:t,value:n}=await s.read();if(t)break;_+=g.decode(n,{stream:!0});let r=_.split(`
|
|
2
2
|
`);_=r.pop()||``;for(let t of r)if(t.startsWith(`data: `)){let n=t.slice(6).trim();if(n===`[DONE]`)break;let r=u(n);if(r){let t=r.type===`step_start`||r.type===`step_end`||r.type===`assistant_segment_start`?(typeof r.data.stepNumber==`number`&&(x=Math.max(x,r.data.stepNumber)),{...r,data:{...r.data,...typeof r.data.stepNumber==`number`?{stepNumber:r.data.stepNumber+h}:{}}}):r;if((t.type===`assistant_segment_start`||t.type===`step_start`||t.type===`step_end`||t.type===`text_start`||t.type===`text_end`||t.type===`done`)&&i.debug(`出站事件`,{iteration:e+1,rawType:r.type,outgoingType:t.type,rawStepNumber:`stepNumber`in r.data?r.data.stepNumber:void 0,outgoingStepNumber:`stepNumber`in t.data?t.data.stepNumber:void 0,blockId:`blockId`in t.data?t.data.blockId:void 0}),r.type===`text_delta`&&(y+=r.data.content||``),r.type===`tool_call_request`){let{id:e,name:t,args:n,ui:a,approvalPolicy:o,sideEffectLevel:s,hostDependency:c,riskSummary:l,riskTags:u,riskSignals:d}=r.data;i.debug(`收到 tool_call_request:`,t,`args:`,JSON.stringify(n).slice(0,500)),v.push({id:e,name:t,args:n}),yield{type:`tool_call_start`,data:{id:e,name:t,args:n,...a?{ui:a}:{},...o?{approvalPolicy:o}:{},...s?{sideEffectLevel:s}:{},...c?{hostDependency:c}:{},...l?{riskSummary:l}:{},...u?.length?{riskTags:u}:{},...d?.length?{riskSignals:d}:{},startedAt:Date.now()}}}else if(r.type===`done`)v.length>0?b=!0:yield r;else if(yield t,r.type===`error`)return}}}if(_.startsWith(`data: `)){let t=_.slice(6).trim();if(t&&t!==`[DONE]`){let n=u(t);if(n&&n.type!==`tool_call_request`){let t=n.type===`step_start`||n.type===`step_end`||n.type===`assistant_segment_start`?(typeof n.data.stepNumber==`number`&&(x=Math.max(x,n.data.stepNumber)),{...n,data:{...n.data,...typeof n.data.stepNumber==`number`?{stepNumber:n.data.stepNumber+h}:{}}}):n;(t.type===`assistant_segment_start`||t.type===`step_start`||t.type===`step_end`||t.type===`text_start`||t.type===`text_end`||t.type===`done`)&&i.debug(`出站尾事件`,{iteration:e+1,rawType:n.type,outgoingType:t.type,rawStepNumber:`stepNumber`in n.data?n.data.stepNumber:void 0,outgoingStepNumber:`stepNumber`in t.data?t.data.stepNumber:void 0,blockId:`blockId`in t.data?t.data.blockId:void 0}),n.type===`done`&&v.length>0?b=!0:yield t}}}if(v.length>0&&b){i.debug(`执行工具:`,v.map(e=>e.name).join(`, `));let t=[];for(let e of v){let n=Date.now();i.debug(`executeTool(${e.name}) args:`,JSON.stringify(e.args).slice(0,500));let r=await l.executeTool(e.name,e.args,{toolCallId:e.id,sessionId:a});i.debug(`executeTool(${e.name}) result:`,JSON.stringify(r).slice(0,500)),yield{type:`tool_call_result`,data:{id:e.id,name:e.name,result:r.result,success:r.success,error:r.error,toolError:r.toolError,ui:r.ui,approvalPolicy:r.approvalPolicy,sideEffectLevel:r.sideEffectLevel,hostDependency:r.hostDependency,riskSummary:r.riskSummary,riskTags:r.riskTags,riskSignals:r.riskSignals,endedAt:Date.now(),duration:Date.now()-n}},t.push({role:`tool`,content:r.result,tool_call_id:e.id})}let n=v.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.args)}})),r=[...p?.history||[],...f?[{role:`user`,content:f}]:[],{role:`assistant`,content:y,tool_calls:n},...t];i.debug(`继续对话,新 history 长度:`,r.length),f=``,p={...p,history:r},m=void 0,y=``,i.debug(`进入 continuation`,{iteration:e+1,requestMaxStepNumber:x,nextStepNumberOffset:h+Math.max(x,1),toolCalls:v.map(e=>e.name)}),h+=Math.max(x,1)}else{i.debug(`流式请求结束,无 continuation`,{iteration:e+1,requestMaxStepNumber:x,stepNumberOffset:h});break}}}finally{d=null}},cancel(){d&&=(d.abort(),null)},setCwd(e){s().setCwd(e)},async getSessions(){return s().getSessions()},async getSession(e){return s().getSession(e)},async createSession(e){return s().createSession(e)},async updateSession(e,t){return s().updateSession(e,t)},async deleteSession(e){await s().deleteSession(e)},async getMessages(e){return s().getMessages(e)},async getMessagesPage(e,t){return s().getMessagesPage(e,t)},async saveMessage(e){return s().saveMessage(e)},async updateMessage(e){await s().updateMessage(e)},async deleteMessagesAfter(e,t){await s().deleteMessagesAfter(e,t)},async deleteMessagesAfterMessageId(e,t){await s().deleteMessagesAfterMessageId(e,t)},async getOperations(e){return s().getOperations(e)},async getTrashItems(){return s().getTrashItems()},async restoreFromTrash(e){return s().restoreFromTrash(e)},async listDir(e){return s().listDir(e)},async exists(e){return s().exists(e)},async stat(e){return s().stat(e)},async readFile(e){return s().readFile(e)},async resolveAtFileContext(e){return s().resolveAtFileContext(e)},async readFileBase64(e){return s().readFileBase64(e)},async homeDir(){return s().homeDir()},async resolvePath(e){return s().resolvePath(e)},async parentDir(e){return s().parentDir(e)},async watchDir(e){return s().watchDir(e)},async unwatchDir(e){return s().unwatchDir(e)},onDirChange(e){return s().onDirChange(e)},async getSetting(e){let t=s();return t.getSetting?t.getSetting(e):null},async setSetting(e,t){let n=s();n.setSetting&&await n.setSetting(e,t)},async getAllSettings(){let e=s();return e.getAllSettings?e.getAllSettings():{}},async deleteSetting(e){let t=s();t.deleteSetting&&await t.deleteSetting(e)},async getIndexStats(){let e=s();return e.getIndexStats?e.getIndexStats():{totalDocuments:0,indexSize:0,lastUpdated:null}},async getIndexStatus(){let e=s();return e.getIndexStatus?e.getIndexStatus():{isIndexing:!1,lastProgress:null}},async syncIndex(){let e=s();return e.syncIndex?e.syncIndex():{success:!1}},async cancelIndex(){let e=s();return e.cancelIndex?e.cancelIndex():{success:!1}},async deleteIndex(){let e=s();return e.deleteIndex?e.deleteIndex():{success:!1}},async registerIndexListener(){let e=s();return e.registerIndexListener?e.registerIndexListener():{success:!1}},async unregisterIndexListener(){let e=s();return e.unregisterIndexListener?e.unregisterIndexListener():{success:!1}},onIndexProgress(e){let t=s();return t.onIndexProgress?t.onIndexProgress(e):()=>{}},async searchAtDocuments(e,t){let n=s();if(!n.searchAtDocuments)return[];try{return await n.searchAtDocuments(e,{limit:t?.limit,mode:`hybrid`})}catch{return[]}},async listAtTerminals(e){let t=s();if(!t.listAtTerminals)return[];try{return await t.listAtTerminals(e)}catch{return[]}},async searchAtChats(e,t){try{return await s().searchAtChats(e,t)}catch{return[]}},onToolApprovalRequest(e){return()=>{}},async respondToolApproval(e,t){},async asrStart(e){let t=s();return t.asrStart?t.asrStart(e):{success:!1,error:`ASR not supported`}},async asrSendAudio(e){let t=s();return t.asrSendAudio?t.asrSendAudio(e):{success:!1,error:`ASR not supported`}},async asrFinish(){let e=s();return e.asrFinish?e.asrFinish():{success:!1,error:`ASR not supported`}},async asrStop(){let e=s();return e.asrStop?e.asrStop():{success:!0}},async asrStatus(){let e=s();return e.asrStatus?e.asrStatus():{connected:!1}},async asrWarmup(e){let t=s();return t.asrWarmup?t.asrWarmup(e):{success:!1,error:`ASR not supported`}},onAsrConnected(e){let t=s();return t.onAsrConnected?t.onAsrConnected(e):()=>{}},onAsrResult(e){let t=s();return t.onAsrResult?t.onAsrResult(e):()=>{}},onAsrError(e){let t=s();return t.onAsrError?t.onAsrError(e):()=>{}},onAsrClosed(e){let t=s();return t.onAsrClosed?t.onAsrClosed(e):()=>{}},async openExternal(e){let t=s();if(t.openExternal)return t.openExternal(e)}}}export{a as createElectronAdapter,o as createHybridAdapter,r as createLogger};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@huyooo/ai-chat-bridge-electron",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.12",
|
|
4
4
|
"description": "AI Chat Electron Bridge - IPC integration for Electron apps",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/main/index.js",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"clean": "rm -rf dist tsconfig.tsbuildinfo"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@huyooo/ai-chat-core": "^0.3.
|
|
36
|
-
"@huyooo/ai-chat-host-node": "^0.3.
|
|
37
|
-
"@huyooo/ai-chat-storage": "^0.3.
|
|
38
|
-
"@huyooo/ai-chat-tools-node": "^0.3.
|
|
39
|
-
"@huyooo/ai-chat-types": "^0.3.
|
|
35
|
+
"@huyooo/ai-chat-core": "^0.3.12",
|
|
36
|
+
"@huyooo/ai-chat-host-node": "^0.3.12",
|
|
37
|
+
"@huyooo/ai-chat-storage": "^0.3.12",
|
|
38
|
+
"@huyooo/ai-chat-tools-node": "^0.3.12",
|
|
39
|
+
"@huyooo/ai-chat-types": "^0.3.12",
|
|
40
40
|
"uuid": "^11.1.0",
|
|
41
41
|
"ws": "^8.18.3"
|
|
42
42
|
},
|