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)}...`; }