Project Files
src / paths.ts
import fs from "fs";
import os from "os";
import path from "path";
export const FIND_IMAGE_HOME = process.env.FIND_IMAGE_HOME?.trim() || path.join(os.homedir(), ".find-image");
export const FIND_IMAGE_DATA_DIR = process.env.FIND_IMAGE_DATA_ROOT?.trim() || path.join(FIND_IMAGE_HOME, "data");
function configuredPath(name: string): string | undefined {
const value = process.env[name]?.trim();
return value || undefined;
}
const LMSTUDIO_ROOT = path.join(os.homedir(), ".lmstudio");
const LMSTUDIO_EXTENSIONS_ROOT = path.join(LMSTUDIO_ROOT, "extensions");
export const FIND_IMAGE_MODELS_ROOT = configuredPath("FIND_IMAGE_MODELS_ROOT")
?? path.join(LMSTUDIO_EXTENSIONS_ROOT, "models");
export const FIND_IMAGE_BACKENDS_ROOT = configuredPath("FIND_IMAGE_BACKENDS_ROOT")
?? path.join(LMSTUDIO_EXTENSIONS_ROOT, "backends");
export const FIND_IMAGE_WORKING_DIRECTORIES_ROOT = configuredPath("FIND_IMAGE_WORKING_DIRECTORIES_ROOT")
?? path.join(LMSTUDIO_ROOT, "working-directories");
export const FIND_IMAGE_USER_FILES_ROOT = configuredPath("FIND_IMAGE_USER_FILES_ROOT") ?? path.join(LMSTUDIO_ROOT, "user-files");
export function findImageDataPath(filename: string): string {
return path.join(FIND_IMAGE_DATA_DIR, filename);
}
export function legacyPluginDataPath(filename: string): string {
return path.join(
os.homedir(),
".lmstudio",
"extensions",
"plugins",
"ceveyne",
"find-image",
"data",
filename,
);
}
export function migrateLegacyFileIfMissing(currentPath: string, legacyPath: string): void {
if (fs.existsSync(currentPath) || !fs.existsSync(legacyPath)) return;
fs.mkdirSync(path.dirname(currentPath), { recursive: true });
fs.copyFileSync(legacyPath, currentPath);
console.log(`[find-image] Copied legacy data file to persistent storage: ${currentPath}`);
}
/**
* Sanitize a path pasted/typed into a plugin settings text field.
*
* Handles two forms of mangling that plain "string" config fields don't
* protect against, regardless of how the value was entered:
* - A leftover leading/trailing quote character (e.g. copied from a shell
* `echo "$PATH"` or a quoted snippet).
* - Shell-style backslash-escaped characters (e.g. `Portable\ SSD\ T9` from
* a path copied via Terminal drag&drop) — Node's fs calls take the string
* literally and do not undo shell escaping themselves.
*/
export function sanitizeConfigPath(raw: string): string {
if (!raw) return raw;
const unquoted = raw.trim().replace(/^['"]/, "").replace(/['"]$/, "");
return unquoted.replace(/\\(.)/g, "$1");
}