Initial open-source release

This commit is contained in:
Will Chen
2025-04-11 09:37:05 -07:00
commit 43f67e0739
208 changed files with 45476 additions and 0 deletions

78
src/preload.ts Normal file
View File

@@ -0,0 +1,78 @@
// See the Electron documentation for details on how to use preload scripts:
// https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts
import { contextBridge, ipcRenderer } from "electron";
// Whitelist of valid channels
const validInvokeChannels = [
"chat:add-dep",
"chat:message",
"chat:cancel",
"chat:stream",
"create-chat",
"create-app",
"get-chat",
"get-chats",
"list-apps",
"get-app",
"edit-app-file",
"read-app-file",
"run-app",
"stop-app",
"restart-app",
"list-versions",
"revert-version",
"checkout-version",
"delete-app",
"rename-app",
"get-user-settings",
"set-user-settings",
"get-env-vars",
"open-external-url",
"reset-all",
] as const;
// Add valid receive channels
const validReceiveChannels = [
"chat:response:chunk",
"chat:response:end",
"chat:response:error",
"app:output",
] as const;
type ValidInvokeChannel = (typeof validInvokeChannels)[number];
type ValidReceiveChannel = (typeof validReceiveChannels)[number];
// Expose protected methods that allow the renderer process to use
// the ipcRenderer without exposing the entire object
contextBridge.exposeInMainWorld("electron", {
ipcRenderer: {
invoke: (channel: ValidInvokeChannel, ...args: unknown[]) => {
if (validInvokeChannels.includes(channel)) {
return ipcRenderer.invoke(channel, ...args);
}
throw new Error(`Invalid channel: ${channel}`);
},
on: (
channel: ValidReceiveChannel,
listener: (...args: unknown[]) => void
) => {
if (validReceiveChannels.includes(channel)) {
const subscription = (
_event: Electron.IpcRendererEvent,
...args: unknown[]
) => listener(...args);
ipcRenderer.on(channel, subscription);
return () => {
ipcRenderer.removeListener(channel, subscription);
};
}
throw new Error(`Invalid channel: ${channel}`);
},
removeAllListeners: (channel: ValidReceiveChannel) => {
if (validReceiveChannels.includes(channel)) {
ipcRenderer.removeAllListeners(channel);
}
},
},
});