Merge PR #1300: tailscale Windows fix, quota pagination, SSE abort handling

- fix(tunnel): cross-platform tailscale probes without shell redirection
- feat(usage): paginate provider limits with page size controls
- feat(providers): stop control for one-by-one connection testing
- fix(sse): close stream gracefully on abort/disconnect instead of pipe errors
- ui(quota): simplify header, always show pagination in one row

Co-authored-by: philau2512 <dplau25122002@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
decolua
2026-05-21 12:15:07 +07:00
parent e84ab7857a
commit 6b0dc09239
8 changed files with 1183 additions and 295 deletions

View File

@@ -49,7 +49,8 @@ function fallbackBin() {
function bgRefreshBin() {
if (binCache.refreshing) return;
binCache.refreshing = true;
execAsync("which tailscale 2>/dev/null || where tailscale 2>nul", { windowsHide: true, timeout: PROBE_TIMEOUT_MS })
const cmd = IS_WINDOWS ? "where tailscale 2>nul" : "which tailscale 2>/dev/null";
execAsync(cmd, { windowsHide: true, timeout: PROBE_TIMEOUT_MS })
.then(({ stdout }) => {
const sys = stdout.trim();
binCache.value = sys || fallbackBin();
@@ -138,9 +139,10 @@ export function isTailscaleRunningStrict() {
const bin = getTailscaleBin();
if (!bin) return false;
try {
const out = execSync(`"${bin}" ${SOCKET_FLAG.join(" ")} funnel status --json 2>/dev/null`, {
const out = execSync(`"${bin}" ${SOCKET_FLAG.join(" ")} funnel status --json`, {
encoding: "utf8",
windowsHide: true,
stdio: ["ignore", "pipe", "ignore"],
timeout: PROBE_TIMEOUT_MS,
});
const json = JSON.parse(out);