稳定测试版

This commit is contained in:
2025-10-28 19:40:13 +08:00
commit 183feef2ea
24 changed files with 11631 additions and 0 deletions

78
main/services/iosai.js Normal file
View File

@@ -0,0 +1,78 @@
// main/services/iosai.js
const { app } = require('electron')
const path = require('path')
const fs = require('fs')
const { exec } = require('child_process')
const axios = require('axios')
let iosAIProcess = null
let userData = { tenantId: null, userId: null, tokenValue: null } // 如果需要共享,请提供 setter
function resolveIOSAIPath() {
const candidates = [
path.join(path.dirname(process.execPath), 'iOSAI', 'IOSAI.exe'),
path.join(process.resourcesPath || '', 'iOSAI', 'IOSAI.exe'),
path.join(__dirname, '..', 'iOSAI', 'IOSAI.exe'),
path.join(process.cwd(), 'iOSAI', 'IOSAI.exe'),
]
for (const p of candidates) {
try { if (fs.existsSync(p)) return p } catch { }
}
return null
}
function startIOSAIExecutable() {
if (process.platform !== 'win32') {
console.warn('[IOSAI] 非 Windows跳过')
return
}
const exePath = resolveIOSAIPath()
if (!exePath) return console.error('[IOSAI] 未找到 IOSAI.exe')
const exeDir = path.dirname(exePath)
const exeFile = path.basename(exePath)
const cmd = `start "" /D "${exeDir}" "${exeFile}"`
try {
exec(cmd, { cwd: exeDir, windowsHide: false }, (err) => {
if (err) console.error('[IOSAI] 启动失败:', err)
else console.log('[IOSAI] 启动命令已执行')
})
} catch (e) { console.error('[IOSAI] 启动异常:', e) }
}
async function killIOSAI() {
try {
if (userData.userId && userData.tenantId) {
await axios.post('https://crawlclient.api.yolozs.com/api/user/aiChat-logout',
{ userId: userData.userId, tenantId: userData.tenantId },
{ headers: { 'Content-Type': 'application/json', 'vvtoken': userData.tokenValue } }
).catch(e => console.log('[IOSAI] 登出失败', e?.message))
}
if (iosAIProcess?.pid) {
exec(`taskkill /PID ${iosAIProcess.pid} /T /F`, (err) => {
if (err) {
exec('taskkill /IM IOSAI.exe /F')
}
})
} else {
exec('taskkill /IM IOSAI.exe /F')
exec('taskkill /IM iproxy.exe /F')
exec('taskkill /IM tidevice.exe /F')
}
} catch { }
iosAIProcess = null
}
function isProcessRunningWin(exeName) {
return new Promise((resolve) => {
if (process.platform !== 'win32') return resolve(true)
const cmd = `tasklist /FI "IMAGENAME eq ${exeName}" /FO CSV /NH`
exec(cmd, { windowsHide: true }, (err, stdout) => {
if (err || !stdout) return resolve(false)
resolve(stdout.toLowerCase().includes(`"${exeName.toLowerCase()}"`))
})
})
}
module.exports = { startIOSAIExecutable, killIOSAI, isProcessRunningWin }

20
main/services/sse.js Normal file
View File

@@ -0,0 +1,20 @@
// main/services/sse.js
const { startSSE } = require('../../js/sse-server')
const { createBurstBroadcaster } = require('../../js/burst-broadcast')
function start() {
const sseServer = startSSE()
const broadcast = createBurstBroadcaster(sseServer.broadcast, {
event: 'message',
idleMs: 10_000,
startPayload: 'start',
startOnFirst: true
})
// 返回一个统一接口
return {
broadcast: (event, payload) => sseServer.broadcast(event, payload),
burst: broadcast,
}
}
module.exports = { startSSE: start }