From 9c0e864532dcc5ce7ee890d3b4db722872db2b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?X=C3=AC=20G=C3=A0?= Date: Fri, 27 Feb 2026 22:46:23 +0700 Subject: [PATCH] fix(claude): correct project encoded path (#451) fix wrong regex replace of Claude project path related #447, reopen due to forced-push to reproduce error steps, let's try Create a folder with @ in name like @test Add this folder as new project in CloudCLI Choose Claude tool in new Session Star by typing sth 'hi' In the dev tools, you will see errors ajax response said that session does not find for 'some-session-id' The main problem is current encode path doesn't encode '@' to '-' as Claude did I reversed code Claude-SDK, file 'cli.js' to find exactly regex (using in PR) that used to encode path under ~/.claude/projects/.jsonl --- server/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/index.js b/server/index.js index 497ed874..352dd7e5 100755 --- a/server/index.js +++ b/server/index.js @@ -1218,7 +1218,7 @@ function handleShellConnection(ws) { if (hasSession && sessionId) { try { // Gemini CLI enforces its own native session IDs, unlike other agents that accept arbitrary string names. - // The UI only knows about its internal generated `sessionId` (e.g. gemini_1234). + // The UI only knows about its internal generated `sessionId` (e.g. gemini_1234). // We must fetch the mapping from the backend session manager to pass the native `cliSessionId` to the shell. const sess = sessionManager.getSession(sessionId); if (sess && sess.cliSessionId) { @@ -1791,8 +1791,8 @@ app.get('/api/projects/:projectName/sessions/:sessionId/token-usage', authentica // Construct the JSONL file path // Claude stores session files in ~/.claude/projects/[encoded-project-path]/[session-id].jsonl - // The encoding replaces /, spaces, ~, and _ with - - const encodedPath = projectPath.replace(/[\\/:\s~_]/g, '-'); + // The encoding replaces any non-alphanumeric character (except -) with - + const encodedPath = projectPath.replace(/[^a-zA-Z0-9-]/g, '-'); const projectDir = path.join(homeDir, '.claude', 'projects', encodedPath); const jsonlPath = path.join(projectDir, `${safeSessionId}.jsonl`);