48 lines
1.7 KiB
TypeScript
48 lines
1.7 KiB
TypeScript
import { createSubsystemLogger } from "../logging/subsystem.js";
|
|
|
|
const log = createSubsystemLogger("memory");
|
|
|
|
export type QmdQueryResult = {
|
|
docid?: string;
|
|
score?: number;
|
|
file?: string;
|
|
snippet?: string;
|
|
body?: string;
|
|
};
|
|
|
|
export function parseQmdQueryJson(stdout: string, stderr: string): QmdQueryResult[] {
|
|
const trimmedStdout = stdout.trim();
|
|
const trimmedStderr = stderr.trim();
|
|
const stdoutIsMarker = trimmedStdout.length > 0 && isQmdNoResultsOutput(trimmedStdout);
|
|
const stderrIsMarker = trimmedStderr.length > 0 && isQmdNoResultsOutput(trimmedStderr);
|
|
if (stdoutIsMarker || (!trimmedStdout && stderrIsMarker)) {
|
|
return [];
|
|
}
|
|
if (!trimmedStdout) {
|
|
const context = trimmedStderr ? ` (stderr: ${summarizeQmdStderr(trimmedStderr)})` : "";
|
|
const message = `stdout empty${context}`;
|
|
log.warn(`qmd query returned invalid JSON: ${message}`);
|
|
throw new Error(`qmd query returned invalid JSON: ${message}`);
|
|
}
|
|
try {
|
|
const parsed = JSON.parse(trimmedStdout) as unknown;
|
|
if (!Array.isArray(parsed)) {
|
|
throw new Error("qmd query JSON response was not an array");
|
|
}
|
|
return parsed as QmdQueryResult[];
|
|
} catch (err) {
|
|
const message = err instanceof Error ? err.message : String(err);
|
|
log.warn(`qmd query returned invalid JSON: ${message}`);
|
|
throw new Error(`qmd query returned invalid JSON: ${message}`, { cause: err });
|
|
}
|
|
}
|
|
|
|
function isQmdNoResultsOutput(raw: string): boolean {
|
|
const normalized = raw.trim().toLowerCase().replace(/\s+/g, " ");
|
|
return normalized === "no results found" || normalized === "no results found.";
|
|
}
|
|
|
|
function summarizeQmdStderr(raw: string): string {
|
|
return raw.length <= 120 ? raw : `${raw.slice(0, 117)}...`;
|
|
}
|