# v0.4.30 (2026-05-11)
## Features - MCP stdio→SSE bridge: expose local stdio MCP plugins over SSE (api/mcp/[plugin]/sse, /message) - Dynamic Linux cert resolution + NSS DB injection (Debian/Arch/Fedora/openSUSE, Chrome/Chromium/Firefox incl. snap) (#1010) - Cowork tool: expanded settings UI & API - GitBook docs (DocsContent, DocsLayout) ## Fixes - OAuth callback postMessage scoped to expected origins (CWE-1385) (#998) - Re-enable TLS verification on DNS-bypass fetch (CWE-295) (#998) - Normalize `developer` role → `system` for OpenAI-format providers (Deepseek, Groq, …) (#1011, closes #773) - Respect `PORT` env in internal model-test fetch (#1014) - Dropdown text readability in dark theme on usage page (#997) ## Improvements - Refactor Claude CLI spoof headers into shared constant - Tool deduper utility in open-sse handlers
This commit is contained in:
parent
76f3d4b74e
commit
8f4d29caa4
23 changed files with 1198 additions and 155 deletions
|
|
@ -41,6 +41,7 @@ const g = global.__appSingleton ??= {
|
|||
networkMonitorInterval: null,
|
||||
lastNetworkFingerprint: null,
|
||||
lastWatchdogTick: Date.now(),
|
||||
lastOnline: null,
|
||||
mitmStartInProgress: false,
|
||||
tunnelAutoResumed: false,
|
||||
tailscaleAutoResumed: false,
|
||||
|
|
@ -209,6 +210,7 @@ function startNetworkMonitor() {
|
|||
|
||||
g.lastNetworkFingerprint = getNetworkFingerprint();
|
||||
g.lastWatchdogTick = Date.now();
|
||||
g.lastOnline = null;
|
||||
|
||||
g.networkMonitorInterval = setInterval(async () => {
|
||||
try {
|
||||
|
|
@ -218,15 +220,24 @@ function startNetworkMonitor() {
|
|||
|
||||
const currentFingerprint = getNetworkFingerprint();
|
||||
const networkChanged = currentFingerprint !== g.lastNetworkFingerprint;
|
||||
const wasSleep = elapsed > NETWORK_CHECK_INTERVAL_MS * 3;
|
||||
|
||||
const wasSleep = elapsed > NETWORK_CHECK_INTERVAL_MS * 6;
|
||||
if (networkChanged) g.lastNetworkFingerprint = currentFingerprint;
|
||||
if (!networkChanged && !wasSleep) return;
|
||||
|
||||
// Real reachability check (TCP 1.1.1.1:443) — not just interface presence
|
||||
const online = await checkInternet();
|
||||
const wasOffline = g.lastOnline === false;
|
||||
g.lastOnline = online;
|
||||
|
||||
if (!online) return; // no internet → idle, don't restart
|
||||
|
||||
const onlineEdge = wasOffline; // offline → online transition
|
||||
if (!networkChanged && !wasSleep && !onlineEdge) return;
|
||||
|
||||
// Wait for DHCP/DNS to settle before probing
|
||||
await new Promise((r) => setTimeout(r, NETWORK_SETTLE_MS));
|
||||
|
||||
const reason = wasSleep && networkChanged ? "sleep+netchange"
|
||||
const reason = onlineEdge ? "online"
|
||||
: wasSleep && networkChanged ? "sleep+netchange"
|
||||
: wasSleep ? "sleep" : "netchange";
|
||||
safeRestartTunnel(reason).catch(() => {});
|
||||
safeRestartTailscale(reason).catch(() => {});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue