web-access-cli 0.6.0 → 0.7.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.
@@ -1 +1 @@
1
- {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/gateway/panel.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AASjD;;;;GAIG;AACH,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAwwBf,CAAC;AAET,MAAM,UAAU,eAAe,CAAC,OAAqB;IACpD,OAAO,cAAc,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC;SAC1D,UAAU,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;SACtD,UAAU,CAAC,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;SAC9D,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/gateway/panel.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,133 @@
1
1
  export const GATEWAY_RECORD_RETENTION = 500;
2
- export const GATEWAY_RECORD_MAX_RESULTS = 5;
2
+ export const GATEWAY_RECORD_MAX_RESULTS = 50;
3
+ export const GATEWAY_RECORD_MAX_ATTEMPTS = 32;
4
+ export const GATEWAY_RECORD_SEARCH_PREVIEW_CHARS = 2_000;
5
+ export const GATEWAY_RECORD_FETCH_PREVIEW_CHARS = 4_000;
3
6
  function truncate(value, max) {
4
7
  const characters = Array.from(value);
5
8
  if (characters.length <= max)
6
9
  return value;
7
10
  return `${characters.slice(0, max).join("")}…`;
8
11
  }
12
+ export function truncatePreview(value, maxChars) {
13
+ const characters = Array.from(value);
14
+ const chars = characters.length;
15
+ if (chars <= maxChars) {
16
+ return { preview: value, chars, truncated: false };
17
+ }
18
+ return {
19
+ preview: `${characters.slice(0, maxChars).join("")}…`,
20
+ chars,
21
+ truncated: true,
22
+ };
23
+ }
9
24
  function optionalString(value, max) {
10
- return typeof value === "string" ? truncate(value, max) : undefined;
25
+ return typeof value === "string" && value.length > 0
26
+ ? truncate(value, max)
27
+ : undefined;
28
+ }
29
+ function sanitizeAttempts(value) {
30
+ if (!Array.isArray(value))
31
+ return undefined;
32
+ const attempts = [];
33
+ for (const item of value) {
34
+ if (attempts.length >= GATEWAY_RECORD_MAX_ATTEMPTS)
35
+ break;
36
+ if (!item || typeof item !== "object")
37
+ continue;
38
+ const candidate = item;
39
+ if (typeof candidate.provider !== "string")
40
+ continue;
41
+ const status = candidate.status === "ok" ||
42
+ candidate.status === "failed" ||
43
+ candidate.status === "skipped"
44
+ ? candidate.status
45
+ : undefined;
46
+ if (!status)
47
+ continue;
48
+ const attempt = {
49
+ provider: truncate(candidate.provider, 64),
50
+ status,
51
+ durationMs: typeof candidate.durationMs === "number" &&
52
+ Number.isFinite(candidate.durationMs)
53
+ ? Math.max(0, Math.round(candidate.durationMs))
54
+ : 0,
55
+ };
56
+ const providerType = optionalString(candidate.providerType, 32);
57
+ if (providerType)
58
+ attempt.providerType = providerType;
59
+ const errorCode = optionalString(candidate.errorCode, 64);
60
+ if (errorCode)
61
+ attempt.errorCode = errorCode;
62
+ const errorMessage = optionalString(candidate.errorMessage, 240);
63
+ if (errorMessage)
64
+ attempt.errorMessage = errorMessage;
65
+ if (typeof candidate.httpStatus === "number" &&
66
+ Number.isInteger(candidate.httpStatus)) {
67
+ attempt.httpStatus = candidate.httpStatus;
68
+ }
69
+ attempts.push(attempt);
70
+ }
71
+ return attempts.length > 0 ? attempts : undefined;
72
+ }
73
+ function sanitizeBackfill(value) {
74
+ if (!value || typeof value !== "object")
75
+ return undefined;
76
+ const candidate = value;
77
+ if (!Array.isArray(candidate.items))
78
+ return undefined;
79
+ const items = [];
80
+ for (const rawItem of candidate.items) {
81
+ if (items.length >= GATEWAY_RECORD_MAX_RESULTS)
82
+ break;
83
+ if (!rawItem || typeof rawItem !== "object")
84
+ continue;
85
+ const entry = rawItem;
86
+ if (typeof entry.url !== "string")
87
+ continue;
88
+ const status = entry.status === "ok" ||
89
+ entry.status === "failed" ||
90
+ entry.status === "skipped"
91
+ ? entry.status
92
+ : "failed";
93
+ const item = {
94
+ rank: typeof entry.rank === "number" && Number.isFinite(entry.rank)
95
+ ? Math.max(1, Math.floor(entry.rank))
96
+ : items.length + 1,
97
+ url: truncate(entry.url, 400),
98
+ status,
99
+ durationMs: typeof entry.durationMs === "number" &&
100
+ Number.isFinite(entry.durationMs)
101
+ ? Math.max(0, Math.round(entry.durationMs))
102
+ : 0,
103
+ };
104
+ const provider = optionalString(entry.provider, 64);
105
+ if (provider)
106
+ item.provider = provider;
107
+ if (typeof entry.contentChars === "number" &&
108
+ Number.isFinite(entry.contentChars)) {
109
+ item.contentChars = Math.max(0, Math.floor(entry.contentChars));
110
+ }
111
+ const errorCode = optionalString(entry.errorCode, 64);
112
+ if (errorCode)
113
+ item.errorCode = errorCode;
114
+ const attempts = sanitizeAttempts(entry.attempts);
115
+ if (attempts)
116
+ item.attempts = attempts;
117
+ items.push(item);
118
+ }
119
+ const num = (v) => typeof v === "number" && Number.isFinite(v)
120
+ ? Math.max(0, Math.floor(v))
121
+ : 0;
122
+ return {
123
+ requestedCount: num(candidate.requestedCount),
124
+ attemptedCount: num(candidate.attemptedCount),
125
+ succeededCount: num(candidate.succeededCount),
126
+ failedCount: num(candidate.failedCount),
127
+ skippedCount: num(candidate.skippedCount),
128
+ durationMs: num(candidate.durationMs),
129
+ items,
130
+ };
11
131
  }
12
132
  function sanitizeResults(value) {
13
133
  if (!Array.isArray(value))
@@ -22,10 +142,31 @@ function sanitizeResults(value) {
22
142
  if (typeof candidate.title !== "string" ||
23
143
  typeof candidate.url !== "string")
24
144
  continue;
25
- results.push({
145
+ const result = {
26
146
  title: truncate(candidate.title, 160),
27
147
  url: truncate(candidate.url, 400),
28
- });
148
+ };
149
+ if (typeof candidate.rank === "number" && Number.isFinite(candidate.rank)) {
150
+ result.rank = Math.max(1, Math.floor(candidate.rank));
151
+ }
152
+ const snippet = optionalString(candidate.snippet, 600);
153
+ if (snippet)
154
+ result.snippet = snippet;
155
+ if (typeof candidate.contentPreview === "string" &&
156
+ candidate.contentPreview.length > 0) {
157
+ const preview = truncatePreview(candidate.contentPreview, GATEWAY_RECORD_SEARCH_PREVIEW_CHARS);
158
+ result.contentPreview = preview.preview;
159
+ result.contentChars =
160
+ typeof candidate.contentChars === "number" &&
161
+ Number.isFinite(candidate.contentChars)
162
+ ? Math.max(preview.chars, Math.floor(candidate.contentChars))
163
+ : preview.chars;
164
+ result.contentTruncated =
165
+ typeof candidate.contentTruncated === "boolean"
166
+ ? candidate.contentTruncated || preview.truncated
167
+ : preview.truncated;
168
+ }
169
+ results.push(result);
29
170
  }
30
171
  return results.length > 0 ? results : undefined;
31
172
  }
@@ -61,8 +202,64 @@ function sanitizeRecord(record) {
61
202
  const results = sanitizeResults(record.results);
62
203
  if (results)
63
204
  sanitized.results = results;
205
+ if (typeof record.contentPreview === "string" &&
206
+ record.contentPreview.length > 0) {
207
+ const preview = truncatePreview(record.contentPreview, GATEWAY_RECORD_FETCH_PREVIEW_CHARS);
208
+ sanitized.contentPreview = preview.preview;
209
+ sanitized.contentChars =
210
+ typeof record.contentChars === "number" &&
211
+ Number.isFinite(record.contentChars)
212
+ ? Math.max(preview.chars, Math.floor(record.contentChars))
213
+ : preview.chars;
214
+ sanitized.contentTruncated =
215
+ typeof record.contentTruncated === "boolean"
216
+ ? record.contentTruncated || preview.truncated
217
+ : preview.truncated;
218
+ }
219
+ const attempts = sanitizeAttempts(record.attempts);
220
+ if (attempts)
221
+ sanitized.attempts = attempts;
222
+ const contentBackfill = sanitizeBackfill(record.contentBackfill);
223
+ if (contentBackfill)
224
+ sanitized.contentBackfill = contentBackfill;
64
225
  return sanitized;
65
226
  }
227
+ function matchesFilter(record, filter) {
228
+ if (filter.route && record.route !== filter.route)
229
+ return false;
230
+ if (filter.status === "ok" && (record.status < 200 || record.status >= 300))
231
+ return false;
232
+ if (filter.status === "error" && record.status >= 200 && record.status < 300)
233
+ return false;
234
+ if (filter.provider) {
235
+ const target = filter.provider.toLowerCase();
236
+ const matchedPrimary = record.provider?.toLowerCase() === target;
237
+ const matchedAttempt = record.attempts?.some((attempt) => attempt.provider.toLowerCase() === target);
238
+ const matchedBackfill = record.contentBackfill?.items.some((item) => item.provider?.toLowerCase() === target);
239
+ if (!matchedPrimary && !matchedAttempt && !matchedBackfill)
240
+ return false;
241
+ }
242
+ if (filter.q) {
243
+ const needle = filter.q.trim().toLowerCase();
244
+ if (needle.length > 0) {
245
+ const haystacks = [
246
+ record.id,
247
+ record.query,
248
+ record.url,
249
+ record.title,
250
+ record.code,
251
+ record.provider,
252
+ ];
253
+ const matchedField = haystacks.some((field) => typeof field === "string" && field.toLowerCase().includes(needle));
254
+ const matchedResult = record.results?.some((item) => item.title.toLowerCase().includes(needle) ||
255
+ item.url.toLowerCase().includes(needle) ||
256
+ (item.snippet ? item.snippet.toLowerCase().includes(needle) : false));
257
+ if (!matchedField && !matchedResult)
258
+ return false;
259
+ }
260
+ }
261
+ return true;
262
+ }
66
263
  export function createGatewayRecordStore(retention = GATEWAY_RECORD_RETENTION) {
67
264
  const capacity = Math.max(1, Math.floor(retention));
68
265
  const records = [];
@@ -78,9 +275,189 @@ export function createGatewayRecordStore(retention = GATEWAY_RECORD_RETENTION) {
78
275
  if (records.length > capacity)
79
276
  records.splice(0, records.length - capacity);
80
277
  },
81
- list(limit = capacity) {
82
- const bounded = Math.min(Math.max(1, Math.floor(limit)), capacity);
83
- return records.slice(-bounded).reverse();
278
+ list(limitOrFilter) {
279
+ const filter = typeof limitOrFilter === "number"
280
+ ? { limit: limitOrFilter }
281
+ : (limitOrFilter ?? {});
282
+ const bounded = Math.min(Math.max(1, Math.floor(filter.limit ?? capacity)), capacity);
283
+ const hasCriteria = Boolean(filter.route || filter.status || filter.provider || filter.q?.trim());
284
+ if (!hasCriteria) {
285
+ return records.slice(-bounded).reverse();
286
+ }
287
+ const matched = [];
288
+ for (let index = records.length - 1; index >= 0; index--) {
289
+ const item = records[index];
290
+ if (!item)
291
+ continue;
292
+ if (matchesFilter(item, filter)) {
293
+ matched.push(item);
294
+ if (matched.length >= bounded)
295
+ break;
296
+ }
297
+ }
298
+ return matched;
299
+ },
300
+ get(id) {
301
+ for (let index = records.length - 1; index >= 0; index--) {
302
+ const item = records[index];
303
+ if (item && item.id === id)
304
+ return item;
305
+ }
306
+ return undefined;
307
+ },
308
+ clear() {
309
+ const cleared = records.length;
310
+ records.length = 0;
311
+ return cleared;
312
+ },
313
+ };
314
+ }
315
+ function emptyCapabilityStats() {
316
+ return {
317
+ attempts: 0,
318
+ successes: 0,
319
+ failures: 0,
320
+ skipped: 0,
321
+ totalDurationMs: 0,
322
+ avgDurationMs: 0,
323
+ errorCodes: {},
324
+ };
325
+ }
326
+ function applyAttemptToCapabilityStats(stats, attempt, at) {
327
+ if (attempt.status === "skipped") {
328
+ stats.skipped += 1;
329
+ return;
330
+ }
331
+ stats.attempts += 1;
332
+ stats.totalDurationMs += Math.max(0, attempt.durationMs);
333
+ stats.avgDurationMs = Math.round(stats.totalDurationMs / stats.attempts);
334
+ stats.lastUsedAt = at;
335
+ stats.lastStatus = attempt.status;
336
+ if (attempt.status === "ok") {
337
+ stats.successes += 1;
338
+ }
339
+ else {
340
+ stats.failures += 1;
341
+ const code = attempt.errorCode ?? "unknown";
342
+ stats.lastErrorCode = code;
343
+ stats.errorCodes[code] = (stats.errorCodes[code] ?? 0) + 1;
344
+ }
345
+ }
346
+ export function createGatewayStatsTracker(startedAt = Date.now()) {
347
+ let resetAt = startedAt;
348
+ let totalRequests = 0;
349
+ let searchRequests = 0;
350
+ let searchSuccesses = 0;
351
+ let fetchRequests = 0;
352
+ let fetchSuccesses = 0;
353
+ let successCount = 0;
354
+ let errorCount = 0;
355
+ let backfillRequests = 0;
356
+ let backfillItemsSucceeded = 0;
357
+ let backfillItemsFailed = 0;
358
+ const providers = new Map();
359
+ function ensureProvider(id) {
360
+ let entry = providers.get(id);
361
+ if (!entry) {
362
+ entry = {
363
+ search: emptyCapabilityStats(),
364
+ extract: emptyCapabilityStats(),
365
+ };
366
+ providers.set(id, entry);
367
+ }
368
+ return entry;
369
+ }
370
+ return {
371
+ recordRequest(info) {
372
+ totalRequests += 1;
373
+ if (info.route === "search") {
374
+ searchRequests += 1;
375
+ if (info.ok)
376
+ searchSuccesses += 1;
377
+ }
378
+ else {
379
+ fetchRequests += 1;
380
+ if (info.ok)
381
+ fetchSuccesses += 1;
382
+ }
383
+ if (info.ok) {
384
+ successCount += 1;
385
+ }
386
+ else {
387
+ errorCount += 1;
388
+ }
389
+ const capability = info.route === "search" ? "search" : "extract";
390
+ for (const attempt of info.attempts ?? []) {
391
+ const providerStats = ensureProvider(attempt.provider);
392
+ applyAttemptToCapabilityStats(providerStats[capability], attempt, info.at);
393
+ }
394
+ if (info.contentBackfill) {
395
+ backfillRequests += 1;
396
+ backfillItemsSucceeded += info.contentBackfill.succeededCount;
397
+ backfillItemsFailed += info.contentBackfill.failedCount;
398
+ for (const item of info.contentBackfill.items) {
399
+ if (item.attempts && item.attempts.length > 0) {
400
+ for (const attempt of item.attempts) {
401
+ const providerStats = ensureProvider(attempt.provider);
402
+ applyAttemptToCapabilityStats(providerStats.extract, attempt, info.at);
403
+ }
404
+ }
405
+ else if (item.provider &&
406
+ (item.status === "ok" || item.status === "failed")) {
407
+ const providerStats = ensureProvider(item.provider);
408
+ applyAttemptToCapabilityStats(providerStats.extract, {
409
+ provider: item.provider,
410
+ status: item.status,
411
+ durationMs: item.durationMs,
412
+ ...(item.errorCode ? { errorCode: item.errorCode } : {}),
413
+ }, info.at);
414
+ }
415
+ }
416
+ }
417
+ },
418
+ snapshot() {
419
+ const providerOut = {};
420
+ for (const [id, entry] of providers.entries()) {
421
+ providerOut[id] = {
422
+ search: {
423
+ ...entry.search,
424
+ errorCodes: { ...entry.search.errorCodes },
425
+ },
426
+ extract: {
427
+ ...entry.extract,
428
+ errorCodes: { ...entry.extract.errorCodes },
429
+ },
430
+ };
431
+ }
432
+ return {
433
+ startedAt,
434
+ resetAt,
435
+ totalRequests,
436
+ searchRequests,
437
+ searchSuccesses,
438
+ fetchRequests,
439
+ fetchSuccesses,
440
+ successCount,
441
+ errorCount,
442
+ backfillRequests,
443
+ backfillItemsSucceeded,
444
+ backfillItemsFailed,
445
+ providers: providerOut,
446
+ };
447
+ },
448
+ reset(now = Date.now()) {
449
+ resetAt = now;
450
+ totalRequests = 0;
451
+ searchRequests = 0;
452
+ searchSuccesses = 0;
453
+ fetchRequests = 0;
454
+ fetchSuccesses = 0;
455
+ successCount = 0;
456
+ errorCount = 0;
457
+ backfillRequests = 0;
458
+ backfillItemsSucceeded = 0;
459
+ backfillItemsFailed = 0;
460
+ providers.clear();
84
461
  },
85
462
  };
86
463
  }
@@ -1 +1 @@
1
- {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/gateway/records.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/gateway/records.ts"],"names":[],"mappings":"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"}