diff --git a/remote/config/default.json b/remote/config/default.json index 508ab1c..684866b 100644 --- a/remote/config/default.json +++ b/remote/config/default.json @@ -27,6 +27,10 @@ "frpcPath": "./frp/frpc.exe", "configPath": "./frp/frpc.toml" }, + "opencode": { + "enabled": true, + "port": 3002 + }, "gitea": { "enabled": true } diff --git a/remote/src/core/App.js b/remote/src/core/App.js index 0cd0f53..8313a96 100644 --- a/remote/src/core/App.js +++ b/remote/src/core/App.js @@ -120,7 +120,12 @@ class App { this.container.register('openCodeService', (c) => { const OpenCodeService = require('../services/opencode/OpenCodeService'); - return new OpenCodeService(); + const config = c.resolve('config'); + const opencodeConfig = config.getSection('opencode') || {}; + return new OpenCodeService({ + enabled: opencodeConfig.enabled !== false, + port: opencodeConfig.port || 3002 + }); }); this.container.register('giteaService', (c) => { diff --git a/remote/src/services/opencode/OpenCodeService.js b/remote/src/services/opencode/OpenCodeService.js index 8726d8d..2b69546 100644 --- a/remote/src/services/opencode/OpenCodeService.js +++ b/remote/src/services/opencode/OpenCodeService.js @@ -1,15 +1,30 @@ -const { spawn } = require('child_process'); +const { spawn, execSync } = require('child_process'); +const path = require('path'); const config = require('../../config'); const logger = require('../../utils/logger'); class OpenCodeService { - constructor() { + constructor(options = {}) { this.process = null; this.isRunning = false; - this.port = 3002; + this.port = options.port || 3002; + this.enabled = options.enabled !== false; + + try { + const result = execSync('where opencode', { encoding: 'utf8', windowsHide: true }); + const firstLine = result.split('\n')[0].trim(); + this.opencodePath = firstLine.endsWith('.cmd') ? firstLine : firstLine + '.cmd'; + } catch (e) { + this.opencodePath = null; + } } start() { + if (!this.enabled) { + logger.info('OpenCode service is disabled'); + return; + } + if (this.isRunning) { logger.warn('OpenCode service is already running'); return; @@ -21,15 +36,24 @@ class OpenCodeService { return; } + if (!this.opencodePath) { + logger.error('OpenCode command not found in PATH'); + return; + } + try { - logger.info('Starting OpenCode service', { port: this.port }); + logger.info('Starting OpenCode service', { port: this.port, opencodePath: this.opencodePath }); const env = { ...process.env, OPENCODE_SERVER_PASSWORD: password }; - this.process = spawn('opencode', ['serve', '--port', this.port.toString()], { + this.process = spawn('powershell.exe', [ + '-NoProfile', + '-Command', + `& '${this.opencodePath}' serve --port ${this.port}` + ], { stdio: ['ignore', 'pipe', 'pipe'], env, windowsHide: true