web-access-cli 0.5.0 → 0.6.0

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.
Files changed (46) hide show
  1. package/README.md +67 -10
  2. package/README_CN.md +67 -10
  3. package/THIRD_PARTY_NOTICES.md +0 -13
  4. package/dist/config/config.js +10 -2
  5. package/dist/config/config.js.map +1 -1
  6. package/dist/core/router.js +4 -2
  7. package/dist/core/router.js.map +1 -1
  8. package/dist/core/schema.js +1 -1
  9. package/dist/core/types.js +1 -0
  10. package/dist/core/types.js.map +1 -1
  11. package/dist/gateway/panel.js +791 -0
  12. package/dist/gateway/panel.js.map +1 -0
  13. package/dist/gateway/records.js +87 -0
  14. package/dist/gateway/records.js.map +1 -0
  15. package/dist/gateway/schema.js +115 -0
  16. package/dist/gateway/schema.js.map +1 -0
  17. package/dist/gateway/server.js +497 -0
  18. package/dist/gateway/server.js.map +1 -0
  19. package/dist/gateway/service.js +417 -0
  20. package/dist/gateway/service.js.map +1 -0
  21. package/dist/providers/anysearch.js +5 -3
  22. package/dist/providers/anysearch.js.map +1 -1
  23. package/dist/providers/deepseek.js +173 -106
  24. package/dist/providers/deepseek.js.map +1 -1
  25. package/dist/providers/registry.js +2 -0
  26. package/dist/providers/registry.js.map +1 -1
  27. package/dist/providers/search.js +4 -2
  28. package/dist/providers/search.js.map +1 -1
  29. package/dist/providers/xcrawl.js +1 -1
  30. package/dist/providers/xcrawl.js.map +1 -1
  31. package/dist/providers/yuanbao.js +214 -0
  32. package/dist/providers/yuanbao.js.map +1 -0
  33. package/dist/server.js +127 -0
  34. package/dist/server.js.map +1 -0
  35. package/dist/transport/http.js +8 -0
  36. package/dist/transport/http.js.map +1 -1
  37. package/dist/version.js +1 -1
  38. package/package.json +4 -2
  39. package/schemas/config.schema.json +4 -0
  40. package/schemas/gatewayError.schema.json +33 -0
  41. package/schemas/gatewayFetchRequest.schema.json +13 -0
  42. package/schemas/gatewayFetchResponse.schema.json +16 -0
  43. package/schemas/gatewaySearchRequest.schema.json +37 -0
  44. package/schemas/gatewaySearchResponse.schema.json +81 -0
  45. package/schemas/output.schema.json +52 -0
  46. package/schemas/searchRequest.schema.json +1 -1
@@ -0,0 +1,497 @@
1
+ import { createHash, randomBytes, randomUUID, timingSafeEqual, } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { createServer, } from "node:http";
4
+ import { VERSION } from "../version.js";
5
+ import { PANEL_PATH, RECORDS_PATH, renderPanelHtml } from "./panel.js";
6
+ import { createGatewayRecordStore, GATEWAY_RECORD_MAX_RESULTS, } from "./records.js";
7
+ import { GatewayValidationError, parseGatewayFetchRequest, parseGatewaySearchRequest, } from "./schema.js";
8
+ import { createGatewayService, GatewayClientAbort, GatewayHttpError, } from "./service.js";
9
+ /**
10
+ * Minimum gateway key length. Deployments should still generate a 32-byte random
11
+ * value (64 hex characters); this floor only rejects obviously weak keys.
12
+ */
13
+ export const GATEWAY_MIN_API_KEY_LENGTH = 12;
14
+ export const GATEWAY_MAX_BODY_BYTES = 64 * 1024;
15
+ export const GATEWAY_BODY_TIMEOUT_MS = 10_000;
16
+ export const GATEWAY_MAX_IN_FLIGHT = 4;
17
+ export function normalizeGatewayApiKey(raw) {
18
+ const value = raw.replace(/\r?\n$/, "");
19
+ if (!value.trim())
20
+ throw new Error("网关 API key 为空");
21
+ if (/\s/.test(value) || hasControlCharacters(value))
22
+ throw new Error("网关 API key 不能包含空白或控制字符");
23
+ if (value.length < GATEWAY_MIN_API_KEY_LENGTH)
24
+ throw new Error(`网关 API key 至少需要 ${GATEWAY_MIN_API_KEY_LENGTH} 个字符`);
25
+ return value;
26
+ }
27
+ /** Read the gateway bearer key from a file; never from argv or the environment. */
28
+ export function readGatewayApiKeyFile(path) {
29
+ return normalizeGatewayApiKey(readFileSync(path, "utf8"));
30
+ }
31
+ function digest(value) {
32
+ return createHash("sha256").update(value, "utf8").digest();
33
+ }
34
+ function hasControlCharacters(value) {
35
+ for (const character of value) {
36
+ const code = character.codePointAt(0) ?? 0;
37
+ if (code < 0x20 || code === 0x7f)
38
+ return true;
39
+ }
40
+ return false;
41
+ }
42
+ function sendJson(response, status, body, headers = {}) {
43
+ if (response.writableEnded || response.destroyed)
44
+ return;
45
+ const payload = JSON.stringify(body);
46
+ response.writeHead(status, {
47
+ "Content-Type": "application/json; charset=utf-8",
48
+ "Cache-Control": "no-store",
49
+ "Content-Length": Buffer.byteLength(payload, "utf8").toString(),
50
+ ...headers,
51
+ });
52
+ response.end(payload);
53
+ }
54
+ function sendError(response, error, headers = {}) {
55
+ sendJson(response, error.status, {
56
+ error: {
57
+ message: error.message,
58
+ type: error.type,
59
+ param: null,
60
+ code: error.code,
61
+ },
62
+ }, {
63
+ ...(error.retryAfterSeconds !== undefined
64
+ ? { "Retry-After": String(error.retryAfterSeconds) }
65
+ : {}),
66
+ ...headers,
67
+ });
68
+ }
69
+ function sendPanel(response, nonce, retention) {
70
+ if (response.writableEnded || response.destroyed)
71
+ return;
72
+ const body = renderPanelHtml({
73
+ nonce,
74
+ retention,
75
+ minKeyLength: GATEWAY_MIN_API_KEY_LENGTH,
76
+ version: VERSION,
77
+ });
78
+ response.writeHead(200, {
79
+ "Content-Type": "text/html; charset=utf-8",
80
+ "Cache-Control": "no-store",
81
+ "Content-Length": Buffer.byteLength(body, "utf8").toString(),
82
+ "Content-Security-Policy": [
83
+ "default-src 'none'",
84
+ `script-src 'nonce-${nonce}'`,
85
+ `style-src 'nonce-${nonce}'`,
86
+ "connect-src 'self'",
87
+ "img-src 'none'",
88
+ "base-uri 'none'",
89
+ "form-action 'none'",
90
+ "frame-ancestors 'none'",
91
+ ].join("; "),
92
+ "Referrer-Policy": "no-referrer",
93
+ "X-Content-Type-Options": "nosniff",
94
+ });
95
+ response.end(body);
96
+ }
97
+ const invalidRequest = (message) => new GatewayHttpError({
98
+ status: 400,
99
+ type: "invalid_request_error",
100
+ code: "invalid_request_error",
101
+ message,
102
+ });
103
+ const unauthorized = () => new GatewayHttpError({
104
+ status: 401,
105
+ type: "authentication_error",
106
+ code: "invalid_api_key",
107
+ message: "网关 API key 缺失或无效。",
108
+ });
109
+ const methodNotAllowed = (allowed) => new GatewayHttpError({
110
+ status: 405,
111
+ type: "invalid_request_error",
112
+ code: "method_not_allowed",
113
+ message: `该路径只接受 ${allowed} 请求。`,
114
+ });
115
+ const routeNotFound = () => new GatewayHttpError({
116
+ status: 404,
117
+ type: "invalid_request_error",
118
+ code: "not_found",
119
+ message: "接口不存在。",
120
+ });
121
+ const requestTooLarge = () => new GatewayHttpError({
122
+ status: 413,
123
+ type: "invalid_request_error",
124
+ code: "request_too_large",
125
+ message: "请求体超过网关大小限制。",
126
+ });
127
+ const requestTimeout = () => new GatewayHttpError({
128
+ status: 408,
129
+ type: "timeout_error",
130
+ code: "request_timeout",
131
+ message: "读取请求体超时。",
132
+ });
133
+ class BodyTooLarge extends Error {
134
+ }
135
+ class BodyReadTimeout extends Error {
136
+ }
137
+ class BodyAborted extends Error {
138
+ }
139
+ function readJsonObject(request, maxBytes, timeoutMs) {
140
+ return new Promise((resolve, reject) => {
141
+ const chunks = [];
142
+ let size = 0;
143
+ let settled = false;
144
+ const finish = (error, value) => {
145
+ if (settled)
146
+ return;
147
+ settled = true;
148
+ clearTimeout(timer);
149
+ request.off("data", onData);
150
+ request.off("end", onEnd);
151
+ request.off("error", onError);
152
+ request.off("aborted", onAborted);
153
+ if (error)
154
+ reject(error);
155
+ else
156
+ resolve(value);
157
+ };
158
+ const onData = (chunk) => {
159
+ size += chunk.byteLength;
160
+ if (size > maxBytes) {
161
+ finish(new BodyTooLarge());
162
+ return;
163
+ }
164
+ chunks.push(chunk);
165
+ };
166
+ const onEnd = () => {
167
+ const text = Buffer.concat(chunks).toString("utf8");
168
+ if (!text.trim()) {
169
+ finish(invalidRequest("请求体不能为空。"));
170
+ return;
171
+ }
172
+ let parsed;
173
+ try {
174
+ parsed = JSON.parse(text);
175
+ }
176
+ catch {
177
+ finish(invalidRequest("请求体不是合法的 JSON。"));
178
+ return;
179
+ }
180
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
181
+ finish(invalidRequest("请求体必须是 JSON 对象。"));
182
+ return;
183
+ }
184
+ finish(undefined, parsed);
185
+ };
186
+ const onError = () => finish(new BodyAborted());
187
+ const onAborted = () => finish(new BodyAborted());
188
+ const timer = setTimeout(() => finish(new BodyReadTimeout()), Math.max(1, timeoutMs));
189
+ request.on("data", onData);
190
+ request.on("end", onEnd);
191
+ request.on("error", onError);
192
+ request.on("aborted", onAborted);
193
+ });
194
+ }
195
+ function contentTypeIsJson(header) {
196
+ if (!header)
197
+ return false;
198
+ const [mediaType, ...parameters] = header.split(";");
199
+ if (mediaType?.trim().toLowerCase() !== "application/json")
200
+ return false;
201
+ for (const parameter of parameters) {
202
+ const name = parameter.split("=", 1)[0]?.trim().toLowerCase();
203
+ if (name !== "charset")
204
+ continue;
205
+ const value = parameter
206
+ .slice(parameter.indexOf("=") + 1)
207
+ .trim()
208
+ .replace(/^"|"$/g, "")
209
+ .toLowerCase();
210
+ if (value !== "utf-8" && value !== "utf8")
211
+ return false;
212
+ }
213
+ return true;
214
+ }
215
+ /**
216
+ * Exactly one `Authorization: Bearer <key>` value is required. Duplicate header
217
+ * lines are visible through `headersDistinct` and are rejected without touching
218
+ * providers; `request.headers.authorization` silently keeps the first value.
219
+ */
220
+ function authorizationKey(request) {
221
+ const distinct = request.headersDistinct.authorization;
222
+ if (distinct?.length !== 1)
223
+ return "";
224
+ const header = distinct[0];
225
+ if (typeof header !== "string")
226
+ return "";
227
+ if (!header.startsWith("Bearer "))
228
+ return "";
229
+ const value = header.slice("Bearer ".length);
230
+ if (!value || value !== value.trim())
231
+ return "";
232
+ if (hasControlCharacters(value))
233
+ return "";
234
+ return value;
235
+ }
236
+ export function createGatewayServer(options) {
237
+ const service = createGatewayService({
238
+ loaded: options.loaded,
239
+ transport: options.transport,
240
+ now: options.now,
241
+ limits: options.limits,
242
+ });
243
+ const expected = digest(options.apiKey);
244
+ const records = createGatewayRecordStore(options.recordLimit);
245
+ const maxBodyBytes = options.maxBodyBytes ?? GATEWAY_MAX_BODY_BYTES;
246
+ const bodyTimeoutMs = options.bodyTimeoutMs ?? GATEWAY_BODY_TIMEOUT_MS;
247
+ const log = options.log ??
248
+ ((event) => process.stderr.write(`${JSON.stringify(event)}\n`));
249
+ let inFlight = 0;
250
+ let shuttingDown = false;
251
+ const active = new Set();
252
+ const authenticate = (request) => {
253
+ const providedKey = authorizationKey(request);
254
+ return (providedKey.length > 0 && timingSafeEqual(digest(providedKey), expected));
255
+ };
256
+ const handle = async (request, response, route) => {
257
+ const started = performance.now();
258
+ const rawRequestId = request.headers["x-request-id"];
259
+ const requestId = typeof rawRequestId === "string" &&
260
+ /^[A-Za-z0-9._-]{1,64}$/.test(rawRequestId)
261
+ ? rawRequestId
262
+ : randomUUID();
263
+ let status = 500;
264
+ let code;
265
+ let authenticated = false;
266
+ let clientAborted = false;
267
+ const summary = {};
268
+ const clientAbort = new AbortController();
269
+ response.once("close", () => {
270
+ if (!response.writableEnded)
271
+ clientAbort.abort();
272
+ });
273
+ try {
274
+ if (shuttingDown)
275
+ throw new GatewayHttpError({
276
+ status: 503,
277
+ type: "server_error",
278
+ code: "shutting_down",
279
+ message: "网关正在停止。",
280
+ });
281
+ if (!authenticate(request))
282
+ throw unauthorized();
283
+ authenticated = true;
284
+ if (!contentTypeIsJson(request.headers["content-type"]))
285
+ throw invalidRequest("Content-Type 必须是 application/json。");
286
+ if (request.headers["content-encoding"] !== undefined)
287
+ throw invalidRequest("不支持压缩请求体。");
288
+ if (inFlight >= GATEWAY_MAX_IN_FLIGHT)
289
+ throw new GatewayHttpError({
290
+ status: 429,
291
+ type: "rate_limit_error",
292
+ code: "rate_limit_exceeded",
293
+ message: "网关并发已满,请稍后重试。",
294
+ retryAfterSeconds: 1,
295
+ });
296
+ inFlight += 1;
297
+ try {
298
+ const raw = await readJsonObject(request, maxBodyBytes, bodyTimeoutMs);
299
+ const parsed = route === "search"
300
+ ? parseGatewaySearchRequest(raw)
301
+ : parseGatewayFetchRequest(raw);
302
+ if (route === "search") {
303
+ const search = parsed;
304
+ summary.query = search.query;
305
+ summary.count = search.count;
306
+ summary.needContent = search.need_content ?? false;
307
+ }
308
+ else {
309
+ summary.url = parsed.url;
310
+ }
311
+ const observer = {
312
+ onSuccess: (info) => {
313
+ summary.provider = info.provider;
314
+ },
315
+ };
316
+ const body = route === "search"
317
+ ? await service.search(parsed, clientAbort.signal, observer)
318
+ : await service.fetch(parsed, clientAbort.signal, observer);
319
+ if (clientAbort.signal.aborted || response.writableEnded) {
320
+ clientAborted = true;
321
+ return;
322
+ }
323
+ if (route === "search") {
324
+ const searchBody = body;
325
+ summary.resultCount = searchBody.results.length;
326
+ summary.results = searchBody.results
327
+ .slice(0, GATEWAY_RECORD_MAX_RESULTS)
328
+ .map((result) => ({ title: result.title, url: result.url }));
329
+ }
330
+ else {
331
+ summary.title = body.title;
332
+ }
333
+ status = 200;
334
+ sendJson(response, 200, body);
335
+ }
336
+ finally {
337
+ inFlight -= 1;
338
+ }
339
+ }
340
+ catch (error) {
341
+ if (error instanceof GatewayClientAbort || clientAbort.signal.aborted) {
342
+ clientAborted = true;
343
+ return;
344
+ }
345
+ const mapped = error instanceof GatewayValidationError
346
+ ? invalidRequest(error.message)
347
+ : error instanceof BodyTooLarge
348
+ ? requestTooLarge()
349
+ : error instanceof BodyReadTimeout
350
+ ? requestTimeout()
351
+ : error instanceof BodyAborted
352
+ ? invalidRequest("请求读取中断。")
353
+ : error instanceof GatewayHttpError
354
+ ? error
355
+ : new GatewayHttpError({
356
+ status: 500,
357
+ type: "server_error",
358
+ code: "internal_error",
359
+ message: "网关内部错误。",
360
+ });
361
+ status = mapped.status;
362
+ code = mapped.code;
363
+ summary.provider = summary.provider ?? mapped.provider;
364
+ // Body limits and timeouts close the connection after the error envelope.
365
+ const closeConnection = error instanceof BodyTooLarge ||
366
+ error instanceof BodyReadTimeout ||
367
+ error instanceof BodyAborted;
368
+ sendError(response, mapped, closeConnection ? { Connection: "close" } : {});
369
+ if (closeConnection)
370
+ request.destroy();
371
+ }
372
+ finally {
373
+ const durationMs = Math.max(0, Math.round(performance.now() - started));
374
+ log({
375
+ method: request.method ?? "",
376
+ route,
377
+ status,
378
+ durationMs,
379
+ requestId,
380
+ ...(code ? { code } : {}),
381
+ });
382
+ // The panel is an observability surface, not another log sink: only
383
+ // authenticated tool requests are retained, so unauthenticated probes
384
+ // cannot flush the ring buffer and failed keys stay in stderr logs.
385
+ if (authenticated && !clientAborted) {
386
+ records.add({
387
+ id: requestId,
388
+ at: Date.now(),
389
+ route,
390
+ status,
391
+ durationMs,
392
+ ...(code ? { code } : {}),
393
+ ...summary,
394
+ });
395
+ }
396
+ }
397
+ };
398
+ const server = createServer((request, response) => {
399
+ active.add(response);
400
+ response.once("close", () => active.delete(response));
401
+ const url = request.url ?? "/";
402
+ const path = url.split("?", 1)[0] ?? "/";
403
+ if (path === "/healthz" || path === "/readyz") {
404
+ if (request.method !== "GET") {
405
+ sendError(response, methodNotAllowed("GET"), { Allow: "GET" });
406
+ return;
407
+ }
408
+ if (path === "/healthz") {
409
+ sendJson(response, 200, { status: "ok" });
410
+ return;
411
+ }
412
+ if (shuttingDown) {
413
+ sendJson(response, 503, { status: "shutting_down" });
414
+ return;
415
+ }
416
+ const readiness = service.readiness();
417
+ sendJson(response, readiness.ready ? 200 : 503, readiness.ready
418
+ ? { status: "ready" }
419
+ : { status: "not_ready", reason: readiness.reason });
420
+ return;
421
+ }
422
+ if (path === "/" || path === PANEL_PATH) {
423
+ if (request.method !== "GET") {
424
+ sendError(response, methodNotAllowed("GET"), { Allow: "GET" });
425
+ return;
426
+ }
427
+ sendPanel(response, randomBytes(16).toString("base64url"), records.retention);
428
+ return;
429
+ }
430
+ if (path === RECORDS_PATH) {
431
+ if (request.method !== "GET") {
432
+ sendError(response, methodNotAllowed("GET"), { Allow: "GET" });
433
+ return;
434
+ }
435
+ if (!authenticate(request)) {
436
+ sendError(response, unauthorized());
437
+ return;
438
+ }
439
+ const queryIndex = url.indexOf("?");
440
+ const params = new URLSearchParams(queryIndex === -1 ? "" : url.slice(queryIndex + 1));
441
+ const rawLimit = params.get("limit");
442
+ let limit = records.retention;
443
+ if (rawLimit !== null) {
444
+ if (!/^[1-9]\d{0,3}$/.test(rawLimit) ||
445
+ Number(rawLimit) > records.retention) {
446
+ sendError(response, invalidRequest(`limit 必须是 1–${records.retention} 的整数。`));
447
+ return;
448
+ }
449
+ limit = Number(rawLimit);
450
+ }
451
+ const list = records.list(limit);
452
+ sendJson(response, 200, {
453
+ records: list,
454
+ count: list.length,
455
+ retention: records.retention,
456
+ generatedAt: Date.now(),
457
+ });
458
+ return;
459
+ }
460
+ if (path === "/v1/tools/search" || path === "/v1/tools/fetch") {
461
+ if (request.method !== "POST") {
462
+ sendError(response, methodNotAllowed("POST"), { Allow: "POST" });
463
+ return;
464
+ }
465
+ void handle(request, response, path === "/v1/tools/search" ? "search" : "fetch");
466
+ return;
467
+ }
468
+ sendError(response, routeNotFound());
469
+ });
470
+ return {
471
+ server,
472
+ service,
473
+ async shutdown(timeoutMs) {
474
+ shuttingDown = true;
475
+ const drained = new Promise((resolveDrained) => {
476
+ const poll = () => {
477
+ if (inFlight === 0)
478
+ resolveDrained();
479
+ else
480
+ setTimeout(poll, 20).unref();
481
+ };
482
+ poll();
483
+ });
484
+ let timer;
485
+ const expired = new Promise((resolveExpired) => {
486
+ timer = setTimeout(resolveExpired, Math.max(0, timeoutMs));
487
+ });
488
+ await Promise.race([drained, expired]);
489
+ if (timer)
490
+ clearTimeout(timer);
491
+ for (const response of active)
492
+ response.destroy();
493
+ await new Promise((resolveClosed) => server.close(() => resolveClosed()));
494
+ },
495
+ };
496
+ }
497
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/gateway/server.ts"],"names":[],"mappings":"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"}