监控、OSD

This commit is contained in:
zhongluofeng
2026-07-28 18:31:39 +08:00
parent 7e6149355e
commit 3d3096b2a3
11 changed files with 3475 additions and 107 deletions
+19 -28
View File
@@ -44,7 +44,7 @@ export interface MonitorStatus {
restartCount: number
/** 是否为提权模式(通过 UAC 以管理员权限启动) */
elevated: boolean
/** Thing 自身是否以管理员权限运行(永久提权模式) */
/** Thing 自身是否以管理员权限运行(提权模式) */
thingElevated: boolean
}
@@ -122,7 +122,7 @@ export const useMonitorStore = defineStore('monitor', () => {
/** 是否已完成首次加载(避免初始 null/false 导致 UI 闪烁误导状态) */
const initialized = ref(false)
/** 永久提权标志是否已启用(后续启动自动触发 UAC) */
/** 提权标志是否已启用(后续启动自动触发 UAC) */
const elevateOnLaunch = ref(false)
/** 硬件监控配置(可用硬件 + 传感器类型清单 + 当前启用状态) */
@@ -138,8 +138,8 @@ export const useMonitorStore = defineStore('monitor', () => {
if (!status.value) return 'idle'
if (!status.value.running) return 'idle'
if (!status.value.ready) return 'loading'
if (eventCount.value === 0) return 'loading'
if (Date.now() - lastEventTime.value > STALE_TIMEOUT_MS) return 'disconnected'
// Kernel 已 ready 即视为已连接(避免 SSE 首事件延迟导致一直显示"启动中")
if (Date.now() - lastEventTime.value > STALE_TIMEOUT_MS && eventCount.value > 0) return 'disconnected'
return 'connected'
})
@@ -197,6 +197,14 @@ export const useMonitorStore = defineStore('monitor', () => {
try {
await invoke('monitor_start')
await refreshStatus()
// 进程拉起可能存在竞态(spawn 后状态未立即更新),短暂重试确保 running=true
if (!status.value?.running) {
for (let i = 0; i < 6; i++) {
await new Promise(r => setTimeout(r, 500))
await refreshStatus()
if (status.value?.running) break
}
}
} catch (e) {
errorMsg.value = String(e)
logger.error('启动失败: ' + e)
@@ -222,26 +230,8 @@ export const useMonitorStore = defineStore('monitor', () => {
}
}
/** 以管理员权限重启 Kernel(弹 UAC
* 停止当前 Kernel → ShellExecute "runas" → 等待 ready → 重新订阅 SSE
* 提权后进程不归 ProcessManager 管,停止走 /shutdown 接口。
*/
async function startElevated() {
if (starting.value) return
starting.value = true
errorMsg.value = null
try {
await invoke('monitor_start_elevated')
await refreshStatus()
} catch (e) {
errorMsg.value = String(e)
logger.error('提权启动失败: ' + e)
} finally {
starting.value = false
}
}
/** 永久提权:以管理员权限重启 Thing 自身,ThingHK 子进程会继承管理员权限。
/** 提权:以管理员权限重启 Thing 自身,ThingHK 子进程会继承管理员权限
* Thing 以管理员权限运行时,ProcessManager 可直接管控 ThingHK,崩溃自动重启
* 非管理员时进程退出;已是管理员时仅设置标志并返回。 */
async function elevateSelf() {
if (starting.value) return
@@ -253,13 +243,13 @@ export const useMonitorStore = defineStore('monitor', () => {
await refreshElevateOnLaunch()
} catch (e) {
errorMsg.value = String(e)
logger.error('永久提权失败: ' + e)
logger.error('提权失败: ' + e)
} finally {
starting.value = false
}
}
/** 刷新永久提权标志状态 */
/** 刷新提权标志状态 */
async function refreshElevateOnLaunch() {
try {
elevateOnLaunch.value = await invoke<boolean>('monitor_get_elevate_on_launch')
@@ -269,7 +259,7 @@ export const useMonitorStore = defineStore('monitor', () => {
return elevateOnLaunch.value
}
/** 取消永久提权:清除标志,下次启动不再触发 UAC(当前会话权限不变) */
/** 取消提权:清除标志,下次启动不再触发 UAC(当前会话权限不变) */
async function cancelElevation() {
try {
await invoke('monitor_set_elevate_on_launch', { enabled: false })
@@ -337,6 +327,8 @@ export const useMonitorStore = defineStore('monitor', () => {
}))
unlistenFns.push(await listen('monitor-ready', () => {
refreshStatus()
// Kernel 就绪后主动拉取一次快照,避免等待 SSE 首事件导致 UI 空白
fetchSnapshot()
}))
unlistenFns.push(await listen('monitor-loading', () => {
// 后端正在等待 Kernel ready,刷新状态以反映 running=true
@@ -416,7 +408,6 @@ export const useMonitorStore = defineStore('monitor', () => {
refreshKernelInfo,
refreshElevateOnLaunch,
start,
startElevated,
elevateSelf,
cancelElevation,
fetchHardwareConfig,