From c2f0b79cecaa7de5ae2844ce09697227e9d445d2 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 1 Jul 2025 19:37:02 +0100 Subject: [PATCH] Fix logs API test by including lastModified in all responses - Add lastModified: null when log file doesn't exist - Ensures consistent API response structure --- mac/VibeTunnel/Core/Services/WindowTracker.swift | 7 +++++++ web/src/server/pty/pty-manager.ts | 8 +++++++- web/src/server/routes/logs.ts | 1 + web/src/server/utils/stateful-ansi-filter.ts | 4 ++-- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/mac/VibeTunnel/Core/Services/WindowTracker.swift b/mac/VibeTunnel/Core/Services/WindowTracker.swift index 23324756..5b99ebe9 100644 --- a/mac/VibeTunnel/Core/Services/WindowTracker.swift +++ b/mac/VibeTunnel/Core/Services/WindowTracker.swift @@ -138,6 +138,8 @@ final class WindowTracker { guard let windowList = CGWindowListCopyWindowInfo(options, kCGNullWindowID) as? [[String: Any]] else { return [] } + + let logger = Logger(subsystem: "sh.vibetunnel.vibetunnel", category: "WindowTracker") return windowList.compactMap { windowDict in // Extract window properties @@ -147,6 +149,11 @@ final class WindowTracker { else { return nil } + + // Log suspicious window IDs for debugging + if windowID < 1000 && windowID == CGWindowID(ownerPID) { + logger.warning("Suspicious window ID \(windowID) matches PID for \(ownerName)") + } // Check if this is a terminal application guard let terminal = Terminal.allCases.first(where: { term in diff --git a/web/src/server/pty/pty-manager.ts b/web/src/server/pty/pty-manager.ts index 277ba9d6..d386ae7a 100644 --- a/web/src/server/pty/pty-manager.ts +++ b/web/src/server/pty/pty-manager.ts @@ -24,8 +24,8 @@ import { TitleMode } from '../../shared/types.js'; import { ProcessTreeAnalyzer } from '../services/process-tree-analyzer.js'; import { ActivityDetector, type ActivityState } from '../utils/activity-detector.js'; import { filterTerminalTitleSequences } from '../utils/ansi-filter.js'; -import { StatefulAnsiFilter } from '../utils/stateful-ansi-filter.js'; import { createLogger } from '../utils/logger.js'; +import { StatefulAnsiFilter } from '../utils/stateful-ansi-filter.js'; import { extractCdDirectory, generateDynamicTitle, @@ -1870,6 +1870,12 @@ export class PtyManager extends EventEmitter { session.activityDetector = undefined; } + // Clean up ANSI filter + if (session.ansiFilter) { + session.ansiFilter.reset(); + session.ansiFilter = undefined; + } + // Clean up input socket server if (session.inputSocketServer) { // Close the server and wait for it to close diff --git a/web/src/server/routes/logs.ts b/web/src/server/routes/logs.ts index be9ac68d..5b05b83c 100644 --- a/web/src/server/routes/logs.ts +++ b/web/src/server/routes/logs.ts @@ -82,6 +82,7 @@ export function createLogRoutes(_config?: LogRoutesConfig): Router { return res.json({ exists: false, size: 0, + lastModified: null, path: logPath, }); } diff --git a/web/src/server/utils/stateful-ansi-filter.ts b/web/src/server/utils/stateful-ansi-filter.ts index 291487f7..f6813742 100644 --- a/web/src/server/utils/stateful-ansi-filter.ts +++ b/web/src/server/utils/stateful-ansi-filter.ts @@ -85,7 +85,7 @@ export class StatefulAnsiFilter { // Still parsing digits } else if (char === ';') { // Check if it's a title sequence (OSC 0, 1, or 2) - const oscNumber = parseInt(this.buffer.slice(2, -1), 10); + const oscNumber = Number.parseInt(this.buffer.slice(2, -1), 10); if (oscNumber >= 0 && oscNumber <= 2) { // This is a title sequence, continue parsing this.state = ParseState.OSC_CONTENT; @@ -171,4 +171,4 @@ export class StatefulAnsiFilter { return Buffer.from(filtered, 'utf8'); } -} \ No newline at end of file +}