fix: renameAlias data corruption, empty sessionId match, NaN threshold

- Fix renameAlias() leaving orphaned newAlias key on save failure,
  causing in-memory data corruption with both old and new keys present
- Add sessionPath validation to setAlias() to reject empty/null paths
- Guard getSessionById() against empty string matching all sessions
  (startsWith('') is always true in JavaScript)
- Fix suggest-compact.js NaN comparison when COMPACT_THRESHOLD env var
  is set to a non-numeric value — falls back to 50 instead of silently
  disabling the threshold check
- Sync suggest-compact.js to .cursor/ copy
This commit is contained in:
Affaan Mustafa
2026-02-12 14:30:10 -08:00
parent 6e5b45ed28
commit 63be081741
4 changed files with 84 additions and 3 deletions

View File

@@ -27,7 +27,8 @@ async function main() {
// or parent PID as fallback
const sessionId = process.env.CLAUDE_SESSION_ID || String(process.ppid) || 'default';
const counterFile = path.join(getTempDir(), `claude-tool-count-${sessionId}`);
const threshold = parseInt(process.env.COMPACT_THRESHOLD || '50', 10);
const rawThreshold = parseInt(process.env.COMPACT_THRESHOLD || '50', 10);
const threshold = Number.isFinite(rawThreshold) ? rawThreshold : 50;
let count = 1;

View File

@@ -189,6 +189,11 @@ function setAlias(alias, sessionPath, title = null) {
return { success: false, error: 'Alias name cannot be empty' };
}
// Validate session path
if (!sessionPath || typeof sessionPath !== 'string' || sessionPath.trim().length === 0) {
return { success: false, error: 'Session path cannot be empty' };
}
if (!/^[a-zA-Z0-9_-]+$/.test(alias)) {
return { success: false, error: 'Alias name must contain only letters, numbers, dashes, and underscores' };
}
@@ -325,8 +330,9 @@ function renameAlias(oldAlias, newAlias) {
};
}
// Restore old alias on failure
// Restore old alias and remove new alias on failure
data.aliases[oldAlias] = aliasData;
delete data.aliases[newAlias];
return { success: false, error: 'Failed to rename alias' };
}

View File

@@ -271,7 +271,7 @@ function getSessionById(sessionId, includeContent = false) {
if (!metadata) continue;
// Check if session ID matches (short ID or full filename without .tmp)
const shortIdMatch = metadata.shortId !== 'no-id' && metadata.shortId.startsWith(sessionId);
const shortIdMatch = sessionId.length > 0 && metadata.shortId !== 'no-id' && metadata.shortId.startsWith(sessionId);
const filenameMatch = filename === sessionId || filename === `${sessionId}.tmp`;
const noIdMatch = metadata.shortId === 'no-id' && filename === `${sessionId}-session.tmp`;