import { c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js";
import { a as wrapWebContent } from "./external-content-pX-Pk1Iu.js";
import "./string-coerce-runtime-6HjB7EiL.js";
import { i as buildSearchCacheKey, v as resolveSiteName } from "./web-search-provider-common-CGPXavPn.js";
import "./provider-web-search-DXfMKVlV.js";
//#region extensions/parallel/src/parallel-search-normalize.ts
const PARALLEL_MAX_SEARCH_COUNT = 40;
const PARALLEL_MAX_SEARCH_QUERY_CHARS = 200;
const PARALLEL_MAX_OBJECTIVE_CHARS = 5e3;
const PARALLEL_MAX_SEARCH_QUERIES = 5;
const PARALLEL_SESSION_ID_MAX_LENGTH = 1e3;
const PARALLEL_CLIENT_MODEL_MAX_LENGTH = 100;
function resolveParallelSearchCount(value) {
	return Math.max(1, Math.min(PARALLEL_MAX_SEARCH_COUNT, Math.floor(value)));
}
function normalizeParallelSessionId(value, maxLength) {
	const trimmed = normalizeOptionalString(value);
	return trimmed && trimmed.length <= maxLength ? trimmed : void 0;
}
function normalizeParallelObjective(value) {
	const trimmed = normalizeOptionalString(value);
	if (!trimmed) return;
	return trimmed.length <= PARALLEL_MAX_OBJECTIVE_CHARS ? trimmed : trimmed.slice(0, PARALLEL_MAX_OBJECTIVE_CHARS);
}
function normalizeParallelClientModel(value) {
	const trimmed = normalizeOptionalString(value);
	if (!trimmed) return;
	return trimmed.length <= PARALLEL_CLIENT_MODEL_MAX_LENGTH ? trimmed : trimmed.slice(0, PARALLEL_CLIENT_MODEL_MAX_LENGTH);
}
function normalizeParallelSearchQueries(value) {
	const candidates = Array.isArray(value) ? value : [];
	const seen = /* @__PURE__ */ new Set();
	const out = [];
	for (const entry of candidates) {
		if (typeof entry !== "string") continue;
		const trimmed = entry.trim();
		if (!trimmed) continue;
		const capped = trimmed.length <= PARALLEL_MAX_SEARCH_QUERY_CHARS ? trimmed : trimmed.slice(0, PARALLEL_MAX_SEARCH_QUERY_CHARS);
		if (seen.has(capped)) continue;
		seen.add(capped);
		out.push(capped);
		if (out.length === PARALLEL_MAX_SEARCH_QUERIES) break;
	}
	return out;
}
function invalidSearchQueriesPayload() {
	return {
		error: "invalid_search_queries",
		message: "search_queries must be a non-empty array of keyword strings (max 5, max 200 chars each). See https://docs.parallel.ai/search/best-practices.",
		docs: "https://docs.openclaw.ai/tools/parallel-search"
	};
}
function normalizeParallelResults(payload) {
	if (!payload || typeof payload !== "object") return [];
	const results = payload.results;
	if (!Array.isArray(results)) return [];
	return results.filter((entry) => Boolean(entry && typeof entry === "object" && !Array.isArray(entry)));
}
/** Maps a Parallel v1 response into wrapped `web_search` result entries. */
function mapParallelResults(response) {
	return normalizeParallelResults(response).map((entry) => {
		const title = typeof entry.title === "string" ? entry.title : "";
		const url = typeof entry.url === "string" ? entry.url : "";
		const published = typeof entry.publish_date === "string" && entry.publish_date ? entry.publish_date : void 0;
		const excerpts = Array.isArray(entry.excerpts) ? entry.excerpts.filter((e) => typeof e === "string").map((e) => wrapWebContent(e, "web_search")) : [];
		const description = excerpts.join("\n\n");
		return Object.assign({
			title: title ? wrapWebContent(title, "web_search") : "",
			url,
			description,
			siteName: resolveSiteName(url) || void 0
		}, published ? { published } : {}, excerpts.length > 0 ? { excerpts } : {});
	});
}
/**
* Drops a Parallel-generated `sessionId` before caching. Identical queries from
* unrelated tasks would otherwise share that id; caller-supplied session ids are
* part of the cache key, so a cache hit only ever returns the matching id.
*/
function stripParallelGeneratedSessionId(payload) {
	if (!("sessionId" in payload)) return payload;
	const { sessionId: _omitted, ...rest } = payload;
	return rest;
}
function buildParallelCacheKey(params) {
	return buildSearchCacheKey([
		"parallel",
		params.endpoint,
		params.objective,
		params.searchQueries.join("\0"),
		params.count,
		params.sessionId,
		params.clientModel
	]);
}
//#endregion
export { normalizeParallelClientModel as a, normalizeParallelSearchQueries as c, stripParallelGeneratedSessionId as d, mapParallelResults as i, normalizeParallelSessionId as l, buildParallelCacheKey as n, normalizeParallelObjective as o, invalidSearchQueriesPayload as r, normalizeParallelResults as s, PARALLEL_SESSION_ID_MAX_LENGTH as t, resolveParallelSearchCount as u };
