mirror of
https://github.com/getpaseo/paseo.git
synced 2026-07-29 12:01:31 +00:00
* Add metrics collection and terminal performance tests
* fix: handle Windows drive-letter paths across the codebase
Windows paths like C:\Users\foo\project were broken in multiple places:
- agent-storage slugified D:\MyProject as D:-MyProject (illegal colon)
- terminal-manager rejected all non-/ paths as relative
- bootstrap parser misparsed drive colons as TCP host:port
- daemon/client connection helpers misclassified Windows paths
- CLI cwd filtering used hardcoded / separators
- checkout-git worktree detection used hardcoded / in path checks
- worktree archive used split("/").pop() instead of path.basename()
All path helpers now normalize separators and handle Windows
drive letters with case-insensitive comparison where needed.
28 lines
1.1 KiB
TypeScript
28 lines
1.1 KiB
TypeScript
/**
|
|
* Path utilities for cwd filtering in agent commands.
|
|
*/
|
|
|
|
/**
|
|
* Check if `candidatePath` is the same directory as `basePath` or a descendant of it.
|
|
*
|
|
* Handles both Unix (/) and Windows (\) path separators, including mixed separators.
|
|
* This is important because agent cwd paths come from the agent's OS (could be Windows)
|
|
* while the CLI filter path comes from the user (could also be Windows or Unix).
|
|
*/
|
|
export function isSameOrDescendantPath(basePath: string, candidatePath: string): boolean {
|
|
// Normalize both paths: replace all backslashes with forward slashes, strip trailing separator
|
|
let normalizedBase = basePath.replace(/\\/g, "/").replace(/\/$/, "");
|
|
let normalizedCandidate = candidatePath.replace(/\\/g, "/").replace(/\/$/, "");
|
|
|
|
// Windows paths are case-insensitive — detect by drive letter prefix (e.g. "C:/")
|
|
if (/^[a-zA-Z]:\//.test(normalizedBase) || /^[a-zA-Z]:\//.test(normalizedCandidate)) {
|
|
normalizedBase = normalizedBase.toLowerCase();
|
|
normalizedCandidate = normalizedCandidate.toLowerCase();
|
|
}
|
|
|
|
return (
|
|
normalizedCandidate === normalizedBase ||
|
|
normalizedCandidate.startsWith(normalizedBase + "/")
|
|
);
|
|
}
|