openpencil/server/utils/opencode-client.ts
Kayshen-X d51510d7e9 feat(electron): integrate Electron framework for desktop application support
- Add Electron configuration and main process setup for building a desktop application.
- Implement IPC communication for file operations (open, save) between the renderer and main processes.
- Create a preload script to expose Electron APIs to the renderer.
- Update package.json to include Electron and related dependencies.
- Enhance the build process with electron-builder for packaging the application.
- Introduce a new electron-builder.yml configuration file for build settings.
- Modify Vite configuration to support Electron-specific builds.
- Update UI components to accommodate Electron's window management and drag regions.
2026-02-20 20:19:06 +08:00

41 lines
1.2 KiB
TypeScript

/**
* Shared OpenCode client manager.
* Reuses an existing server on port 4096; starts one on a random port as fallback.
* Tracks spawned servers so they can be cleaned up on process exit.
*/
const activeServers = new Set<{ close(): void }>()
// Clean up spawned OpenCode servers on process exit
function cleanup() {
for (const server of activeServers) {
try { server.close() } catch { /* ignore */ }
}
activeServers.clear()
}
process.on('beforeExit', cleanup)
process.on('SIGTERM', cleanup)
process.on('SIGINT', cleanup)
export async function getOpencodeClient() {
const { createOpencodeClient, createOpencode } = await import('@opencode-ai/sdk/v2')
// Try connecting to an existing server first
try {
const client = createOpencodeClient()
await client.config.providers() // probe
return { client, server: undefined }
} catch {
// No running server — start a temporary one on a random port
const oc = await createOpencode({ port: 0 })
activeServers.add(oc.server)
return { client: oc.client, server: oc.server }
}
}
export function releaseOpencodeServer(server: { close(): void } | undefined) {
if (!server) return
try { server.close() } catch { /* ignore */ }
activeServers.delete(server)
}