From b363e76e5ecfb6eab0cc6658605b1fd4be3e3081 Mon Sep 17 00:00:00 2001 From: Christauff Date: Mon, 26 Jan 2026 11:53:07 -0500 Subject: [PATCH] Fix Observability Linux compatibility: Replace hardcoded macOS paths Both task-watcher.ts and file-ingest.ts used hardcoded -Users- prefix for path construction, which only works on macOS (/Users/username). Linux systems use /home/username, causing the dashboard to show empty even when agents are running. Fixed by encoding HOME environment variable dynamically, replacing forward slashes with hyphens. Now generates correct paths for both: - macOS: /tmp/claude/-Users-username--claude/tasks - Linux: /tmp/claude/-home-username--claude/tasks Impact: - Remote tab: Now displays background task timeline on Linux - Local tab: Now displays PAI hook events on Linux - Backward compatible: macOS paths unchanged Tested on Ubuntu 24.04 (Linux 6.14.0-37-generic). Co-Authored-By: Claude Sonnet 4.5 --- .../src/Observability/apps/server/src/file-ingest.ts | 5 +++-- .../src/Observability/apps/server/src/task-watcher.ts | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Packs/pai-observability-server/src/Observability/apps/server/src/file-ingest.ts b/Packs/pai-observability-server/src/Observability/apps/server/src/file-ingest.ts index 01a1bfc64..d418c5a6c 100755 --- a/Packs/pai-observability-server/src/Observability/apps/server/src/file-ingest.ts +++ b/Packs/pai-observability-server/src/Observability/apps/server/src/file-ingest.ts @@ -33,8 +33,9 @@ const agentSessions = new Map(); // Todo tracking per session (session_id -> current todos) const sessionTodos = new Map(); -// Projects directory path - dynamically constructed from username -const PROJECTS_DIR = join(homedir(), '.claude', 'projects', `-Users-${process.env.USER || 'user'}--claude`); +// Projects directory path - dynamically constructed from HOME path (works on both macOS and Linux) +const homePathEncoded = (process.env.HOME || homedir()).replace(/\//g, '-'); +const PROJECTS_DIR = join(homedir(), '.claude', 'projects', `${homePathEncoded}--claude`); /** * Get the most recently modified JSONL files in projects/ diff --git a/Packs/pai-observability-server/src/Observability/apps/server/src/task-watcher.ts b/Packs/pai-observability-server/src/Observability/apps/server/src/task-watcher.ts index 18ea6e8e8..725f3e4b2 100755 --- a/Packs/pai-observability-server/src/Observability/apps/server/src/task-watcher.ts +++ b/Packs/pai-observability-server/src/Observability/apps/server/src/task-watcher.ts @@ -39,8 +39,9 @@ const pendingDescriptions = new Set(); // Callback for task updates let onTaskUpdate: ((task: BackgroundTask) => void) | null = null; -// Tasks directory - dynamically constructed from username -const TASKS_DIR = `/tmp/claude/-Users-${process.env.USER || 'user'}--claude/tasks`; +// Tasks directory - dynamically constructed from HOME path (works on both macOS and Linux) +const homePathEncoded = (process.env.HOME || homedir()).replace(/\//g, '-'); +const TASKS_DIR = `/tmp/claude/${homePathEncoded}--claude/tasks`; // Idle threshold for determining completion (30 seconds) const IDLE_THRESHOLD_MS = 30000;