snapkitty
hardware
erlang
File size: 1,865 Bytes
b8a03fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import { contextBridge, ipcRenderer } from 'electron';

import type {
  BobChatResponse,
  DesktopCommandChunk,
  DesktopCommandRequest,
  DesktopCommandResult,
  DesktopFileEntry,
  DesktopFileSnapshot,
  DesktopToolSummary,
  ModelProviderSummary,
  ModelProviderUpdate,
  ShadowDesktopApi,
  WorkspaceOverview,
} from './shared.js';

const api: ShadowDesktopApi = {
  workspace: () => ipcRenderer.invoke('desktop:workspace') as Promise<WorkspaceOverview>,
  list: (path?: string) => ipcRenderer.invoke('desktop:list', path) as Promise<ReadonlyArray<DesktopFileEntry>>,
  readFile: (path: string) => ipcRenderer.invoke('desktop:read-file', path) as Promise<DesktopFileSnapshot>,
  saveFile: (path: string, content: string) => (
    ipcRenderer.invoke('desktop:save-file', path, content) as Promise<DesktopFileSnapshot>
  ),
  runCommand: (request: DesktopCommandRequest) => (
    ipcRenderer.invoke('desktop:run-command', request) as Promise<DesktopCommandResult>
  ),
  listModelProviders: () => (
    ipcRenderer.invoke('desktop:list-model-providers') as Promise<ReadonlyArray<ModelProviderSummary>>
  ),
  saveModelProvider: (update: ModelProviderUpdate) => (
    ipcRenderer.invoke('desktop:save-model-provider', update) as Promise<ReadonlyArray<ModelProviderSummary>>
  ),
  listTools: () => ipcRenderer.invoke('desktop:list-tools') as Promise<ReadonlyArray<DesktopToolSummary>>,
  bobChat: request => ipcRenderer.invoke('desktop:bob-chat', request) as Promise<BobChatResponse>,
  onCommandChunk: (listener: (chunk: DesktopCommandChunk) => void) => {
    const handler = (_event: Electron.IpcRendererEvent, chunk: DesktopCommandChunk): void => listener(chunk);
    ipcRenderer.on('desktop:command-chunk', handler);
    return () => ipcRenderer.removeListener('desktop:command-chunk', handler);
  },
};

contextBridge.exposeInMainWorld('shadowDesktop', api);