@xrkseek/harness-cli 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/commands/restart.d.ts +3 -0
- package/dist/commands/restart.d.ts.map +1 -0
- package/dist/commands/restart.js +32 -0
- package/dist/commands/restart.js.map +1 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +19 -11
- package/dist/commands/serve.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts +19 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +52 -0
- package/dist/log.js.map +1 -0
- package/dist/parse-args.d.ts +5 -1
- package/dist/parse-args.d.ts.map +1 -1
- package/dist/parse-args.js +33 -1
- package/dist/parse-args.js.map +1 -1
- package/dist/port.d.ts +9 -0
- package/dist/port.d.ts.map +1 -0
- package/dist/port.js +86 -0
- package/dist/port.js.map +1 -0
- package/node_modules/@xrkseek/core-agent/dist/index.d.ts +2 -0
- package/node_modules/@xrkseek/core-agent/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-agent/dist/index.js +3 -0
- package/node_modules/@xrkseek/core-agent/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/index.d.ts +5 -0
- package/node_modules/@xrkseek/core-agent-loop/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/index.js +3 -0
- package/node_modules/@xrkseek/core-agent-loop/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/settle-batch.d.ts +5 -0
- package/node_modules/@xrkseek/core-agent-loop/dist/settle-batch.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/settle-batch.js +22 -2
- package/node_modules/@xrkseek/core-agent-loop/dist/settle-batch.js.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/compaction.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/compaction.js.map +1 -1
- package/node_modules/@xrkseek/exec-shell/dist/index.d.ts +4 -1
- package/node_modules/@xrkseek/exec-shell/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-shell/dist/index.js +18 -2
- package/node_modules/@xrkseek/exec-shell/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/index.d.ts +5 -2
- package/node_modules/@xrkseek/exec-web/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/index.js +5 -2
- package/node_modules/@xrkseek/exec-web/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/search-duckduckgo.d.ts +14 -0
- package/node_modules/@xrkseek/exec-web/dist/search-duckduckgo.d.ts.map +1 -0
- package/node_modules/@xrkseek/exec-web/dist/search-duckduckgo.js +139 -0
- package/node_modules/@xrkseek/exec-web/dist/search-duckduckgo.js.map +1 -0
- package/node_modules/@xrkseek/exec-web/dist/search-mcp-client.d.ts +21 -0
- package/node_modules/@xrkseek/exec-web/dist/search-mcp-client.d.ts.map +1 -0
- package/node_modules/@xrkseek/exec-web/dist/search-mcp-client.js +175 -0
- package/node_modules/@xrkseek/exec-web/dist/search-mcp-client.js.map +1 -0
- package/node_modules/@xrkseek/exec-web/dist/search-parallel-free.d.ts +12 -0
- package/node_modules/@xrkseek/exec-web/dist/search-parallel-free.d.ts.map +1 -0
- package/node_modules/@xrkseek/exec-web/dist/search-parallel-free.js +105 -0
- package/node_modules/@xrkseek/exec-web/dist/search-parallel-free.js.map +1 -0
- package/node_modules/@xrkseek/exec-web/dist/search-providers.d.ts +9 -1
- package/node_modules/@xrkseek/exec-web/dist/search-providers.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/search-providers.js +100 -12
- package/node_modules/@xrkseek/exec-web/dist/search-providers.js.map +1 -1
- package/node_modules/@xrkseek/mcp/dist/client.d.ts.map +1 -1
- package/node_modules/@xrkseek/mcp/dist/client.js.map +1 -1
- package/node_modules/@xrkseek/mcp/dist/project-content.js +1 -1
- package/node_modules/@xrkseek/mcp/dist/project-content.js.map +1 -1
- package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts +7 -0
- package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts.map +1 -1
- package/node_modules/@xrkseek/preset-harness/dist/preset.js +11 -1
- package/node_modules/@xrkseek/preset-harness/dist/preset.js.map +1 -1
- package/node_modules/@xrkseek/preset-harness/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@xrkseek/preset-minimal/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@xrkseek/preset-server/dist/preset.d.ts.map +1 -1
- package/node_modules/@xrkseek/preset-server/dist/preset.js +3 -1
- package/node_modules/@xrkseek/preset-server/dist/preset.js.map +1 -1
- package/node_modules/@xrkseek/preset-server/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@xrkseek/server-face/dist/dispatch.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/dispatch.js +4 -2
- package/node_modules/@xrkseek/server-face/dist/dispatch.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/session-added.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/session-added.js +3 -2
- package/node_modules/@xrkseek/server-face/dist/handlers/session-added.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/session.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/session.js +5 -3
- package/node_modules/@xrkseek/server-face/dist/handlers/session.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/index.d.ts +1 -0
- package/node_modules/@xrkseek/server-face/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/index.js +1 -0
- package/node_modules/@xrkseek/server-face/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-cwd.d.ts +3 -0
- package/node_modules/@xrkseek/server-face/dist/session-cwd.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-cwd.js +19 -0
- package/node_modules/@xrkseek/server-face/dist/session-cwd.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/settings-schemas.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-schemas.js +0 -9
- package/node_modules/@xrkseek/server-face/dist/settings-schemas.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-face.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-face.js +26 -9
- package/node_modules/@xrkseek/server-face/dist/workspace-face.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-registry.d.ts +6 -0
- package/node_modules/@xrkseek/server-face/dist/workspace-registry.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-registry.js +39 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-registry.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-store.d.ts +4 -0
- package/node_modules/@xrkseek/server-face/dist/workspace-store.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-store.js +43 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-store.js.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/index.d.ts +9 -1
- package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/index.js +92 -16
- package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/log.d.ts +14 -0
- package/node_modules/@xrkseek/server-host/dist/log.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-host/dist/log.js +6 -0
- package/node_modules/@xrkseek/server-host/dist/log.js.map +1 -0
- package/node_modules/@xrkseek/server-host/dist/standing-tools.js +2 -2
- package/node_modules/@xrkseek/server-host/dist/standing-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/index.d.ts +9 -0
- package/node_modules/@xrkseek/server-http/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/index.js +9 -0
- package/node_modules/@xrkseek/server-http/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/product-web/boot.json +1 -1
- package/product-web/plugins/@xrkseek/client-locale/client.js +1 -1
- package/product-web/plugins/@xrkseek/client-ui-agent-preset/client.js +36 -36
- package/product-web/plugins/@xrkseek/client-ui-commands/client.js +7 -7
- package/product-web/plugins/@xrkseek/client-ui-conversation/client.js +158 -158
- package/product-web/plugins/@xrkseek/client-ui-deliverables/client.js +4 -4
- package/product-web/plugins/@xrkseek/client-ui-directory-picker-browse/client.js +28 -28
- package/product-web/plugins/@xrkseek/client-ui-goal/client.js +6 -6
- package/product-web/plugins/@xrkseek/client-ui-input-trigger/client.js +5 -5
- package/product-web/plugins/@xrkseek/client-ui-jobs/client.js +9 -9
- package/product-web/plugins/@xrkseek/client-ui-layout/client.js +4 -4
- package/product-web/plugins/@xrkseek/client-ui-message-feedback/client.js +2 -2
- package/product-web/plugins/@xrkseek/client-ui-model-selection/client.js +17 -17
- package/product-web/plugins/@xrkseek/client-ui-permission-presets/client.js +4 -4
- package/product-web/plugins/@xrkseek/client-ui-plan/client.js +2 -2
- package/product-web/plugins/@xrkseek/client-ui-settings-general/client.js +15 -15
- package/product-web/plugins/@xrkseek/client-ui-settings-models/client.js +52 -52
- package/product-web/plugins/@xrkseek/client-ui-settings-plugin-inventory/client.js +10 -10
- package/product-web/plugins/@xrkseek/client-ui-settings-plugins/client.js +107 -528
- package/product-web/plugins/@xrkseek/client-ui-sidebar/client.js +14 -14
- package/product-web/plugins/@xrkseek/client-ui-skill/client.js +12 -12
- package/product-web/plugins/@xrkseek/client-ui-subagent/client.js +16 -16
- package/product-web/plugins/@xrkseek/client-ui-theme/client.js +3 -3
- package/product-web/plugins/@xrkseek/client-ui-tool/client.js +39 -39
- package/product-web/plugins/@xrkseek/client-ui-trajectory/client.js +132 -132
- package/product-web/plugins/@xrkseek/client-ui-user-questions/client.js +28 -28
- package/product-web/plugins/@xrkseek/client-ui-workflow-run/client.js +15 -15
- package/product-web/plugins/@xrkseek/client-ui-workspace/client.js +52 -52
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyless DuckDuckGo HTML search (ported from XRK-AGT web-search-duckduckgo).
|
|
3
|
+
* No API key; scrapes https://html.duckduckgo.com/html.
|
|
4
|
+
*/
|
|
5
|
+
import { WebError } from "./types.js";
|
|
6
|
+
const SEARCH_TIMEOUT_MS = 30_000;
|
|
7
|
+
const DDG_HTML_ENDPOINT = "https://html.duckduckgo.com/html";
|
|
8
|
+
const DDG_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36";
|
|
9
|
+
function capSources(sources, maxResults) {
|
|
10
|
+
if (sources.length <= maxResults) {
|
|
11
|
+
return { sources, truncated: false };
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
sources: sources.slice(0, maxResults),
|
|
15
|
+
truncated: true,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function decodeHtmlEntities(text) {
|
|
19
|
+
return text
|
|
20
|
+
.replace(/&/g, "&")
|
|
21
|
+
.replace(/</g, "<")
|
|
22
|
+
.replace(/>/g, ">")
|
|
23
|
+
.replace(/"/g, '"')
|
|
24
|
+
.replace(/'/g, "'")
|
|
25
|
+
.replace(/'/g, "'")
|
|
26
|
+
.replace(/'/g, "'")
|
|
27
|
+
.replace(///g, "/")
|
|
28
|
+
.replace(/ /g, " ")
|
|
29
|
+
.replace(/–/g, "-")
|
|
30
|
+
.replace(/—/g, "--")
|
|
31
|
+
.replace(/…/g, "...")
|
|
32
|
+
.replace(/&#(\d+);/g, (_, code) => String.fromCodePoint(Number(code)))
|
|
33
|
+
.replace(/&#x([0-9a-f]+);/gi, (_, code) => String.fromCodePoint(Number.parseInt(code, 16)));
|
|
34
|
+
}
|
|
35
|
+
function stripHtml(html) {
|
|
36
|
+
return html.replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
|
|
37
|
+
}
|
|
38
|
+
function decodeDuckDuckGoUrl(rawUrl) {
|
|
39
|
+
try {
|
|
40
|
+
const normalized = rawUrl.startsWith("//") ? `https:${rawUrl}` : rawUrl;
|
|
41
|
+
const parsed = new URL(normalized);
|
|
42
|
+
const uddg = parsed.searchParams.get("uddg");
|
|
43
|
+
if (uddg)
|
|
44
|
+
return uddg;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
/* keep original */
|
|
48
|
+
}
|
|
49
|
+
return rawUrl;
|
|
50
|
+
}
|
|
51
|
+
function readHrefAttribute(tagAttributes) {
|
|
52
|
+
return /\bhref="([^"]*)"/i.exec(tagAttributes)?.[1] ?? "";
|
|
53
|
+
}
|
|
54
|
+
function isBotChallenge(html) {
|
|
55
|
+
if (/class="[^"]*\bresult__a\b[^"]*"/i.test(html))
|
|
56
|
+
return false;
|
|
57
|
+
return /g-recaptcha|are you a human|id="challenge-form"|name="challenge"/i.test(html);
|
|
58
|
+
}
|
|
59
|
+
/** Parse DuckDuckGo HTML result page into sources (exported for tests). */
|
|
60
|
+
export function parseDuckDuckGoHtml(html) {
|
|
61
|
+
const results = [];
|
|
62
|
+
const resultRegex = /<a\b(?=[^>]*\bclass="[^"]*\bresult__a\b[^"]*")([^>]*)>([\s\S]*?)<\/a>/gi;
|
|
63
|
+
const nextResultRegex = /<a\b(?=[^>]*\bclass="[^"]*\bresult__a\b[^"]*")[^>]*>/i;
|
|
64
|
+
const snippetRegex = /<a\b(?=[^>]*\bclass="[^"]*\bresult__snippet\b[^"]*")[^>]*>([\s\S]*?)<\/a>/i;
|
|
65
|
+
for (const match of html.matchAll(resultRegex)) {
|
|
66
|
+
const rawAttributes = match[1] ?? "";
|
|
67
|
+
const rawTitle = match[2] ?? "";
|
|
68
|
+
const rawUrl = readHrefAttribute(rawAttributes);
|
|
69
|
+
const matchEnd = (match.index ?? 0) + match[0].length;
|
|
70
|
+
const trailingHtml = html.slice(matchEnd);
|
|
71
|
+
const nextResultIndex = trailingHtml.search(nextResultRegex);
|
|
72
|
+
const scopedTrailingHtml = nextResultIndex >= 0
|
|
73
|
+
? trailingHtml.slice(0, nextResultIndex)
|
|
74
|
+
: trailingHtml;
|
|
75
|
+
const rawSnippet = snippetRegex.exec(scopedTrailingHtml)?.[1] ?? "";
|
|
76
|
+
const title = stripHtml(decodeHtmlEntities(rawTitle));
|
|
77
|
+
const url = decodeDuckDuckGoUrl(decodeHtmlEntities(rawUrl));
|
|
78
|
+
const snippet = stripHtml(decodeHtmlEntities(rawSnippet));
|
|
79
|
+
if (title && url) {
|
|
80
|
+
results.push({
|
|
81
|
+
url,
|
|
82
|
+
title,
|
|
83
|
+
...(snippet ? { snippet } : {}),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return results;
|
|
88
|
+
}
|
|
89
|
+
function translateAbort(err, outer, timed) {
|
|
90
|
+
if (timed.aborted && !outer?.aborted) {
|
|
91
|
+
throw new WebError("web search timed out", "WEB_FETCH_TIMEOUT");
|
|
92
|
+
}
|
|
93
|
+
if (outer?.aborted || timed.aborted) {
|
|
94
|
+
throw new WebError("web search aborted", "WEB_ABORTED");
|
|
95
|
+
}
|
|
96
|
+
throw new WebError(err instanceof Error ? err.message : String(err), "WEB_PROVIDER_ERROR");
|
|
97
|
+
}
|
|
98
|
+
export function createDuckDuckGoSearch(options) {
|
|
99
|
+
const fetchFn = options.fetch ?? globalThis.fetch;
|
|
100
|
+
const timeoutMs = options.timeoutMs ?? SEARCH_TIMEOUT_MS;
|
|
101
|
+
const region = options.region?.trim() ?? "";
|
|
102
|
+
return {
|
|
103
|
+
async search(request, signal) {
|
|
104
|
+
if (signal?.aborted) {
|
|
105
|
+
throw new WebError("web search aborted", "WEB_ABORTED");
|
|
106
|
+
}
|
|
107
|
+
const timed = AbortSignal.timeout(timeoutMs);
|
|
108
|
+
const combined = signal ? AbortSignal.any([signal, timed]) : timed;
|
|
109
|
+
const url = new URL(DDG_HTML_ENDPOINT);
|
|
110
|
+
url.searchParams.set("q", request.query);
|
|
111
|
+
if (region)
|
|
112
|
+
url.searchParams.set("kl", region);
|
|
113
|
+
url.searchParams.set("kp", "-1"); // moderate safe search
|
|
114
|
+
let response;
|
|
115
|
+
try {
|
|
116
|
+
response = await fetchFn(url.toString(), {
|
|
117
|
+
method: "GET",
|
|
118
|
+
signal: combined,
|
|
119
|
+
headers: {
|
|
120
|
+
"User-Agent": DDG_USER_AGENT,
|
|
121
|
+
Accept: "text/html",
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
translateAbort(err, signal, timed);
|
|
127
|
+
}
|
|
128
|
+
const html = await response.text();
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
throw new WebError(`DuckDuckGo answered HTTP ${response.status}`, "WEB_PROVIDER_ERROR");
|
|
131
|
+
}
|
|
132
|
+
if (isBotChallenge(html)) {
|
|
133
|
+
throw new WebError("DuckDuckGo returned a bot challenge; try again later or set XRK_TAVILY_API_KEY / XRK_BRAVE_SEARCH_API_KEY", "WEB_PROVIDER_ERROR");
|
|
134
|
+
}
|
|
135
|
+
return capSources(parseDuckDuckGoHtml(html), request.maxResults);
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=search-duckduckgo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-duckduckgo.js","sourceRoot":"","sources":["../src/search-duckduckgo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal streamable-HTTP MCP client for Parallel Search free endpoint.
|
|
3
|
+
* Ported (slimmed) from XRK-AGT web-search-mcp-client — no SDK dependency.
|
|
4
|
+
*/
|
|
5
|
+
import type { FetchFn } from "./types.js";
|
|
6
|
+
export declare function iterMcpMessages(text: string): Record<string, unknown>[];
|
|
7
|
+
export declare function selectMcpEnvelope(text: string, requestId: string): Record<string, unknown>;
|
|
8
|
+
export declare function extractMcpToolPayload(envelope: Record<string, unknown>): Record<string, unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* MCP initialize → notifications/initialized → tools/call.
|
|
11
|
+
*/
|
|
12
|
+
export declare function callMcpTool(params: {
|
|
13
|
+
readonly url: string;
|
|
14
|
+
readonly toolName: string;
|
|
15
|
+
readonly toolArgs: Record<string, unknown>;
|
|
16
|
+
readonly fetch?: FetchFn;
|
|
17
|
+
readonly signal?: AbortSignal;
|
|
18
|
+
readonly clientName?: string;
|
|
19
|
+
readonly clientVersion?: string;
|
|
20
|
+
}): Promise<Record<string, unknown>>;
|
|
21
|
+
//# sourceMappingURL=search-mcp-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-mcp-client.d.ts","sourceRoot":"","sources":["../src/search-mcp-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAS1C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CA4CvE;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzB;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmCzB;AAuCD;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA4DnC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal streamable-HTTP MCP client for Parallel Search free endpoint.
|
|
3
|
+
* Ported (slimmed) from XRK-AGT web-search-mcp-client — no SDK dependency.
|
|
4
|
+
*/
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { WebError } from "./types.js";
|
|
7
|
+
const MCP_PROTOCOL_VERSION = "2025-06-18";
|
|
8
|
+
function isRecord(value) {
|
|
9
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
export function iterMcpMessages(text) {
|
|
12
|
+
const out = [];
|
|
13
|
+
const emit = (payload) => {
|
|
14
|
+
if (Array.isArray(payload)) {
|
|
15
|
+
for (const entry of payload) {
|
|
16
|
+
if (isRecord(entry))
|
|
17
|
+
out.push(entry);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
else if (isRecord(payload)) {
|
|
21
|
+
out.push(payload);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const body = text.trim();
|
|
25
|
+
if (!body)
|
|
26
|
+
return out;
|
|
27
|
+
if (body.startsWith("{") || body.startsWith("[")) {
|
|
28
|
+
try {
|
|
29
|
+
emit(JSON.parse(body));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
/* non-json */
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
let dataLines = [];
|
|
37
|
+
const flush = () => {
|
|
38
|
+
if (dataLines.length === 0)
|
|
39
|
+
return;
|
|
40
|
+
try {
|
|
41
|
+
emit(JSON.parse(dataLines.join("\n")));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
/* skip */
|
|
45
|
+
}
|
|
46
|
+
dataLines = [];
|
|
47
|
+
};
|
|
48
|
+
for (const raw of body.split("\n")) {
|
|
49
|
+
const line = raw.replace(/\r$/, "");
|
|
50
|
+
if (line.startsWith("data:")) {
|
|
51
|
+
dataLines.push(line.slice("data:".length).replace(/^ /, ""));
|
|
52
|
+
}
|
|
53
|
+
else if (line.trim() === "") {
|
|
54
|
+
flush();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
flush();
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
export function selectMcpEnvelope(text, requestId) {
|
|
61
|
+
let fallback = {};
|
|
62
|
+
for (const msg of iterMcpMessages(text)) {
|
|
63
|
+
if (!("result" in msg || "error" in msg))
|
|
64
|
+
continue;
|
|
65
|
+
if (msg.id === requestId)
|
|
66
|
+
return msg;
|
|
67
|
+
fallback = msg;
|
|
68
|
+
}
|
|
69
|
+
return fallback;
|
|
70
|
+
}
|
|
71
|
+
export function extractMcpToolPayload(envelope) {
|
|
72
|
+
if ("error" in envelope) {
|
|
73
|
+
throw new WebError(`MCP error: ${JSON.stringify(envelope.error).slice(0, 500)}`, "WEB_PROVIDER_ERROR");
|
|
74
|
+
}
|
|
75
|
+
const result = isRecord(envelope.result) ? envelope.result : {};
|
|
76
|
+
if (result.isError) {
|
|
77
|
+
throw new WebError(`MCP tool error: ${JSON.stringify(result).slice(0, 500)}`, "WEB_PROVIDER_ERROR");
|
|
78
|
+
}
|
|
79
|
+
if (isRecord(result.structuredContent))
|
|
80
|
+
return result.structuredContent;
|
|
81
|
+
const content = Array.isArray(result.content) ? result.content : [];
|
|
82
|
+
for (const block of content) {
|
|
83
|
+
if (isRecord(block) &&
|
|
84
|
+
block.type === "text" &&
|
|
85
|
+
typeof block.text === "string" &&
|
|
86
|
+
block.text) {
|
|
87
|
+
try {
|
|
88
|
+
const parsed = JSON.parse(block.text);
|
|
89
|
+
if (isRecord(parsed))
|
|
90
|
+
return parsed;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
/* next */
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
throw new WebError(`MCP returned no parseable content: ${JSON.stringify(result).slice(0, 500)}`, "WEB_PROVIDER_ERROR");
|
|
98
|
+
}
|
|
99
|
+
async function postMcp(fetchFn, url, params) {
|
|
100
|
+
const headers = {
|
|
101
|
+
"Content-Type": "application/json",
|
|
102
|
+
Accept: "application/json, text/event-stream",
|
|
103
|
+
};
|
|
104
|
+
if (params.sessionId)
|
|
105
|
+
headers["Mcp-Session-Id"] = params.sessionId;
|
|
106
|
+
if (params.protocolVersion) {
|
|
107
|
+
headers["MCP-Protocol-Version"] = params.protocolVersion;
|
|
108
|
+
}
|
|
109
|
+
const response = await fetchFn(url, {
|
|
110
|
+
method: "POST",
|
|
111
|
+
headers,
|
|
112
|
+
body: JSON.stringify(params.body),
|
|
113
|
+
...(params.signal ? { signal: params.signal } : {}),
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
ok: response.ok,
|
|
117
|
+
status: response.status,
|
|
118
|
+
text: await response.text(),
|
|
119
|
+
sessionIdHeader: response.headers.get("mcp-session-id"),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* MCP initialize → notifications/initialized → tools/call.
|
|
124
|
+
*/
|
|
125
|
+
export async function callMcpTool(params) {
|
|
126
|
+
const fetchFn = params.fetch ?? globalThis.fetch;
|
|
127
|
+
const clientName = params.clientName ?? "xrk-harness";
|
|
128
|
+
const clientVersion = params.clientVersion ?? "0.0.0";
|
|
129
|
+
const initId = randomUUID();
|
|
130
|
+
const init = await postMcp(fetchFn, params.url, {
|
|
131
|
+
body: {
|
|
132
|
+
jsonrpc: "2.0",
|
|
133
|
+
id: initId,
|
|
134
|
+
method: "initialize",
|
|
135
|
+
params: {
|
|
136
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
137
|
+
capabilities: {},
|
|
138
|
+
clientInfo: { name: clientName, version: clientVersion },
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
...(params.signal ? { signal: params.signal } : {}),
|
|
142
|
+
});
|
|
143
|
+
if (!init.ok) {
|
|
144
|
+
throw new WebError(`MCP initialize failed (${init.status}): ${init.text.slice(0, 300)}`, "WEB_PROVIDER_ERROR");
|
|
145
|
+
}
|
|
146
|
+
const sessionId = init.sessionIdHeader ?? undefined;
|
|
147
|
+
const initEnvelope = selectMcpEnvelope(init.text, initId);
|
|
148
|
+
const negotiatedVersion = (isRecord(initEnvelope.result) &&
|
|
149
|
+
typeof initEnvelope.result.protocolVersion === "string"
|
|
150
|
+
? initEnvelope.result.protocolVersion
|
|
151
|
+
: undefined) ?? MCP_PROTOCOL_VERSION;
|
|
152
|
+
await postMcp(fetchFn, params.url, {
|
|
153
|
+
body: { jsonrpc: "2.0", method: "notifications/initialized" },
|
|
154
|
+
...(sessionId ? { sessionId } : {}),
|
|
155
|
+
protocolVersion: negotiatedVersion,
|
|
156
|
+
...(params.signal ? { signal: params.signal } : {}),
|
|
157
|
+
});
|
|
158
|
+
const callId = randomUUID();
|
|
159
|
+
const call = await postMcp(fetchFn, params.url, {
|
|
160
|
+
body: {
|
|
161
|
+
jsonrpc: "2.0",
|
|
162
|
+
id: callId,
|
|
163
|
+
method: "tools/call",
|
|
164
|
+
params: { name: params.toolName, arguments: params.toolArgs },
|
|
165
|
+
},
|
|
166
|
+
...(sessionId ? { sessionId } : {}),
|
|
167
|
+
protocolVersion: negotiatedVersion,
|
|
168
|
+
...(params.signal ? { signal: params.signal } : {}),
|
|
169
|
+
});
|
|
170
|
+
if (!call.ok) {
|
|
171
|
+
throw new WebError(`MCP tools/call failed (${call.status}): ${call.text.slice(0, 300)}`, "WEB_PROVIDER_ERROR");
|
|
172
|
+
}
|
|
173
|
+
return extractMcpToolPayload(selectMcpEnvelope(call.text, callId));
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=search-mcp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-mcp-client.js","sourceRoot":"","sources":["../src/search-mcp-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAE1C,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,GAAG,GAA8B,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,OAAgB,EAAE,EAAE;QAChC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,QAAQ,CAAC,KAAK,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC;IACtB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,SAAS,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACnC,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAY,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;QACD,SAAS,GAAG,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9B,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,SAAiB;IAEjB,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC;YAAE,SAAS;QACnD,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QACrC,QAAQ,GAAG,GAAG,CAAC;IACjB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAAiC;IAEjC,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CAChB,cAAc,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAC5D,oBAAoB,CACrB,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,QAAQ,CAChB,mBAAmB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EACzD,oBAAoB,CACrB,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC;IACxE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IACE,QAAQ,CAAC,KAAK,CAAC;YACf,KAAK,CAAC,IAAI,KAAK,MAAM;YACrB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAC9B,KAAK,CAAC,IAAI,EACV,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;gBACjD,IAAI,QAAQ,CAAC,MAAM,CAAC;oBAAE,OAAO,MAAM,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,QAAQ,CAChB,sCAAsC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAC5E,oBAAoB,CACrB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,OAAgB,EAChB,GAAW,EACX,MAKC;IAOD,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,MAAM,EAAE,qCAAqC;KAC9C,CAAC;IACF,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;IACnE,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,OAAO,CAAC,sBAAsB,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC;IAC3D,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;QAClC,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC,CAAC;IACH,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE;QAC3B,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;KACxD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAQjC;IACC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,aAAa,CAAC;IACtD,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,OAAO,CAAC;IAEtD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE;QAC9C,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,MAAM;YACV,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE;gBACN,eAAe,EAAE,oBAAoB;gBACrC,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;aACzD;SACF;QACD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAChB,0BAA0B,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EACpE,oBAAoB,CACrB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC;IACpD,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,iBAAiB,GACrB,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;QAC9B,OAAO,YAAY,CAAC,MAAM,CAAC,eAAe,KAAK,QAAQ;QACrD,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe;QACrC,CAAC,CAAC,SAAS,CAAC,IAAI,oBAAoB,CAAC;IAEzC,MAAM,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE;QACjC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE;QAC7D,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,eAAe,EAAE,iBAAiB;QAClC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE;QAC9C,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,MAAM;YACV,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE;SAC9D;QACD,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,eAAe,EAAE,iBAAiB;QAClC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAChB,0BAA0B,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EACpE,oBAAoB,CACrB,CAAC;IACJ,CAAC;IACD,OAAO,qBAAqB,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel Search free MCP (keyless) — aligned with XRK-AGT parallel-free.
|
|
3
|
+
* Default MCP URL: https://search.parallel.ai/mcp
|
|
4
|
+
*/
|
|
5
|
+
import type { FetchFn, WebSearch } from "./types.js";
|
|
6
|
+
export declare const PARALLEL_MCP_SEARCH_URL = "https://search.parallel.ai/mcp";
|
|
7
|
+
export declare function createParallelFreeSearch(options: {
|
|
8
|
+
readonly mcpUrl?: string;
|
|
9
|
+
readonly fetch?: FetchFn;
|
|
10
|
+
readonly timeoutMs?: number;
|
|
11
|
+
}): WebSearch;
|
|
12
|
+
//# sourceMappingURL=search-parallel-free.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-parallel-free.d.ts","sourceRoot":"","sources":["../src/search-parallel-free.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAIV,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,uBAAuB,mCAAmC,CAAC;AAuExE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,SAAS,CA0CZ"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel Search free MCP (keyless) — aligned with XRK-AGT parallel-free.
|
|
3
|
+
* Default MCP URL: https://search.parallel.ai/mcp
|
|
4
|
+
*/
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { callMcpTool } from "./search-mcp-client.js";
|
|
7
|
+
import { WebError } from "./types.js";
|
|
8
|
+
export const PARALLEL_MCP_SEARCH_URL = "https://search.parallel.ai/mcp";
|
|
9
|
+
const SEARCH_TIMEOUT_MS = 30_000;
|
|
10
|
+
function asRecord(value) {
|
|
11
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
function asString(value) {
|
|
17
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
18
|
+
}
|
|
19
|
+
function mapParallelSources(payload) {
|
|
20
|
+
const rows = Array.isArray(payload.results) ? payload.results : [];
|
|
21
|
+
const sources = [];
|
|
22
|
+
for (const row of rows) {
|
|
23
|
+
const entry = asRecord(row);
|
|
24
|
+
if (!entry)
|
|
25
|
+
continue;
|
|
26
|
+
const url = asString(entry.url);
|
|
27
|
+
if (!url)
|
|
28
|
+
continue;
|
|
29
|
+
const title = asString(entry.title);
|
|
30
|
+
const excerpts = Array.isArray(entry.excerpts)
|
|
31
|
+
? entry.excerpts.filter((e) => typeof e === "string")
|
|
32
|
+
: [];
|
|
33
|
+
const snippet = excerpts.join("\n\n") ||
|
|
34
|
+
asString(entry.snippet) ||
|
|
35
|
+
asString(entry.description);
|
|
36
|
+
const publishedAt = asString(entry.publish_date) ?? asString(entry.publishedAt);
|
|
37
|
+
sources.push({
|
|
38
|
+
url,
|
|
39
|
+
...(title ? { title } : {}),
|
|
40
|
+
...(snippet ? { snippet } : {}),
|
|
41
|
+
...(publishedAt ? { publishedAt } : {}),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return sources;
|
|
45
|
+
}
|
|
46
|
+
function capSources(sources, maxResults) {
|
|
47
|
+
if (sources.length <= maxResults) {
|
|
48
|
+
return { sources, truncated: false };
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
sources: sources.slice(0, maxResults),
|
|
52
|
+
truncated: true,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function translateAbort(err, outer, timed) {
|
|
56
|
+
if (timed.aborted && !outer?.aborted) {
|
|
57
|
+
throw new WebError("web search timed out", "WEB_FETCH_TIMEOUT");
|
|
58
|
+
}
|
|
59
|
+
if (outer?.aborted || timed.aborted) {
|
|
60
|
+
throw new WebError("web search aborted", "WEB_ABORTED");
|
|
61
|
+
}
|
|
62
|
+
throw new WebError(err instanceof Error ? err.message : String(err), "WEB_PROVIDER_ERROR");
|
|
63
|
+
}
|
|
64
|
+
export function createParallelFreeSearch(options) {
|
|
65
|
+
const mcpUrl = options.mcpUrl?.trim() || PARALLEL_MCP_SEARCH_URL;
|
|
66
|
+
const timeoutMs = options.timeoutMs ?? SEARCH_TIMEOUT_MS;
|
|
67
|
+
return {
|
|
68
|
+
async search(request, signal) {
|
|
69
|
+
if (signal?.aborted) {
|
|
70
|
+
throw new WebError("web search aborted", "WEB_ABORTED");
|
|
71
|
+
}
|
|
72
|
+
const timed = AbortSignal.timeout(timeoutMs);
|
|
73
|
+
const combined = signal ? AbortSignal.any([signal, timed]) : timed;
|
|
74
|
+
const query = request.query.trim();
|
|
75
|
+
if (!query) {
|
|
76
|
+
throw new WebError("query is required", "WEB_PROVIDER_ERROR");
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const payload = await callMcpTool({
|
|
80
|
+
url: mcpUrl,
|
|
81
|
+
toolName: "web_search",
|
|
82
|
+
toolArgs: {
|
|
83
|
+
objective: query,
|
|
84
|
+
search_queries: [query],
|
|
85
|
+
session_id: randomUUID(),
|
|
86
|
+
},
|
|
87
|
+
...(options.fetch ? { fetch: options.fetch } : {}),
|
|
88
|
+
signal: combined,
|
|
89
|
+
clientName: "xrk-harness-parallel-free",
|
|
90
|
+
});
|
|
91
|
+
return capSources(mapParallelSources(payload), request.maxResults);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
if (err instanceof WebError) {
|
|
95
|
+
if (timed.aborted && !signal?.aborted) {
|
|
96
|
+
throw new WebError("web search timed out", "WEB_FETCH_TIMEOUT");
|
|
97
|
+
}
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
translateAbort(err, signal, timed);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=search-parallel-free.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-parallel-free.js","sourceRoot":"","sources":["../src/search-parallel-free.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { FetchFn, WebSearch, WebSearchResult } from "./types.js";
|
|
2
2
|
export declare const SEARCH_TIMEOUT_MS = 30000;
|
|
3
|
-
|
|
3
|
+
/** AGT-aligned keyless cascade order. */
|
|
4
|
+
export declare const KEYLESS_FALLBACKS: readonly ["parallel-free", "duckduckgo"];
|
|
5
|
+
export type SearchProviderId = "tavily" | "brave" | "parallel-free" | "duckduckgo";
|
|
4
6
|
export declare function capSearchResult(result: WebSearchResult, maxResults: number): WebSearchResult;
|
|
5
7
|
export declare function createTavilySearch(options: {
|
|
6
8
|
readonly apiKey: string;
|
|
@@ -13,7 +15,13 @@ export declare function createBraveSearch(options: {
|
|
|
13
15
|
readonly timeoutMs?: number;
|
|
14
16
|
}): WebSearch;
|
|
15
17
|
export declare function searchUnavailableMessage(env: NodeJS.ProcessEnv): string;
|
|
18
|
+
/**
|
|
19
|
+
* Prefer keyed providers when present; otherwise parallel-free (AGT).
|
|
20
|
+
* Unknown `XRK_WEB_SEARCH_PROVIDER` → `undefined` (caller shows unavailable).
|
|
21
|
+
*/
|
|
16
22
|
export declare function resolveSearchProviderId(env: NodeJS.ProcessEnv): SearchProviderId | undefined;
|
|
23
|
+
/** Try primary; on throw or empty sources, walk remaining keyless providers (AGT). */
|
|
24
|
+
export declare function createCascadingSearch(primary: WebSearch, fallbacks: readonly WebSearch[]): WebSearch;
|
|
17
25
|
export declare function createSearchFromEnv(options: {
|
|
18
26
|
readonly env?: NodeJS.ProcessEnv;
|
|
19
27
|
readonly fetch?: FetchFn;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-providers.d.ts","sourceRoot":"","sources":["../src/search-providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAET,eAAe,EAEhB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"search-providers.d.ts","sourceRoot":"","sources":["../src/search-providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAET,eAAe,EAEhB,MAAM,YAAY,CAAC;AAKpB,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC,yCAAyC;AACzC,eAAO,MAAM,iBAAiB,0CAA2C,CAAC;AAE1E,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,OAAO,GACP,eAAe,GACf,YAAY,CAAC;AA+BjB,wBAAgB,eAAe,CAC7B,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,MAAM,GACjB,eAAe,CAOjB;AA0DD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,SAAS,CA2CZ;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,SAAS,CAmCZ;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAkBvE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,gBAAgB,GAAG,SAAS,CAY9B;AAuCD,sFAAsF;AACtF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,SAAS,EAClB,SAAS,EAAE,SAAS,SAAS,EAAE,GAC9B,SAAS,CA4BX;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,SAAS,GAAG,SAAS,CAkBxB"}
|