@kodelyth/brave-plugin 2026.5.42 → 2026.6.2
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/package.json +17 -2
- package/index.ts +0 -11
- package/src/brave-web-search-provider.runtime.ts +0 -570
- package/src/brave-web-search-provider.shared.ts +0 -227
- package/src/brave-web-search-provider.test.ts +0 -756
- package/src/brave-web-search-provider.ts +0 -186
- package/test-api.ts +0 -14
- package/tsconfig.json +0 -16
- package/web-search-contract-api.ts +0 -70
- package/web-search-provider.ts +0 -1
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
normalizeLowercaseStringOrEmpty,
|
|
3
|
-
normalizeOptionalString,
|
|
4
|
-
} from "klaw/plugin-sdk/string-coerce-runtime";
|
|
5
|
-
|
|
6
|
-
type BraveConfig = {
|
|
7
|
-
baseUrl?: unknown;
|
|
8
|
-
mode?: string;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
type BraveLlmContextResult = { url: string; title: string; snippets: string[] };
|
|
12
|
-
export type BraveLlmContextResponse = {
|
|
13
|
-
grounding: { generic?: BraveLlmContextResult[] };
|
|
14
|
-
sources?: { url?: string; hostname?: string; date?: string }[];
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
const BRAVE_COUNTRY_CODES = new Set([
|
|
18
|
-
"AR",
|
|
19
|
-
"AU",
|
|
20
|
-
"AT",
|
|
21
|
-
"BE",
|
|
22
|
-
"BR",
|
|
23
|
-
"CA",
|
|
24
|
-
"CL",
|
|
25
|
-
"DK",
|
|
26
|
-
"FI",
|
|
27
|
-
"FR",
|
|
28
|
-
"DE",
|
|
29
|
-
"GR",
|
|
30
|
-
"HK",
|
|
31
|
-
"IN",
|
|
32
|
-
"ID",
|
|
33
|
-
"IT",
|
|
34
|
-
"JP",
|
|
35
|
-
"KR",
|
|
36
|
-
"MY",
|
|
37
|
-
"MX",
|
|
38
|
-
"NL",
|
|
39
|
-
"NZ",
|
|
40
|
-
"NO",
|
|
41
|
-
"CN",
|
|
42
|
-
"PL",
|
|
43
|
-
"PT",
|
|
44
|
-
"PH",
|
|
45
|
-
"RU",
|
|
46
|
-
"SA",
|
|
47
|
-
"ZA",
|
|
48
|
-
"ES",
|
|
49
|
-
"SE",
|
|
50
|
-
"CH",
|
|
51
|
-
"TW",
|
|
52
|
-
"TR",
|
|
53
|
-
"GB",
|
|
54
|
-
"US",
|
|
55
|
-
"ALL",
|
|
56
|
-
]);
|
|
57
|
-
|
|
58
|
-
const BRAVE_SEARCH_LANG_CODES = new Set([
|
|
59
|
-
"ar",
|
|
60
|
-
"eu",
|
|
61
|
-
"bn",
|
|
62
|
-
"bg",
|
|
63
|
-
"ca",
|
|
64
|
-
"zh-hans",
|
|
65
|
-
"zh-hant",
|
|
66
|
-
"hr",
|
|
67
|
-
"cs",
|
|
68
|
-
"da",
|
|
69
|
-
"nl",
|
|
70
|
-
"en",
|
|
71
|
-
"en-gb",
|
|
72
|
-
"et",
|
|
73
|
-
"fi",
|
|
74
|
-
"fr",
|
|
75
|
-
"gl",
|
|
76
|
-
"de",
|
|
77
|
-
"el",
|
|
78
|
-
"gu",
|
|
79
|
-
"he",
|
|
80
|
-
"hi",
|
|
81
|
-
"hu",
|
|
82
|
-
"is",
|
|
83
|
-
"it",
|
|
84
|
-
"jp",
|
|
85
|
-
"kn",
|
|
86
|
-
"ko",
|
|
87
|
-
"lv",
|
|
88
|
-
"lt",
|
|
89
|
-
"ms",
|
|
90
|
-
"ml",
|
|
91
|
-
"mr",
|
|
92
|
-
"nb",
|
|
93
|
-
"pl",
|
|
94
|
-
"pt-br",
|
|
95
|
-
"pt-pt",
|
|
96
|
-
"pa",
|
|
97
|
-
"ro",
|
|
98
|
-
"ru",
|
|
99
|
-
"sr",
|
|
100
|
-
"sk",
|
|
101
|
-
"sl",
|
|
102
|
-
"es",
|
|
103
|
-
"sv",
|
|
104
|
-
"ta",
|
|
105
|
-
"te",
|
|
106
|
-
"th",
|
|
107
|
-
"tr",
|
|
108
|
-
"uk",
|
|
109
|
-
"vi",
|
|
110
|
-
]);
|
|
111
|
-
|
|
112
|
-
const BRAVE_SEARCH_LANG_ALIASES: Record<string, string> = {
|
|
113
|
-
ja: "jp",
|
|
114
|
-
zh: "zh-hans",
|
|
115
|
-
"zh-cn": "zh-hans",
|
|
116
|
-
"zh-hk": "zh-hant",
|
|
117
|
-
"zh-sg": "zh-hans",
|
|
118
|
-
"zh-tw": "zh-hant",
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
const BRAVE_UI_LANG_LOCALE = /^([a-z]{2})-([a-z]{2})$/i;
|
|
122
|
-
|
|
123
|
-
function normalizeBraveSearchLang(value: string | undefined): string | undefined {
|
|
124
|
-
if (!value) {
|
|
125
|
-
return undefined;
|
|
126
|
-
}
|
|
127
|
-
const trimmed = value.trim();
|
|
128
|
-
if (!trimmed) {
|
|
129
|
-
return undefined;
|
|
130
|
-
}
|
|
131
|
-
const lower = normalizeLowercaseStringOrEmpty(trimmed);
|
|
132
|
-
const canonical = BRAVE_SEARCH_LANG_ALIASES[lower] ?? lower;
|
|
133
|
-
if (!BRAVE_SEARCH_LANG_CODES.has(canonical)) {
|
|
134
|
-
return undefined;
|
|
135
|
-
}
|
|
136
|
-
return canonical;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
export function normalizeBraveCountry(value: string | undefined): string | undefined {
|
|
140
|
-
if (!value) {
|
|
141
|
-
return undefined;
|
|
142
|
-
}
|
|
143
|
-
const trimmed = value.trim();
|
|
144
|
-
if (!trimmed) {
|
|
145
|
-
return undefined;
|
|
146
|
-
}
|
|
147
|
-
const canonical = trimmed.toUpperCase();
|
|
148
|
-
return BRAVE_COUNTRY_CODES.has(canonical) ? canonical : "ALL";
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
function normalizeBraveUiLang(value: string | undefined): string | undefined {
|
|
152
|
-
if (!value) {
|
|
153
|
-
return undefined;
|
|
154
|
-
}
|
|
155
|
-
const trimmed = value.trim();
|
|
156
|
-
if (!trimmed) {
|
|
157
|
-
return undefined;
|
|
158
|
-
}
|
|
159
|
-
const match = trimmed.match(BRAVE_UI_LANG_LOCALE);
|
|
160
|
-
if (!match) {
|
|
161
|
-
return undefined;
|
|
162
|
-
}
|
|
163
|
-
const [, language, region] = match;
|
|
164
|
-
return `${normalizeLowercaseStringOrEmpty(language)}-${region.toUpperCase()}`;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export function resolveBraveConfig(searchConfig?: Record<string, unknown>): BraveConfig {
|
|
168
|
-
const brave = searchConfig?.brave;
|
|
169
|
-
return brave && typeof brave === "object" && !Array.isArray(brave) ? (brave as BraveConfig) : {};
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
export function resolveBraveMode(brave?: BraveConfig): "web" | "llm-context" {
|
|
173
|
-
return brave?.mode === "llm-context" ? "llm-context" : "web";
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
export function normalizeBraveLanguageParams(params: { search_lang?: string; ui_lang?: string }): {
|
|
177
|
-
search_lang?: string;
|
|
178
|
-
ui_lang?: string;
|
|
179
|
-
invalidField?: "search_lang" | "ui_lang";
|
|
180
|
-
} {
|
|
181
|
-
const rawSearchLang = normalizeOptionalString(params.search_lang);
|
|
182
|
-
const rawUiLang = normalizeOptionalString(params.ui_lang);
|
|
183
|
-
let searchLangCandidate = rawSearchLang;
|
|
184
|
-
let uiLangCandidate = rawUiLang;
|
|
185
|
-
|
|
186
|
-
if (normalizeBraveUiLang(rawSearchLang) && normalizeBraveSearchLang(rawUiLang)) {
|
|
187
|
-
searchLangCandidate = rawUiLang;
|
|
188
|
-
uiLangCandidate = rawSearchLang;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const search_lang = normalizeBraveSearchLang(searchLangCandidate);
|
|
192
|
-
if (searchLangCandidate && !search_lang) {
|
|
193
|
-
return { invalidField: "search_lang" };
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
const ui_lang = normalizeBraveUiLang(uiLangCandidate);
|
|
197
|
-
if (uiLangCandidate && !ui_lang) {
|
|
198
|
-
return { invalidField: "ui_lang" };
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
return { search_lang, ui_lang };
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
function resolveSiteName(url: string | undefined): string | undefined {
|
|
205
|
-
if (!url) {
|
|
206
|
-
return undefined;
|
|
207
|
-
}
|
|
208
|
-
try {
|
|
209
|
-
return new URL(url).hostname;
|
|
210
|
-
} catch {
|
|
211
|
-
return undefined;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
export function mapBraveLlmContextResults(
|
|
216
|
-
data: BraveLlmContextResponse,
|
|
217
|
-
): { url: string; title: string; snippets: string[]; siteName?: string }[] {
|
|
218
|
-
const genericResults = Array.isArray(data.grounding?.generic) ? data.grounding.generic : [];
|
|
219
|
-
return genericResults.map((entry) => ({
|
|
220
|
-
url: entry.url ?? "",
|
|
221
|
-
title: entry.title ?? "",
|
|
222
|
-
snippets: (entry.snippets ?? []).filter(
|
|
223
|
-
(snippet) => typeof snippet === "string" && snippet.length > 0,
|
|
224
|
-
),
|
|
225
|
-
siteName: resolveSiteName(entry.url) || undefined,
|
|
226
|
-
}));
|
|
227
|
-
}
|