feat: 巡检增强 / 拓扑大屏 / 远程 HTTP / portable 绿色打包
Some checks failed
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
Some checks failed
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
巡检模块:巡检调度器改为轮询驱动,新增每日报告存储、告警规则独立 Store、设备 Store 解耦,_executeSnapshot 补齐 DEBUG 声明,巡检中心 与告警中心页增强。 拓扑大屏:MonitoringTopologyView 扩展分组/布局控制, useMonitoringData 重构数据流。 远程 HTTP:新增 electron/remoteHttpServer.cjs,preload/api.cjs 暴露 IPC,registerBridges 注册 netcatty:http:open 桥。 portable 绿色打包: - electron-builder.config.cjs 恢复原始白名单(61MB app.asar), 收集器自动追踪运行时依赖; - portableData.cjs 重写为 .portable 标记检测; - scripts/migratePortableLocalStorage.cjs 离线脚本把 Local Storage 的 http://localhost:5173 origin 批量迁移为 app://netcatty; - scripts/scanWorkspaceDeps.cjs 扫描 workspace 运行时依赖。
This commit is contained in:
@@ -241,6 +241,19 @@ const activeStreams = new Map();
|
||||
// ── Provider registry (synced from renderer, keys stay encrypted) ──
|
||||
const ENC_PREFIX = "enc:v1:";
|
||||
let providerConfigs = [];
|
||||
const _PROVIDER_STORAGE_KEY = "_ai_provider_configs";
|
||||
|
||||
function loadProviderConfigsFromStorage() {
|
||||
try {
|
||||
const { readStorage } = require("./inspection/inspectionStorage.cjs");
|
||||
const raw = readStorage(_PROVIDER_STORAGE_KEY);
|
||||
if (Array.isArray(raw) && raw.length > 0) {
|
||||
providerConfigs = raw;
|
||||
console.log("[aiBridge] 从 inspectionStorage 加载 providerConfigs:", raw.length, "条");
|
||||
}
|
||||
} catch {}
|
||||
return providerConfigs;
|
||||
}
|
||||
// Web search config (synced from renderer — apiKey stays encrypted, decrypted on use)
|
||||
let webSearchApiHost = null;
|
||||
let webSearchApiKeyEncrypted = null;
|
||||
@@ -930,7 +943,10 @@ function createHandlerContext(ipcMain) {
|
||||
get cliDiscoveryFilePath() { return cliDiscoveryFilePath; },
|
||||
set cliDiscoveryFilePath(value) { cliDiscoveryFilePath = value; },
|
||||
activeStreams,
|
||||
get providerConfigs() { return providerConfigs; },
|
||||
get providerConfigs() {
|
||||
if (!providerConfigs || providerConfigs.length === 0) loadProviderConfigsFromStorage();
|
||||
return providerConfigs;
|
||||
},
|
||||
set providerConfigs(value) { providerConfigs = value; },
|
||||
get webSearchApiHost() { return webSearchApiHost; },
|
||||
set webSearchApiHost(value) { webSearchApiHost = value; },
|
||||
@@ -987,6 +1003,21 @@ function registerHandlers(ipcMain) {
|
||||
if (externalMcpController) {
|
||||
externalMcpController.registerHandlers(ipcMain, validateSenderOrSettings);
|
||||
}
|
||||
|
||||
// 启动时从 inspectionStorage 加载持久化的 provider configs
|
||||
// 解决重启后或远程浏览器场景下 providerConfigs 为空的问题
|
||||
try {
|
||||
const inspectionStorage = require("./inspection/inspectionStorage.cjs");
|
||||
const raw = inspectionStorage.readStorage("_ai_provider_configs");
|
||||
if (Array.isArray(raw) && raw.length > 0) {
|
||||
providerConfigs = raw;
|
||||
console.log("[aiBridge] 启动时从 inspectionStorage 加载 providerConfigs:", raw.length, "条");
|
||||
} else {
|
||||
console.log("[aiBridge] inspectionStorage 中无持久化 providerConfigs(renderer 还未 sync 过)");
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn("[aiBridge] 启动时加载 providerConfigs 失败:", e?.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Abort active streams and child processes on shutdown
|
||||
@@ -1046,4 +1077,9 @@ module.exports = {
|
||||
DEFAULT_AI_STREAM_IDLE_TIMEOUT_MS,
|
||||
getExternalMcpController: () => externalMcpController,
|
||||
get aiBridgeContext() { return registeredContext; },
|
||||
get providerConfigs() { return providerConfigs; },
|
||||
resolveProviderApiKey,
|
||||
injectApiKeyIntoRequest,
|
||||
shouldSkipTLSVerify,
|
||||
decryptApiKeyValue,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user