import fs from "node:fs"; import path from "node:path"; import { globSync } from "node:fs"; const baseDir = "/home/node/.openclaw/extensions/perplexity/dist"; if (fs.existsSync(baseDir)) { const files = fs.readdirSync(baseDir).filter(f => f.startsWith("perplexity-web-search-provider.runtime-") && f.endsWith(".js")); for (const filename of files) { const file = path.join(baseDir, filename); let code = fs.readFileSync(file, "utf8"); if (!code.includes("/* PATCHED_CHAT_COMPLETIONS */")) { const target = "const structured = runtime.transport === \"search_api\";"; const fastPath = `const structured = runtime.transport === "search_api"; /* PATCHED_CHAT_COMPLETIONS */ if (!structured) { const cacheKey = buildSearchCacheKey([ "perplexity", runtime.transport, runtime.baseUrl, runtime.model, query, freshness ]); const cacheTtlMs = resolveSearchCacheTtlMs(searchConfig); const cached = readCachedSearchPayload(cacheKey, cacheTtlMs); if (cached) return cached; const start = Date.now(); const timeoutSeconds = resolveSearchTimeoutSeconds(searchConfig); const result = await runPerplexitySearch({ query, apiKey: runtime.apiKey, baseUrl: runtime.baseUrl, model: runtime.model, timeoutSeconds, signal, freshness }); const payload = { query, provider: "perplexity", model: runtime.model, tookMs: Date.now() - start, externalContent: { untrusted: true, source: "web_search", provider: "perplexity", wrapped: true }, content: wrapWebContent(result.content, "web_search"), citations: result.citations }; writeCachedSearchPayload(cacheKey, payload); return payload; }`; if (code.includes(target)) { code = code.replace(target, fastPath); fs.writeFileSync(file, code, "utf8"); console.log("Patched perplexity runtime for chat completions:", file); } } } }