lasso-mcp 1.14.0 → 1.16.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.
- package/ARCHITECTURE.md +3 -3
- package/README.de.md +7 -6
- package/README.en.md +7 -6
- package/README.es.md +7 -6
- package/README.fr.md +7 -6
- package/README.ja.md +7 -6
- package/README.md +16 -6
- package/README.pt.md +7 -6
- package/README.ru.md +7 -6
- package/dist/browse/content-type-router.d.ts.map +1 -1
- package/dist/browse/content-type-router.js +3 -0
- package/dist/browse/content-type-router.js.map +1 -1
- package/dist/browse/markdown-extractor.d.ts +14 -0
- package/dist/browse/markdown-extractor.d.ts.map +1 -1
- package/dist/browse/markdown-extractor.js +23 -6
- package/dist/browse/markdown-extractor.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +12 -29
- package/dist/config/config.js.map +1 -1
- package/dist/config/providers.d.ts +21 -40
- package/dist/config/providers.d.ts.map +1 -1
- package/dist/config/providers.js +19 -52
- package/dist/config/providers.js.map +1 -1
- package/dist/doctor/doctor.d.ts +1 -1
- package/dist/doctor/doctor.js +4 -3
- package/dist/doctor/doctor.js.map +1 -1
- package/dist/index.js +52 -44
- package/dist/index.js.map +1 -1
- package/dist/search/FallbackChain.d.ts +9 -7
- package/dist/search/FallbackChain.d.ts.map +1 -1
- package/dist/search/FallbackChain.js +3 -2
- package/dist/search/FallbackChain.js.map +1 -1
- package/dist/search/MachineMcpDetector.d.ts.map +1 -1
- package/dist/search/MachineMcpDetector.js +2 -1
- package/dist/search/MachineMcpDetector.js.map +1 -1
- package/dist/search/SearchCache.d.ts.map +1 -1
- package/dist/search/SearchCache.js +23 -1
- package/dist/search/SearchCache.js.map +1 -1
- package/dist/serp/http-serp.d.ts +117 -0
- package/dist/serp/http-serp.d.ts.map +1 -0
- package/dist/serp/http-serp.js +314 -0
- package/dist/serp/http-serp.js.map +1 -0
- package/dist/tools/annotations.d.ts +14 -0
- package/dist/tools/annotations.d.ts.map +1 -1
- package/dist/tools/annotations.js +20 -0
- package/dist/tools/annotations.js.map +1 -1
- package/dist/tools/descriptions.d.ts +20 -0
- package/dist/tools/descriptions.d.ts.map +1 -1
- package/dist/tools/descriptions.js +64 -14
- package/dist/tools/descriptions.js.map +1 -1
- package/dist/tools/fetch-feed.d.ts +97 -0
- package/dist/tools/fetch-feed.d.ts.map +1 -0
- package/dist/tools/fetch-feed.js +325 -0
- package/dist/tools/fetch-feed.js.map +1 -0
- package/dist/tools/search.d.ts +40 -27
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +94 -48
- package/dist/tools/search.js.map +1 -1
- package/dist/types.d.ts +6 -4
- package/dist/types.d.ts.map +1 -1
- package/doc/22-Bing/346/270/205/351/231/244/344/270/216serp_http/parse22.md +184 -0
- package/doc/22-Bing/346/270/205/351/231/244/344/270/216serp_http/verify.md +102 -0
- package/doc/23-/346/226/271/346/263/225/350/256/272/346/243/200/350/256/250-/346/220/234/347/264/242/344/274/230/345/214/226/345/244/261/346/225/210.md +54 -0
- package/doc/23a-03/346/270/205/345/215/225/345/273/272/350/256/256-/346/226/271/346/263/225/350/256/272/346/243/200/350/256/250.md +33 -0
- package/doc/24-/351/242/240/350/246/206/346/200/247/350/260/203/347/240/224/decision-interaction-upgrade.md +55 -0
- package/doc/24-/351/242/240/350/246/206/346/200/247/350/260/203/347/240/224/decision-local-search.md +61 -0
- package/doc/24-/351/242/240/350/246/206/346/200/247/350/260/203/347/240/224/decision-search-layer.md +80 -0
- package/doc/24-/351/242/240/350/246/206/346/200/247/350/260/203/347/240/224/red-team.md +142 -0
- package/doc/24-/351/242/240/350/246/206/346/200/247/350/260/203/347/240/224/scan-agent-api.md +200 -0
- package/doc/24-/351/242/240/350/246/206/346/200/247/350/260/203/347/240/224/scan-edge.md +214 -0
- package/doc/24-/351/242/240/350/246/206/346/200/247/350/260/203/347/240/224/scan-mcp-proto.md +198 -0
- package/doc/24-/351/242/240/350/246/206/346/200/247/350/260/203/347/240/224/scan-model-native.md +184 -0
- package/doc/24-/351/242/240/350/246/206/346/200/247/350/260/203/347/240/224/verdict.md +145 -0
- package/doc/24-/351/242/240/350/246/206/346/200/247/350/260/203/347/240/224/zero-base.md +281 -0
- package/doc/KEY-GUIDE.md +2 -2
- package/doc/SELECTOR-MAINTENANCE.md +1 -1
- package/doc/TROUBLESHOOTING.md +2 -2
- package/package.json +1 -1
- package/src/browse/content-type-router.ts +3 -0
- package/src/browse/markdown-extractor.ts +27 -6
- package/src/config/config.ts +12 -29
- package/src/config/providers.ts +22 -57
- package/src/doctor/doctor.ts +4 -3
- package/src/index.ts +54 -46
- package/src/invariants/check-invariants.mjs +60 -37
- package/src/search/FallbackChain.ts +9 -8
- package/src/search/MachineMcpDetector.ts +2 -1
- package/src/search/SearchCache.ts +24 -1
- package/src/serp/http-serp.ts +434 -0
- package/src/tools/annotations.ts +21 -0
- package/src/tools/descriptions.ts +65 -14
- package/src/tools/fetch-feed.ts +463 -0
- package/src/tools/search.ts +99 -50
- package/src/types.ts +6 -4
- package/vitest.workspace.ts +1 -0
- package/src/channels/BingChannel.ts +0 -335
package/ARCHITECTURE.md
CHANGED
|
@@ -53,7 +53,7 @@ Lasso 是 Claude Code 的**全交互**对外抓手 MCP(浏览器 + 桌面)
|
|
|
53
53
|
└──────────────────────────────┬─────────────────────────────────┘
|
|
54
54
|
┌───────────────────────┼───────────────────────┐
|
|
55
55
|
▼ ▼ ▼
|
|
56
|
-
chrome-devtools-mcp 智谱/Brave/
|
|
56
|
+
chrome-devtools-mcp 智谱/Brave/SERP 兜底 lasso-rust-helper
|
|
57
57
|
@1.7.0(--headless / 兜底(search 多引擎 (macOS AXAPI +
|
|
58
58
|
--browser-url / Steel 经 HTTP;machine_mcp cgEvent;Windows UIA;
|
|
59
59
|
CDP / --wsEndpoint) 复用打头) Linux AT-SPI)
|
|
@@ -237,7 +237,7 @@ Lasso 明确**不做**以下事情:
|
|
|
237
237
|
CC → search("rust async 最新动态", freshness="week")
|
|
238
238
|
→ SearchChannel.run()
|
|
239
239
|
→ FallbackChain: machine_mcp(本机已配智谱 MCP 自动复用,最高优先)
|
|
240
|
-
→ 智谱 → Brave
|
|
240
|
+
→ 智谱 → Brave(Bing 源已随上游 2025-08-11 退役移除,v1.15 Phase A)
|
|
241
241
|
→ SERP 实搜兜底(query 语言分流:CJK→百度,非 CJK→DuckDuckGo 纯 HTML 端点,零 Key;
|
|
242
242
|
DDG 跳转壳 uddg= 自动解包)
|
|
243
243
|
→ Wayback → RecordingStore replay
|
|
@@ -295,7 +295,7 @@ $ lasso launch-chrome
|
|
|
295
295
|
| markdown 抽取 | src/browse/markdown-extractor.ts(defuddle 双激活 + turndown 降级保底) | — |
|
|
296
296
|
| desktop 四档 | src/desktop/{AxProvider,AxBackend,AxBackendFactory,OutlineMapper,CGEventProvider,ScreenshotVlmProvider}.ts | AxProvider ~330 |
|
|
297
297
|
| FallbackDecider | src/fallback/FallbackDecider.ts | ~280 |
|
|
298
|
-
| 搜索 | src/search/{SearchCache,MultiSourceFanout}.ts;src/channels/{
|
|
298
|
+
| 搜索 | src/search/{SearchCache,MultiSourceFanout}.ts;src/channels/{SearchChannel,BraveChannel}.ts(BingChannel 已删:Bing API 2025-08-11 退役,v1.15 Phase A 死层清除);src/serp/extract.ts(DDG→Brave 级联/百度兜底,v1.14 S-4) | — |
|
|
299
299
|
| Launcher | src/launcher/{launch-chrome,chrome-paths}.ts(INV-64 不引新 npm dep) | ~200 |
|
|
300
300
|
| Doctor | src/doctor/doctor.ts(39 项 check;#21 event-synthesis / #36 machine_mcp / #37 steel / #38 creepjs / #39 stagehand / proxy_config) | ~2900 |
|
|
301
301
|
| Invariants | src/invariants/check-invariants.mjs(79 条 INV) | ~4200 |
|
package/README.de.md
CHANGED
|
@@ -122,7 +122,7 @@ Gruppiert nach **dem, was du tun willst**, nicht nach Werkzeugname. Jedes ist ei
|
|
|
122
122
|
|
|
123
123
|
> Du: „Suche nach X" → strukturierte Suchergebnisse
|
|
124
124
|
|
|
125
|
-
Standard ist Zhipu (stark für Chinesisch); für Multiple-Quellen kannst du zusätzlich Brave konfigurieren (der Bing-Upstream ist eingestellt
|
|
125
|
+
Standard ist Zhipu (stark für Chinesisch); für Multiple-Quellen kannst du zusätzlich Brave konfigurieren (der Bing-Upstream ist eingestellt und die tote Schicht entfernt; der Konfigurationsschlüssel wird toleriert, aber stillschweigend ignoriert). **Wenn eine einzelne Quelle rate-limitiert oder down ist, wird automatisch zur nächsten gewechselt — du merkst nichts davon.** Das Ausschöpfen des kostenlosen Kontingents eines Anbieters bringt nicht das Ganze zum Absturz.
|
|
126
126
|
|
|
127
127
|
Für zeitkritisches Material wie **Nachrichten und Release-Tracking** sag einfach „suche nach X der letzten Woche / des letzten Monats" — der Zeitfilter (day / week / month / year, v1.11) wird automatisch mitgegeben, ohne handgeschriebene Daten in der Anfrage.
|
|
128
128
|
|
|
@@ -194,7 +194,7 @@ Geht zum Internet Archive (Wayback Machine), um die zuletzt archivierte Kopie di
|
|
|
194
194
|
|
|
195
195
|
## Installation
|
|
196
196
|
|
|
197
|
-
**Aktuelle Version v1.
|
|
197
|
+
**Aktuelle Version v1.15.0** (Changelog im eingeklappten Block am Ende dieses Abschnitts).
|
|
198
198
|
|
|
199
199
|
Voraussetzungen: Node.js ≥ 20 + Claude Code (oder jeder MCP-fähige Client).
|
|
200
200
|
|
|
@@ -207,7 +207,9 @@ Claude Code neu starten → `/mcp` → `lasso ✓ Connected`. **Genau diese eine
|
|
|
207
207
|
**macOS-Nutzer, die den Desktop steuern wollen**: führ einmal `lasso doctor` aus und setze `lasso-rust-helper` nach Anweisung die Haken bei „Bedienungshilfen" und „Bildschirmaufnahme" — `doctor` führt dich Schritt für Schritt.
|
|
208
208
|
|
|
209
209
|
<details>
|
|
210
|
-
<summary>📋 Changelog (v1.8 → v1.
|
|
210
|
+
<summary>📋 Changelog (v1.8 → v1.15 — aufklappen, um zu sehen, was jede Version geändert hat)</summary>
|
|
211
|
+
|
|
212
|
+
- **v1.15**: Bing-Totschicht komplett entfernt (Bing Search APIs zum 2025-08-11 vollständig eingestellt — Code gelöscht, nicht nur dokumentiert; restliches `BING_API_KEYS` wird stillschweigend ignoriert, `lasso doctor` rät zum Entfernen) + **bare-HTTP-Schnellsonde** vor dem Headless-Browser (fallen alle API-Ebenen aus, wird zuerst ~1s lang ohne Browser die Ergebnisseite geholt; erst bei Leerfund startet der langsame Headless-Pfad — Realmaschine: 20 Treffer in 1,9s gegenüber 5,3s im Headless-Pfad mit Captcha und null Treffern; weiche Blockseiten wie Baidus Captcha/Homepage-Hülle fälschen keinen Erfolg und eskalieren zum Browser).
|
|
211
213
|
|
|
212
214
|
- **v1.14**: Betriebsfakten-Schuldensuche beglichen (Brave-Quotenbuch auf das $5-Monatsguthaben ≈1000 Anfragen/Monat ausgerichtet; `free_only=L2` behandelt volumenabgerechnetes Brave nicht mehr als Free-Tier; Bing-Quote auf null) + zweimotoriger Zero-Key-English-Fallback (DDG-Fehler/Leer kaskadiert zu einem Brave-SERP-Versuch); `lasso doctor --deep` (Brave-Plan-Level-Sonde, verbraucht 1 Quoteneinheit) + statischer Bing-Einstellungshinweis; KEY-GUIDE-Frischedatierung (jede Key-Angabe trägt „zuletzt verifiziert"-Datum und 90-Tage-Recheck-Trigger).
|
|
213
215
|
- **v1.13**: konsistenter Sprach-Fingerabdruck des Headless-Browsers (HTTP-`Accept-Language` wird mit dem Profil mitgegeben; der Widerspruch „Header zh-CN ↔ Seite en-US" ist beseitigt); korrigierter VLM-Landepunkt bei Regions-Screenshots; `desktop find` lehnt reine ref-Abfragen ab; Freigeben von Steel-Sessions mit 3-Sekunden-Grenze (hängendes Steel blockiert den Exit nicht mehr 5 Minuten lang).
|
|
@@ -255,12 +257,11 @@ Speichern genügt, dann greift es. **Stabiler gewollt**: füge zusätzlich Brave
|
|
|
255
257
|
```json
|
|
256
258
|
{
|
|
257
259
|
"ZHIPU_API_KEY": "your_zhipu_key",
|
|
258
|
-
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
259
|
-
"BING_API_KEYS": "bingkey1"
|
|
260
|
+
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
260
261
|
}
|
|
261
262
|
```
|
|
262
263
|
|
|
263
|
-
> Degradationsreihenfolge: Maschinen-MCP-Wiederverwendung → Zhipu → Brave →
|
|
264
|
+
> Degradationsreihenfolge: Maschinen-MCP-Wiederverwendung → Zhipu → Brave → Live-Suche im Headless-Browser als Schluss-Fallback (v1.14: zweimotoriger englischer Fallback — bei DDG-Fehler/Leertreffer wird automatisch einmal per Brave-Live-Suche erneut versucht; v1.15 schaltet davor eine **bare-HTTP-Schnellsonde** (~1s, holt die Ergebnisseite ganz ohne Browser — in Realmaschine-Tests sind manche Engines gegenüber browserlosen Clients weniger misstrauisch); erst wenn sie nichts liefert, startet der langsame Headless-Pfad). Fällt der vordere aus, wird automatisch zum nächsten gewechselt. (Die Bing-Quelle wurde nach der Upstream-Einstellung am 2025-08-11 komplett entfernt; ein restliches `BING_API_KEYS` wird stillschweigend ignoriert, `lasso doctor` schlägt das Entfernen vor.)
|
|
264
265
|
|
|
265
266
|
Wie du Keys beantragst, wie hoch die kostenlosen Kontingente sind → [Key-Konfigurationsleitfaden · Suche](./doc/KEY-GUIDE.md#a-搜索). Häufige Befehle: `lasso --version` / `lasso --help` (seit v1.8 drucken unbekannte Befehle die Nutzung und beenden mit Nonzero-Code, statt stumm zu hängen).
|
|
266
267
|
|
package/README.en.md
CHANGED
|
@@ -122,7 +122,7 @@ Grouped by **what you want to do**, not by tool name. Each is one sentence in, o
|
|
|
122
122
|
|
|
123
123
|
> You: "Search for X" → structured search results
|
|
124
124
|
|
|
125
|
-
Defaults to Zhipu (strong for Chinese); you can add Brave as a second source (the Bing upstream has been shut down; the config key is
|
|
125
|
+
Defaults to Zhipu (strong for Chinese); you can add Brave as a second source (the Bing upstream has been shut down and its dead layer removed; the config key is tolerated but silently ignored). **If any single source is rate-limited or down, it auto-switches to the next — you don't feel a thing.** Hitting one provider's free quota doesn't break the whole.
|
|
126
126
|
|
|
127
127
|
For time-sensitive content like **news and release tracking**, just say "search for X from the last week / last month" — a time filter is applied automatically (day / week / month / year, v1.11), no hand-written dates in your query.
|
|
128
128
|
|
|
@@ -194,7 +194,7 @@ Goes to the Internet Archive (Wayback Machine) to find the last archived copy of
|
|
|
194
194
|
|
|
195
195
|
## Install
|
|
196
196
|
|
|
197
|
-
**Current version v1.
|
|
197
|
+
**Current version v1.15.0** (changelog in the collapsed block at the end of this section).
|
|
198
198
|
|
|
199
199
|
Prerequisites: Node.js ≥ 20 + Claude Code (or any MCP-capable client).
|
|
200
200
|
|
|
@@ -207,7 +207,9 @@ Restart Claude Code → `/mcp` → `lasso ✓ Connected`. **That's the one line
|
|
|
207
207
|
**macOS users wanting desktop control**: run `lasso doctor` once and tick `lasso-rust-helper` for "Accessibility" and "Screen Recording" as prompted — `doctor` walks you through it step by step.
|
|
208
208
|
|
|
209
209
|
<details>
|
|
210
|
-
<summary>📋 Changelog (v1.8 → v1.
|
|
210
|
+
<summary>📋 Changelog (v1.8 → v1.15 — click to see what each version changed)</summary>
|
|
211
|
+
|
|
212
|
+
- **v1.15**: Bing dead layer removed outright (Bing Search APIs fully retired 2025-08-11 — code deleted, not just documented; leftover `BING_API_KEYS` silently ignored, `lasso doctor` suggests removal) + a **bare-HTTP quick probe** before the headless browser (when all API layers are down, a browserless fetch of the results page runs first in ~1s; only if it comes up empty does the slow headless path start — real-machine test: 20 results in 1.9s vs the headless path's 5.3s with a captcha and zero results; soft-block pages such as Baidu's captcha/homepage shell never fake success and escalate to the browser).
|
|
211
213
|
|
|
212
214
|
- **v1.14**: search operational-facts debt cleared (Brave quota ledger aligned to the $5 monthly credit ≈1000 queries/month; `free_only=L2` no longer routes metered Brave as a free tier; Bing quota zeroed) + dual-engine zero-key English fallback (DDG failure/empty cascades to a Brave SERP attempt); `lasso doctor --deep` (Brave plan-level probe, consumes 1 unit of quota) + static Bing-retirement notice; KEY-GUIDE freshness-dating system (every key claim carries a "last verified" date and a 90-day recheck trigger).
|
|
213
215
|
- **v1.13**: consistent language fingerprint for the headless browser (HTTP `Accept-Language` issued with the profile, removing the "header zh-CN ↔ page en-US" contradiction); fixed the VLM landing point for region screenshots; `desktop find` rejects pure-ref queries; Steel session release capped at 3 seconds (a stalled Steel no longer hangs exit for 5 minutes).
|
|
@@ -255,12 +257,11 @@ Takes effect on save. **For more stability**, add Brave too (a paid plan that in
|
|
|
255
257
|
```json
|
|
256
258
|
{
|
|
257
259
|
"ZHIPU_API_KEY": "your_zhipu_key",
|
|
258
|
-
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
259
|
-
"BING_API_KEYS": "bingkey1"
|
|
260
|
+
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
260
261
|
}
|
|
261
262
|
```
|
|
262
263
|
|
|
263
|
-
> Fallback order: machine MCP reuse → Zhipu → Brave →
|
|
264
|
+
> Fallback order: machine MCP reuse → Zhipu → Brave → live search in the headless browser as the last resort (v1.14: dual-engine English fallback — a DDG failure/empty result automatically retries once via Brave live search; v1.15 adds a **bare-HTTP quick probe** (~1s, fetches the results page with no browser at all — in real-machine tests some engines are less suspicious of browserless clients) before the slow headless path). If the one ahead fails, it auto-switches to the next. (The Bing source was removed outright after the upstream retired it on 2025-08-11; leftover `BING_API_KEYS` is silently ignored and `lasso doctor` will suggest removing it.)
|
|
264
265
|
|
|
265
266
|
How to apply for keys, how big the free tiers are → [Key Configuration Guide · Search](./doc/KEY-GUIDE.md#a-搜索). Common commands: `lasso --version` / `lasso --help` (since v1.8, unknown commands print usage and exit non-zero instead of silently hanging).
|
|
266
267
|
|
package/README.es.md
CHANGED
|
@@ -122,7 +122,7 @@ Agrupado por **lo que quieres hacer**, no por nombre de herramienta. Cada uno: u
|
|
|
122
122
|
|
|
123
123
|
> Tú: "Busca X" → resultados estructurados de búsqueda
|
|
124
124
|
|
|
125
|
-
Por defecto Zhipu (fuerte para chino); puedes añadir Brave además como multi-fuente (el upstream de Bing ya está cerrado; la clave de configuración se
|
|
125
|
+
Por defecto Zhipu (fuerte para chino); puedes añadir Brave además como multi-fuente (el upstream de Bing ya está cerrado y su capa muerta eliminada; la clave de configuración se tolera pero se ignora silenciosamente). **Si una fuente está con rate-limit o caída, cambia automáticamente a la siguiente — no te enteras.** Agotar la cuota gratis de un proveedor no rompe todo el conjunto.
|
|
126
126
|
|
|
127
127
|
Para contenido sensible al tiempo como **noticias y seguimiento de versiones**, di directamente "busca X de la última semana / del último mes" — el filtro de frescura (day / week / month / year, v1.11) se aplica automáticamente, sin fechas escritas a mano en la consulta.
|
|
128
128
|
|
|
@@ -194,7 +194,7 @@ Acude al Internet Archive (Wayback Machine) para encontrar la última copia arch
|
|
|
194
194
|
|
|
195
195
|
## Instalar
|
|
196
196
|
|
|
197
|
-
**Versión actual v1.
|
|
197
|
+
**Versión actual v1.15.0** (changelog en el bloque plegado al final de esta sección).
|
|
198
198
|
|
|
199
199
|
Requisitos previos: Node.js ≥ 20 + Claude Code (o cualquier cliente compatible con MCP).
|
|
200
200
|
|
|
@@ -207,7 +207,9 @@ Reinicia Claude Code → `/mcp` → `lasso ✓ Connected`. **Solo esta línea, s
|
|
|
207
207
|
**Usuarios de macOS que quieren controlar el escritorio**: ejecuta `lasso doctor` una vez y marca `lasso-rust-helper` en "Accessibility" y "Screen Recording" siguiendo las indicaciones — `doctor` te guía paso a paso.
|
|
208
208
|
|
|
209
209
|
<details>
|
|
210
|
-
<summary>📋 Changelog (v1.8 → v1.
|
|
210
|
+
<summary>📋 Changelog (v1.8 → v1.15 — despliega para ver qué cambió en cada versión)</summary>
|
|
211
|
+
|
|
212
|
+
- **v1.15**: capa muerta de Bing eliminada por completo (Bing Search APIs retirado por completo el 2025-08-11 — código borrado, no solo documentado; un `BING_API_KEYS` residual se ignora silenciosamente y `lasso doctor` sugiere eliminarlo) + **sonda rápida de HTTP puro** antes del navegador headless (si todas las capas de API caen, primero se descarga la página de resultados sin navegador en ~1s; solo si sale vacía arranca la ruta lenta — prueba real: 20 resultados en 1,9s frente a 5,3s de la ruta headless con captcha y cero resultados; las páginas de bloqueo blando como el captcha/portada de Baidu nunca falsifican éxito y escalan al navegador).
|
|
211
213
|
|
|
212
214
|
- **v1.14**: deuda de hechos operativos de búsqueda saldada (libro de cuotas de Brave alineado al crédito mensual de $5 ≈1000 consultas/mes; `free_only=L2` ya no enruta el Brave medido como nivel gratuito; cuota de Bing a cero) + fallback inglés sin key de doble motor (fallo/vacío de DDG cascada a un intento Brave SERP); `lasso doctor --deep` (sonda de nivel de plan de Brave, consume 1 unidad de cuota) + aviso estático de retiro de Bing; sistema de fechado de frescura en KEY-GUIDE (cada afirmación de key lleva fecha de "última verificación" y disparador de reverificación a 90 días).
|
|
213
215
|
- **v1.13**: huella de idioma consistente en el navegador headless (el HTTP `Accept-Language` se emite con el perfil; eliminada la contradicción "cabecera zh-CN ↔ página en-US"); corregido el punto de aterrizaje del VLM en capturas por región; `desktop find` rechaza consultas de solo ref; liberación de sesiones Steel con tope de 3 segundos (Steel colgado ya no bloquea la salida 5 minutos).
|
|
@@ -255,12 +257,11 @@ Al guardar surte efecto. **¿Más estabilidad?** Añade también Brave (plan de
|
|
|
255
257
|
```json
|
|
256
258
|
{
|
|
257
259
|
"ZHIPU_API_KEY": "your_zhipu_key",
|
|
258
|
-
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
259
|
-
"BING_API_KEYS": "bingkey1"
|
|
260
|
+
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
260
261
|
}
|
|
261
262
|
```
|
|
262
263
|
|
|
263
|
-
> Orden de degradación: reutilización del MCP de la máquina → Zhipu → Brave →
|
|
264
|
+
> Orden de degradación: reutilización del MCP de la máquina → Zhipu → Brave → búsqueda real en el navegador headless como remate (v1.14: fallback inglés de doble motor — un fallo o vacío de DDG reintenta automáticamente una vez con búsqueda real de Brave; v1.15 añade antes una **sonda rápida de HTTP puro** (~1s, descarga la página de resultados sin ningún navegador — en pruebas reales algunos motores desconfían menos de clientes sin navegador); solo si no encuentra nada arranca la ruta lenta del navegador). Si falla el anterior, pasa automáticamente al siguiente. (La fuente Bing se eliminó por completo tras el retiro del upstream el 2025-08-11; un `BING_API_KEYS` residual se ignora silenciosamente y `lasso doctor` sugiere eliminarlo.)
|
|
264
265
|
|
|
265
266
|
Cómo solicitar keys, cuánta cuota gratis hay → [Guía de configuración de keys · Búsqueda](./doc/KEY-GUIDE.md#a-搜索). Comandos habituales: `lasso --version` / `lasso --help` (desde v1.8, los comandos desconocidos imprimen el uso y terminan con código distinto de cero, en vez de colgarse en silencio).
|
|
266
267
|
|
package/README.fr.md
CHANGED
|
@@ -122,7 +122,7 @@ Groupé par **ce que vous voulez faire**, pas par nom d'outil. Chaque entrée :
|
|
|
122
122
|
|
|
123
123
|
> Vous : « Cherche X » → résultats de recherche structurés
|
|
124
124
|
|
|
125
|
-
Zhipu par défaut (fort pour le chinois) ; vous pouvez aussi configurer Brave en multi-source (l'amont Bing est fermé ; la clé de configuration est
|
|
125
|
+
Zhipu par défaut (fort pour le chinois) ; vous pouvez aussi configurer Brave en multi-source (l'amont Bing est fermé et sa couche morte supprimée ; la clé de configuration est tolérée mais silencieusement ignorée). **Si l'une des sources atteint sa limite ou tombe en panne, bascule automatique sur la suivante — vous ne sentez rien.** Atteindre le quota gratuit d'un fournisseur ne casse pas l'ensemble.
|
|
126
126
|
|
|
127
127
|
Pour les contenus **d'actualité — nouvelles, mouvements de versions**, dites simplement « cherche le X de la dernière semaine / du dernier mois » : le filtre de fraîcheur s'applique automatiquement (day / week / month / year, v1.11), sans écrire de dates à la main dans la requête.
|
|
128
128
|
|
|
@@ -194,7 +194,7 @@ Va à l'Internet Archive (Wayback Machine) pour retrouver la dernière copie arc
|
|
|
194
194
|
|
|
195
195
|
## Installer
|
|
196
196
|
|
|
197
|
-
**Version actuelle v1.
|
|
197
|
+
**Version actuelle v1.15.0** (journal des versions dans le bloc replié en fin de section).
|
|
198
198
|
|
|
199
199
|
Prérequis : Node.js ≥ 20 + Claude Code (ou tout client compatible MCP).
|
|
200
200
|
|
|
@@ -207,7 +207,9 @@ Redémarrez Claude Code → `/mcp` → `lasso ✓ Connected`. **C'est tout, une
|
|
|
207
207
|
**Contrôle du bureau sur macOS** : lancez `lasso doctor` une fois et suivez les invites pour cocher `lasso-rust-helper` sous « Accessibilité » et « Capture d'écran » — `doctor` vous guide pas à pas.
|
|
208
208
|
|
|
209
209
|
<details>
|
|
210
|
-
<summary>📋 Journal des versions (v1.8 → v1.
|
|
210
|
+
<summary>📋 Journal des versions (v1.8 → v1.15, cliquez pour voir les changements de chaque version)</summary>
|
|
211
|
+
|
|
212
|
+
- **v1.15** : couche morte de Bing retirée entièrement (Bing Search APIs retiré totalement le 2025-08-11 — code supprimé, pas seulement documenté ; un `BING_API_KEYS` restant est ignoré silencieusement, `lasso doctor` propose sa suppression) + **sonde rapide HTTP brut** avant le navigateur headless (si toutes les couches API tombent, une récupération sans navigateur de la page de résultats tourne d'abord en ~1s ; seulement si elle revient vide, le chemin lent démarre — test réel : 20 résultats en 1,9s contre 5,3s pour le chemin headless avec captcha et zéro résultat ; les pages de blocage doux comme le captcha/page d'accueil de Baidu ne truquent jamais un succès et escaladent vers le navigateur).
|
|
211
213
|
|
|
212
214
|
- **v1.14** : dette de faits opérationnels de recherche soldée (registre de quota Brave aligné sur le crédit mensuel de 5 $ ≈1000 requêtes/mois ; `free_only=L2` ne route plus le Brave facturé à l'usage comme niveau gratuit ; quota Bing à zéro) + repli anglais sans clé à double moteur (échec/vide DDG en cascade vers une tentative Brave SERP) ; `lasso doctor --deep` (sonde de niveau de plan Brave, consomme 1 unité de quota) + avis statique de retrait Bing ; système de datation de fraîcheur du KEY-GUIDE (chaque affirmation de clé porte une date de « dernière vérification » et un déclencheur de revérification à 90 jours).
|
|
213
215
|
- **v1.13** : cohérence de l'empreinte linguistique du navigateur headless (l'en-tête HTTP `Accept-Language` suit le profil, fin de la contradiction « en-tête zh-CN ↔ page en-US ») ; correction du point d'impact des captures VLM avec région ; `desktop find` rejette les requêtes en ref pur ; la libération de session Steel reçoit une borne de 3 secondes (un Steel à l'arrêt ne bloque plus la sortie pendant 5 minutes).
|
|
@@ -255,12 +257,11 @@ Enregistrez et c'est actif. **Pour plus de robustesse**, ajoutez aussi Brave (pl
|
|
|
255
257
|
```json
|
|
256
258
|
{
|
|
257
259
|
"ZHIPU_API_KEY": "your_zhipu_key",
|
|
258
|
-
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
259
|
-
"BING_API_KEYS": "bingkey1"
|
|
260
|
+
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
260
261
|
}
|
|
261
262
|
```
|
|
262
263
|
|
|
263
|
-
> Ordre de repli : réutilisation du MCP machine → Zhipu → Brave →
|
|
264
|
+
> Ordre de repli : réutilisation du MCP machine → Zhipu → Brave → recherche réelle en navigateur headless en dernier repli (v1.14 : repli anglais à double moteur — un échec ou vide du DDG relance automatiquement une tentative via la recherche réelle Brave ; v1.15 ajoute avant une **sonde rapide HTTP brut** (~1s, récupère la page de résultats sans aucun navigateur — en tests réels certains moteurs se méfient moins des clients sans navigateur) ; seulement si elle ne trouve rien, le chemin lent du navigateur démarre). Le premier qui échoue cède la place au suivant. (La source Bing a été retirée entièrement après le retrait amont du 2025-08-11 ; un `BING_API_KEYS` restant est ignoré silencieusement et `lasso doctor` proposera de le supprimer.)
|
|
264
265
|
|
|
265
266
|
Comment demander une clé, tailles des paliers gratuits → [Guide de configuration des clés · Recherche](./doc/KEY-GUIDE.md#a-搜索). Commandes utiles : `lasso --version` / `lasso --help` (depuis la v1.8, une commande inconnue affiche l'usage et sort avec un code non nul — fini le blocage silencieux).
|
|
266
267
|
|
package/README.ja.md
CHANGED
|
@@ -122,7 +122,7 @@ Claude Code を再起動 → `/mcp` → `lasso ✓ Connected` と表示されれ
|
|
|
122
122
|
|
|
123
123
|
> あなた:「X を検索して」→ 構造化された検索結果
|
|
124
124
|
|
|
125
|
-
デフォルトは Zhipu(中国語に強い)。さらに Brave を追加してマルチソース化も可能(Bing
|
|
125
|
+
デフォルトは Zhipu(中国語に強い)。さらに Brave を追加してマルチソース化も可能(Bing の上流はすでに停止し死層も削除済み——設定キーは残しても黙って無視されます)。**いずれかのソースがレート制限や障害で使えなくなっても、自動で次に切り替わります——ユーザーは何も感じません。** 一つのプロバイダーの無料枠を使い切っても、全体が止まることはありません。
|
|
126
126
|
|
|
127
127
|
**ニュースやバージョン動向**のような時間感度の高い内容を調べたいときは、「直近 1 週間 / 直近 1 ヶ月の X を検索して」とそのまま言えば OK——時効フィルタ(day / week / month / year、v1.11)が自動で付き、クエリに日付を手書きする必要はありません。
|
|
128
128
|
|
|
@@ -194,7 +194,7 @@ Internet Archive(Wayback Machine)に飛んで、その URL の最後にア
|
|
|
194
194
|
|
|
195
195
|
## インストール
|
|
196
196
|
|
|
197
|
-
**現在のバージョン v1.
|
|
197
|
+
**現在のバージョン v1.15.0**(更新履歴はこの節末尾の折りたたみブロックにあります)。
|
|
198
198
|
|
|
199
199
|
前提条件:Node.js ≥ 20 + Claude Code(または MCP 対応の任意のクライアント)。
|
|
200
200
|
|
|
@@ -207,7 +207,9 @@ Claude Code を再起動 → `/mcp` → `lasso ✓ Connected`。**これ一行
|
|
|
207
207
|
**macOS でデスクトップ操作を使いたい場合**:`lasso doctor` を一度実行し、案内に従って `lasso-rust-helper` に「アクセシビリティ」と「画面収録」権限をチェックするだけ。`doctor` が一歩ずつ案内します。
|
|
208
208
|
|
|
209
209
|
<details>
|
|
210
|
-
<summary>📋 更新履歴(v1.8 → v1.
|
|
210
|
+
<summary>📋 更新履歴(v1.8 → v1.15、クリックで各バージョンの変更を見る)</summary>
|
|
211
|
+
|
|
212
|
+
- **v1.15**: Bing の死層を完全削除(Bing Search APIs は 2025-08-11 に全面退役——ドキュメント注記ではなくコード削除。残存 `BING_API_KEYS` は黙って無視、`lasso doctor` が削除を提案)+ ヘッドレスブラウザの手前に**裸 HTTP クイックプローブ**を追加(API 層が全滅した時、まず約 1 秒のブラウザなし取得を試し、取れなければヘッドレスの遅い経路へ。実機計測:英語で 20 件を 1.9 秒で取得 vs ヘッドレス経路 5.3 秒で CAPTCHA により 0 件。Baidu の CAPTCHA/ホームシェル等のソフトブロック頁は成功を偽装せずブラウザへ昇格)。
|
|
211
213
|
|
|
212
214
|
- **v1.14**: 検索の運営事実清算(Brave のクォータ台帳を $5 月次クレジット ≈1000 回/月に整合;`free_only=L2` で従量課金の Brave を無料枠として扱わない;Bing クォータをゼロ化)+ 英語ゼロ Key フォールバックのデュアルエンジン化(DDG 失敗・空結果時に Brave 実検索へ 1 段カスケード);`lasso doctor --deep`(Brave プラン階層プローブ、クォータ 1 回消費)+ Bing 廃止の静的通知;KEY-GUIDE に鮮度日付制度を導入(各 key 記載に「最終確認日」と 90 日再確認トリガーを付与)。- **v1.13**:ヘッドレスブラウザの言語フィンガープリント一貫性(HTTP `Accept-Language` がプロファイルに従って送信され、「ヘッダー zh-CN ↔ ページ en-US」の矛盾を解消);領域付き VLM スクリーンショットの座標ずれ修正;`desktop find` が純 ref クエリを拒否;Steel セッション解放に 3 秒の上限を追加(Steel 停止時でも終了が 5 分固まらなくなった)。
|
|
213
215
|
- **v1.12**:markdown 抽出のデュアル活性化(defuddle の 20 余りサイト専用抽出器 + 表・数式の構造保真);macOS のデフォルトフィンガープリントをホストシステムと整合;デスクトップチェーン末尾の正直化(VLM が成功を偽らない / expect は連続 2 回ヒットが必要 / `truncated:true` シグナル);Electron 入力欄の type 自動降格;ドラッグの補間軌道が実用に;CC 異常終了時の即時後始末。
|
|
@@ -254,12 +256,11 @@ lasso config init # ~/.lasso/config.json を作成
|
|
|
254
256
|
```json
|
|
255
257
|
{
|
|
256
258
|
"ZHIPU_API_KEY": "your_zhipu_key",
|
|
257
|
-
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
258
|
-
"BING_API_KEYS": "bingkey1"
|
|
259
|
+
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
259
260
|
}
|
|
260
261
|
```
|
|
261
262
|
|
|
262
|
-
> フォールバック順:マシン MCP 再利用 → Zhipu → Brave
|
|
263
|
+
> フォールバック順:マシン MCP 再利用 → Zhipu → Brave → ヘッドレスブラウザ実検索フォールバック(v1.14:英語はデュアルエンジン——DDG 失敗・空結果時に Brave 実検索へ自動で 1 回再試行;v1.15 からその前に**裸 HTTP クイックプローブ**(約 1 秒、ブラウザなしで検索結果ページを直接取得——実機計測ではブラウザなしの方がむしろ警戒されにくいエンジンあり)を挟み、取れない時だけヘッドレスの遅い経路へ)。前が落ちたら自動で次へ。(Bing は上流 2025-08-11 の全廃に伴い層ごと削除。残った `BING_API_KEYS` は黙って無視され、`lasso doctor` が削除を提案します。)
|
|
263
264
|
|
|
264
265
|
キーの取得方法や無料枠の詳細 → [キー設定ガイド · 検索](./doc/KEY-GUIDE.md#a-搜索)。よく使うコマンド:`lasso --version` / `lasso --help`(v1.8 から未知のコマンドは使い方を表示して非ゼロ終了し、黙って固まらなくなりました)。
|
|
265
266
|
|
package/README.md
CHANGED
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
|---|---|
|
|
42
42
|
| 「搜一下 rust async 生态最新动态」 | 结构化搜索结果(某家临时挂掉自动换下一家,你无感) |
|
|
43
43
|
| 「搜最近一周 Claude Code 的更新」(v1.11) | 按 `freshness=week` 过滤的时效结果——不用往查询词里手写日期 |
|
|
44
|
+
| 「claude-code 最新版本号是多少」(v1.16) | 官方 feed 最新条目(发布即推送,不等搜索索引;给一个 RSS/Atom 地址即可) |
|
|
44
45
|
| 「抓一下 github.com 首页文字」 | 干净正文(自动剥掉导航 / 广告 / 冗余,省 30–70% 字数;20 多个高频站点走专用抽取器、表格不丢结构——v1.12) |
|
|
45
46
|
| 「打开我已登录的 Jira 看看待办」 | 登录态页面快照(复用你本机 Chrome,2FA 你自己解) |
|
|
46
47
|
| 「这个链接打不开了,找找存档」 | 互联网档案馆最近一份快照 |
|
|
@@ -122,7 +123,7 @@ key 怎么申请、免费额度多少 → [**Key 配置指南**](./doc/KEY-GUIDE
|
|
|
122
123
|
|
|
123
124
|
> 你:「搜一下 X」 → 结构化搜索结果
|
|
124
125
|
|
|
125
|
-
默认走智谱(中文主力),可再配 Brave 做多源(Bing
|
|
126
|
+
默认走智谱(中文主力),可再配 Brave 做多源(Bing 上游已关停且死层已移除,配置键保留但会被静默忽略)。**任一家临时限流或挂掉,自动切下一家,你无感**。某家免费额度用完也不影响整体。
|
|
126
127
|
|
|
127
128
|
要查**新闻、版本动向**这类时效内容,直接说「搜最近一周 / 最近一个月的 X」——自动带时效过滤(day / week / month / year,v1.11),不用往查询词里手写日期。
|
|
128
129
|
|
|
@@ -180,6 +181,14 @@ macOS 上能控 Finder / Mail / Safari / Notes / 系统设置等任何原生 app
|
|
|
180
181
|
|
|
181
182
|
去互联网档案馆(Wayback Machine)查这个链接最后一次被存档是什么样。**不会主动把活链当死链处理**,只在你说「找不到了」时才查。
|
|
182
183
|
|
|
184
|
+
### 订阅官方博客 / 追最新版本(v1.16 新)
|
|
185
|
+
|
|
186
|
+
> 你:「claude-code 最新版本是多少」「官方博客最近说了什么」 → 结构化条目列表
|
|
187
|
+
|
|
188
|
+
给它一个 RSS / Atom / JSON Feed 地址,直接拉成带标题、链接、发布时间的条目列表(约 200-500ms,零 key)。搜索索引要滞后几小时到几天,feed 是**发布即推送**——追版本号、退役时间线、官方公告这类「要新」的问题,问 feed 比搜一遍更准。官方博客的 feed 地址通常藏在页面头部的 `<link rel="alternate">` 里,让 Claude 先 `fetch_url` 一下就能发现。
|
|
189
|
+
|
|
190
|
+
> **生态搭配(推荐但可选)**:常写代码的话,建议另装 [Grep by Vercel 的官方 MCP](https://grep.app)(免费,索引 100 万+ GitHub 仓库的真实代码用法)。「别人怎么写」类问题它比任何网页搜索都准——Lasso 不内置它,各干各的活,互不重复。
|
|
191
|
+
|
|
183
192
|
### 反爬强攻(默认关)
|
|
184
193
|
|
|
185
194
|
> 你:「这个站有 Cloudflare,抓不动」 → 云端 Chrome 反爬
|
|
@@ -194,7 +203,7 @@ macOS 上能控 Finder / Mail / Safari / Notes / 系统设置等任何原生 app
|
|
|
194
203
|
|
|
195
204
|
## 安装
|
|
196
205
|
|
|
197
|
-
**当前版本 v1.
|
|
206
|
+
**当前版本 v1.16.0**(更新日志见本节末尾折叠块)。
|
|
198
207
|
|
|
199
208
|
前提:Node.js ≥ 20 + Claude Code(或任何支持 MCP 的客户端)。
|
|
200
209
|
|
|
@@ -207,8 +216,10 @@ claude mcp add lasso -- npx -y lasso-mcp
|
|
|
207
216
|
**macOS 想控桌面**:跑一次 `lasso doctor`,按提示给 `lasso-rust-helper` 勾上「辅助功能」和「屏幕录制」权限即可,doctor 会一步步引导。
|
|
208
217
|
|
|
209
218
|
<details>
|
|
210
|
-
<summary>📋 更新日志(v1.8 → v1.
|
|
219
|
+
<summary>📋 更新日志(v1.8 → v1.16,点开看每版改了什么)</summary>
|
|
211
220
|
|
|
221
|
+
- **v1.16**:新增 `fetch_feed` 工具(RSS / Atom / JSON Feed → 结构化条目;追版本号、退役时间线、官方公告这类「要新」的问题直接问源,不再等搜索索引)+ 修复搜索缓存新鲜度缺陷(`freshness=day` 的结果此前可能被缓存成最多 7 天的陈货,现在 day 档 24 小时即过期;全源熔断时的录制回放也会按 freshness 窗口拒掉过期 fixture,不再拿陈年录像充数)。
|
|
222
|
+
- **v1.15**:Bing 死层彻底清除(Bing Search APIs 2025-08-11 全量退役——删代码非标注;历史 `BING_API_KEYS` 静默忽略、`lasso doctor` 提示删除)+ 无头浏览器之前新增**裸 HTTP 快探层**(API 层全挂时先用无浏览器直连抓一次搜索结果页,约 1 秒,探不到再启动无头浏览器慢路径;真机实测英文命中 20 条结果仅 1.9 秒,而无头浏览器路径 5.3 秒且被验证码挡成 0 条;百度验证码/首页壳等软挡页不伪造成功,自动升级浏览器复核)。
|
|
212
223
|
- **v1.14**:搜索运营事实清偿(Brave 配额账本对齐 $5 赠送额度 ≈1000 次/月、`free_only=L2` 不再把计量计费的 Brave 当免费层;Bing 配额归零)+ 英文零 Key 兜底双引擎(DDG 失败/空结果自动级联 Brave 实搜);`lasso doctor --deep`(Brave 计划级探测,消耗 1 次额度)+ Bing 退役静态提示;KEY-GUIDE 时效标注制度(每条 key 声明自带「最后核实」日期与 90 天重核触发)。
|
|
213
224
|
- **v1.13**:无头浏览器语言指纹一致(HTTP `Accept-Language` 随档案下发,消除「头 zh-CN ↔ 页面 en-US」矛盾);VLM 截图区域坐标落点修复;`desktop find` 拒绝纯 ref 查询;Steel 会话释放加 3 秒上界(Steel 停摆不再卡退出 5 分钟)。
|
|
214
225
|
- **v1.12**:markdown 抽取双激活(defuddle 20 余站专用抽取器 + 表格/数学保真);macOS 默认指纹与宿主系统对齐;桌面链尾诚实化(VLM 不谎报成功 / expect 需连续两次命中 / `truncated:true` 信号);Electron 输入框 type 自动降级;拖拽插值变可用;CC 异常退出即时收尾。
|
|
@@ -255,12 +266,11 @@ lasso config init # 创建 ~/.lasso/config.json
|
|
|
255
266
|
```json
|
|
256
267
|
{
|
|
257
268
|
"ZHIPU_API_KEY": "你的智谱key",
|
|
258
|
-
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
259
|
-
"BING_API_KEYS": "bingkey1"
|
|
269
|
+
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
260
270
|
}
|
|
261
271
|
```
|
|
262
272
|
|
|
263
|
-
> 降级顺序:机器 MCP 复用 → 智谱 → Brave
|
|
273
|
+
> 降级顺序:机器 MCP 复用 → 智谱 → Brave → 无头浏览器实搜兜底(v1.14 起英文兜底双引擎:DuckDuckGo 失败/空结果自动再试一次 Brave 实搜;v1.15 起无头浏览器之前先加一层**裸 HTTP 快探**(约 1 秒,无浏览器直接抓搜索结果页——实测部分搜索引擎对「无浏览器」反而更不设防),探不到再启动无头浏览器慢路径)。前一个挂了自动切下一个。(Bing 源已随上游 2025-08-11 退役整层移除;历史配置里的 `BING_API_KEYS` 会被静默忽略,`lasso doctor` 会提示删除。)
|
|
264
274
|
|
|
265
275
|
key 怎么申请、免费额度多少 → [Key 配置指南 · 搜索](./doc/KEY-GUIDE.md#a-搜索)。常用命令:`lasso --version` / `lasso --help`(v1.8 起未知命令打印用法非零退出,不再静默挂起)。
|
|
266
276
|
|
package/README.pt.md
CHANGED
|
@@ -122,7 +122,7 @@ Agrupado por **o que você quer fazer**, não pelo nome da ferramenta. Cada item
|
|
|
122
122
|
|
|
123
123
|
> Você: "Pesquise por X" → resultados estruturados de busca
|
|
124
124
|
|
|
125
|
-
Usa a Zhipu por padrão (forte em chinês); você pode adicionar a Brave como segunda fonte (o upstream do Bing já foi desligado; a chave de configuração
|
|
125
|
+
Usa a Zhipu por padrão (forte em chinês); você pode adicionar a Brave como segunda fonte (o upstream do Bing já foi desligado e sua camada morta removida; a chave de configuração é tolerada, mas silenciosamente ignorada). **Se uma fonte qualquer for limitada por taxa ou estiver fora do ar, ele alterna automaticamente para a próxima — você nem percebe.** Esgotar a cota grátis de um provedor não derruba o conjunto.
|
|
126
126
|
|
|
127
127
|
Para conteúdo **de atualidade — notícias, movimentos de versão**, basta dizer "pesquise o X da última semana / do último mês" — o filtro de temporalidade se aplica automaticamente (day / week / month / year, v1.11), sem escrever datas à mão na query.
|
|
128
128
|
|
|
@@ -194,7 +194,7 @@ Recorre à Internet Archive (Wayback Machine) para encontrar a última cópia ar
|
|
|
194
194
|
|
|
195
195
|
## Instalação
|
|
196
196
|
|
|
197
|
-
**Versão atual v1.
|
|
197
|
+
**Versão atual v1.15.0** (changelog no bloco recolhido no fim desta seção).
|
|
198
198
|
|
|
199
199
|
Pré-requisitos: Node.js ≥ 20 + Claude Code (ou qualquer cliente compatível com MCP).
|
|
200
200
|
|
|
@@ -207,7 +207,9 @@ Reinicie o Claude Code → `/mcp` → `lasso ✓ Connected`. **É só essa linha
|
|
|
207
207
|
**Controle do desktop no macOS**: rode `lasso doctor` uma vez e siga as instruções para marcar `lasso-rust-helper` em "Accessibility" e "Screen Recording" — o `doctor` guia você passo a passo.
|
|
208
208
|
|
|
209
209
|
<details>
|
|
210
|
-
<summary>📋 Changelog (v1.8 → v1.
|
|
210
|
+
<summary>📋 Changelog (v1.8 → v1.15, clique para ver o que mudou em cada versão)</summary>
|
|
211
|
+
|
|
212
|
+
- **v1.15**: camada morta do Bing removida por inteiro (Bing Search APIs aposentado por completo em 2025-08-11 — código apagado, não só documentado; `BING_API_KEYS` residual é silenciosamente ignorado e o `lasso doctor` sugere a remoção) + **sonda rápida de HTTP puro** antes do navegador headless (se todas as camadas de API caírem, primeiro busca-se a página de resultados sem navegador em ~1s; só se voltar vazia o caminho lento arranca — teste real: 20 resultados em 1,9s contra 5,3s do caminho headless com captcha e zero resultados; páginas de bloqueio brando como o captcha/home do Baidu nunca forjam sucesso e escalam para o navegador).
|
|
211
213
|
|
|
212
214
|
- **v1.14**: dívida de fatos operacionais de busca saldada (razão de cota do Brave alinhada ao crédito mensal de $5 ≈1000 consultas/mês; `free_only=L2` não roteia mais o Brave medido como nível gratuito; cota do Bing zerada) + fallback inglês sem key de dois motores (falha/vazio do DDG faz cascata para uma tentativa Brave SERP); `lasso doctor --deep` (sonda de nível de plano do Brave, consome 1 unidade de cota) + aviso estático de aposentadoria do Bing; sistema de datação de frescor no KEY-GUIDE (cada afirmação de key traz data de "última verificação" e gatilho de reverificação de 90 dias).
|
|
213
215
|
- **v1.13**: consistência da impressão de idioma do navegador headless (o cabeçalho HTTP `Accept-Language` segue o perfil, eliminando a contradição "cabeçalho zh-CN ↔ página en-US"); correção do ponto de impacto das capturas VLM com região; `desktop find` rejeita queries puramente por ref; liberação de sessão Steel ganha teto de 3 segundos (um Steel parado não trava mais a saída por 5 minutos).
|
|
@@ -255,12 +257,11 @@ Salve e já vale. **Quer mais robustez**: adicione também a Brave (plano pago c
|
|
|
255
257
|
```json
|
|
256
258
|
{
|
|
257
259
|
"ZHIPU_API_KEY": "your_zhipu_key",
|
|
258
|
-
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
259
|
-
"BING_API_KEYS": "bingkey1"
|
|
260
|
+
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
260
261
|
}
|
|
261
262
|
```
|
|
262
263
|
|
|
263
|
-
> Ordem de fallback: reuso do MCP da máquina → Zhipu → Brave →
|
|
264
|
+
> Ordem de fallback: reuso do MCP da máquina → Zhipu → Brave → fallback de busca real no navegador headless (v1.14: fallback inglês de dois motores — falha/vazio do DDG tenta automaticamente mais uma vez com busca real do Brave; v1.15 adiciona antes uma **sonda rápida de HTTP puro** (~1s, busca a página de resultados sem nenhum navegador — em testes reais alguns motores desconfiam menos de clientes sem navegador); só se não achar nada o caminho lento do navegador arranca). O primeiro que falha passa para o próximo. (A fonte Bing foi removida por inteiro após a aposentadoria do upstream em 2025-08-11; um `BING_API_KEYS` residual é silenciosamente ignorado e o `lasso doctor` sugere removê-lo.)
|
|
264
265
|
|
|
265
266
|
Como solicitar keys, cotas dos planos grátis → [Guia de Configuração de Keys · Busca](./doc/KEY-GUIDE.md#a-搜索). Comandos úteis: `lasso --version` / `lasso --help` (desde a v1.8, comando desconhecido imprime o uso e sai com código não zero — não trava mais em silêncio).
|
|
266
267
|
|
package/README.ru.md
CHANGED
|
@@ -122,7 +122,7 @@ claude mcp add lasso -- npx -y lasso-mcp
|
|
|
122
122
|
|
|
123
123
|
> Вы: «Найди X» → структурированные результаты поиска
|
|
124
124
|
|
|
125
|
-
По умолчанию Zhipu (силен для китайского); в качестве второго источника можно дополнительно настроить Brave (апстрим Bing уже
|
|
125
|
+
По умолчанию Zhipu (силен для китайского); в качестве второго источника можно дополнительно настроить Brave (апстрим Bing уже закрыт, мёртвый слой удалён — ключ конфигурации терпится, но молча игнорируется). **Если один источник упёрся в лимит или недоступен — автоматически переключается на следующий, вы ничего не замечаете.** Исчерпание бесплатной квоты у одного провайдера не ломает всю систему.
|
|
126
126
|
|
|
127
127
|
Для **свежих** материалов — новостей, движения версий — просто скажите «найди X за последнюю неделю / последний месяц»: фильтр свежести применяется автоматически (day / week / month / year, v1.11), без рукописных дат в запросе.
|
|
128
128
|
|
|
@@ -194,7 +194,7 @@ claude mcp add lasso -- npx -y lasso-mcp
|
|
|
194
194
|
|
|
195
195
|
## Установка
|
|
196
196
|
|
|
197
|
-
**Текущая версия v1.
|
|
197
|
+
**Текущая версия v1.15.0** (журнал изменений — в свёрнутом блоке в конце раздела).
|
|
198
198
|
|
|
199
199
|
Предварительные требования: Node.js ≥ 20 + Claude Code (или любой клиент с поддержкой MCP).
|
|
200
200
|
|
|
@@ -207,7 +207,9 @@ claude mcp add lasso -- npx -y lasso-mcp
|
|
|
207
207
|
**Управление рабочим столом на macOS**: один раз выполните `lasso doctor` и по подсказкам отметьте `lasso-rust-helper` в разделах «Универсальный доступ» и «Запись экрана» — `doctor` проведёт вас шаг за шагом.
|
|
208
208
|
|
|
209
209
|
<details>
|
|
210
|
-
<summary>📋 Журнал изменений (v1.8 → v1.
|
|
210
|
+
<summary>📋 Журнал изменений (v1.8 → v1.15 — что поменялось в каждой версии)</summary>
|
|
211
|
+
|
|
212
|
+
- **v1.15**: мёртвый слой Bing удалён целиком (Bing Search APIs полностью выведен 2025-08-11 — удалён код, а не пометка в доке; оставшийся `BING_API_KEYS` молча игнорируется, `lasso doctor` предлагает убрать) + **быстрый HTTP-зонд без браузера** перед headless-браузером (если все API-слои упали, страница результатов сначала забирается без браузера за ~1с; лишь при пустом результате стартует медленный headless-путь — реальный тест: 20 результатов за 1,9с против 5,3с у headless-пути с капчей и нулём результатов; страницы мягкой блокировки вроде капчи/домашней оболочки Baidu никогда не подделывают успех и эскалируют в браузер).
|
|
211
213
|
|
|
212
214
|
- **v1.14**: операционные факты поиска приведены в порядок (квотовый реестр Brave выровнен по месячному кредиту $5 ≈1000 запросов/мес; `free_only=L2` больше не пропускает тарифицируемый Brave как бесплатный уровень; квота Bing обнулена) + двухдвижковый английский fallback без ключей (провал/пустота DDG каскадом даёт одну попытку Brave SERP); `lasso doctor --deep` (зонд уровня тарифа Brave, расходует 1 единицу квоты) + статическое уведомление о выводе Bing; система датировки свежести в KEY-GUIDE (у каждого утверждения о ключе — дата «последней проверки» и триггер перепроверки 90 дней).
|
|
213
215
|
- **v1.13**: согласованность языкового отпечатка headless-браузера (HTTP-заголовок `Accept-Language` следует профилю — устранено противоречие «заголовок zh-CN ↔ страница en-US»); исправлена точка попадания VLM-скриншотов с областью; `desktop find` отклоняет чисто ref-запросы; освобождение сессии Steel получило потолок в 3 секунды (остановленный Steel больше не вешает выход на 5 минут).
|
|
@@ -255,12 +257,11 @@ lasso config init # создаёт ~/.lasso/config.json
|
|
|
255
257
|
```json
|
|
256
258
|
{
|
|
257
259
|
"ZHIPU_API_KEY": "your_zhipu_key",
|
|
258
|
-
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
259
|
-
"BING_API_KEYS": "bingkey1"
|
|
260
|
+
"BRAVE_API_KEYS": "bravekey1,bravekey2"
|
|
260
261
|
}
|
|
261
262
|
```
|
|
262
263
|
|
|
263
|
-
> Порядок фолбэка: переиспользование машинного MCP → Zhipu → Brave →
|
|
264
|
+
> Порядок фолбэка: переиспользование машинного MCP → Zhipu → Brave → фолбэк живого поиска в headless-браузере (v1.14: английский фолбэк на двух движках — при провале/пустоте DDG автоматически даётся одна повторная попытка через живой поиск Brave; v1.15 добавляет перед ним **быстрый HTTP-зонд без браузера** (~1с, страница результатов забирается вовсе без браузера — в реальных тестах некоторые движки меньше подозревают клиентов без браузера); только если он ничего не нашёл, стартует медленный headless-путь). Первый сбой — автоматический переход к следующему. (Источник Bing удалён целиком после вывода апстрима 2025-08-11; оставшийся `BING_API_KEYS` молча игнорируется, `lasso doctor` предложит его убрать.)
|
|
264
265
|
|
|
265
266
|
Как оформлять ключи, размеры бесплатных лимитов → [Руководство по настройке ключей · Поиск](./doc/KEY-GUIDE.md#a-搜索). Частые команды: `lasso --version` / `lasso --help` (с v1.8 неизвестная команда печатает usage и выходит с ненулевым кодом — больше не висит молча).
|
|
266
267
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-type-router.d.ts","sourceRoot":"","sources":["../../src/browse/content-type-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"content-type-router.d.ts","sourceRoot":"","sources":["../../src/browse/content-type-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiCD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,CAerF"}
|
|
@@ -40,6 +40,9 @@ const ROUTING_TABLE = [
|
|
|
40
40
|
kind: "text",
|
|
41
41
|
},
|
|
42
42
|
{ pattern: /^application\/xml\b/, kind: "text" },
|
|
43
|
+
// ZB-4 配套(doc/24 verdict D-GO-2,2026-08-18):feed XML 主流 MIME 也是文本
|
|
44
|
+
// (此前 application/rss+xml 落到 binary → base64,fetch_feed 无法解析)
|
|
45
|
+
{ pattern: /^application\/(rss|atom|feed)\+xml\b/, kind: "text" },
|
|
43
46
|
{ pattern: /^application\/(javascript|ecmascript)\b/, kind: "text" },
|
|
44
47
|
{ pattern: /^application\/x-www-form-urlencoded\b/, kind: "text" },
|
|
45
48
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-type-router.js","sourceRoot":"","sources":["../../src/browse/content-type-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAaH,+DAA+D;AAC/D,2DAA2D;AAC3D,+DAA+D;AAC/D;;;;GAIG;AACH,MAAM,aAAa,GAA0D;IAC3E,gBAAgB;IAChB,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE;IAC1C,EAAE,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,MAAM,EAAE;IACvD,uCAAuC;IACvC,EAAE,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,EAAE;IACjD,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE;IACrC,aAAa;IACb;QACE,OAAO,EAAE,uEAAuE;QAChF,IAAI,EAAE,MAAM;KACb;IACD,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,EAAE;IAChD,EAAE,OAAO,EAAE,yCAAyC,EAAE,IAAI,EAAE,MAAM,EAAE;IACpE,EAAE,OAAO,EAAE,uCAAuC,EAAE,IAAI,EAAE,MAAM,EAAE;CACnE,CAAC;AAEF,+DAA+D;AAC/D,QAAQ;AACR,+DAA+D;AAC/D;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAsC;IACrE,sDAAsD;IACtD,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,0BAA0B,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,IAAI,0BAA0B,CAAC;IAEnE,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC;IAED,gFAAgF;IAChF,2CAA2C;IAC3C,+DAA+D;IAC/D,uEAAuE;IACvE,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC;IAClE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC"}
|
|
1
|
+
{"version":3,"file":"content-type-router.js","sourceRoot":"","sources":["../../src/browse/content-type-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAaH,+DAA+D;AAC/D,2DAA2D;AAC3D,+DAA+D;AAC/D;;;;GAIG;AACH,MAAM,aAAa,GAA0D;IAC3E,gBAAgB;IAChB,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE;IAC1C,EAAE,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,MAAM,EAAE;IACvD,uCAAuC;IACvC,EAAE,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,EAAE;IACjD,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE;IACrC,aAAa;IACb;QACE,OAAO,EAAE,uEAAuE;QAChF,IAAI,EAAE,MAAM;KACb;IACD,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,EAAE;IAChD,kEAAkE;IAClE,8DAA8D;IAC9D,EAAE,OAAO,EAAE,sCAAsC,EAAE,IAAI,EAAE,MAAM,EAAE;IACjE,EAAE,OAAO,EAAE,yCAAyC,EAAE,IAAI,EAAE,MAAM,EAAE;IACpE,EAAE,OAAO,EAAE,uCAAuC,EAAE,IAAI,EAAE,MAAM,EAAE;CACnE,CAAC;AAEF,+DAA+D;AAC/D,QAAQ;AACR,+DAA+D;AAC/D;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAsC;IACrE,sDAAsD;IACtD,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,0BAA0B,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,IAAI,0BAA0B,CAAC;IAEnE,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC;IAED,gFAAgF;IAChF,2CAA2C;IAC3C,+DAA+D;IAC/D,uEAAuE;IACvE,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC;IAClE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import TurndownService from "turndown";
|
|
1
2
|
import { type CitationResult } from "./content-filter-cite.js";
|
|
2
3
|
export type ExtractMode = "raw" | "markdown" | "markdown_cited";
|
|
3
4
|
export interface MarkdownExtractOptions {
|
|
@@ -35,6 +36,19 @@ export declare const MARKDOWN_ENGINE: Readonly<{
|
|
|
35
36
|
converter: "turndown";
|
|
36
37
|
pipeline: "defuddle+turndown";
|
|
37
38
|
}>;
|
|
39
|
+
/**
|
|
40
|
+
* 以本项目统一配置构造一个 turndown 实例(extractMarkdown 内部与
|
|
41
|
+
* serp/http-serp.ts 全页转换共用同一工厂——引擎与配置单一真源,INV-68 同精神)。
|
|
42
|
+
*
|
|
43
|
+
* 为什么 http-serp 不走 extractMarkdown:defuddle 正文抽取对 **SERP 页有害**
|
|
44
|
+
* (2026-08-17 实测:把结果标题 <a> 升格为 heading 丢 href、丢摘要 div)——
|
|
45
|
+
* SERP 需要保住**全部** <a href> 的全页转换(即本模块的 turndown-only 降级路径)。
|
|
46
|
+
* 缺省 headingStyle/bulletMarker 与 extractMarkdown 内部缺省一致(byte-identical)。
|
|
47
|
+
*/
|
|
48
|
+
export declare function createTurndownService(opts?: {
|
|
49
|
+
headingStyle?: "atx" | "setext";
|
|
50
|
+
bulletMarker?: "-" | "*" | "+";
|
|
51
|
+
}): TurndownService;
|
|
38
52
|
/**
|
|
39
53
|
* @param html 原始 HTML 字符串(fetch_url bodyText / browse evaluate_script outerHTML)
|
|
40
54
|
* @param opts 模式 + 配置(mode 必传)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-extractor.d.ts","sourceRoot":"","sources":["../../src/browse/markdown-extractor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"markdown-extractor.d.ts","sourceRoot":"","sources":["../../src/browse/markdown-extractor.ts"],"names":[],"mappings":"AAsBA,OAAO,eAAe,MAAM,UAAU,CAAC;AACvC,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAM/E,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAEhE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,WAAW,CAAC;IAClB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,YAAY,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAChC,iCAAiC;IACjC,YAAY,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAC/B,oEAAoE;IACpE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,eAAO,MAAM,eAAe;;;;EAI1B,CAAC;AAKH;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IAC3C,YAAY,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAChC,YAAY,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAChC,GAAG,eAAe,CAMlB;AAKD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,qBAAqB,CAAC,CAuFhC;AAKD;;;;GAIG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC,CAsBD"}
|
|
@@ -32,6 +32,25 @@ export const MARKDOWN_ENGINE = Object.freeze({
|
|
|
32
32
|
pipeline: "defuddle+turndown",
|
|
33
33
|
});
|
|
34
34
|
// ============================================================
|
|
35
|
+
// v1.15 Phase B(parse22 §1.2 实施修订):turndown 实例工厂
|
|
36
|
+
// ============================================================
|
|
37
|
+
/**
|
|
38
|
+
* 以本项目统一配置构造一个 turndown 实例(extractMarkdown 内部与
|
|
39
|
+
* serp/http-serp.ts 全页转换共用同一工厂——引擎与配置单一真源,INV-68 同精神)。
|
|
40
|
+
*
|
|
41
|
+
* 为什么 http-serp 不走 extractMarkdown:defuddle 正文抽取对 **SERP 页有害**
|
|
42
|
+
* (2026-08-17 实测:把结果标题 <a> 升格为 heading 丢 href、丢摘要 div)——
|
|
43
|
+
* SERP 需要保住**全部** <a href> 的全页转换(即本模块的 turndown-only 降级路径)。
|
|
44
|
+
* 缺省 headingStyle/bulletMarker 与 extractMarkdown 内部缺省一致(byte-identical)。
|
|
45
|
+
*/
|
|
46
|
+
export function createTurndownService(opts) {
|
|
47
|
+
return new TurndownService({
|
|
48
|
+
headingStyle: opts?.headingStyle ?? "atx",
|
|
49
|
+
bulletListMarker: opts?.bulletMarker ?? "-",
|
|
50
|
+
codeBlockStyle: "fenced",
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// ============================================================
|
|
35
54
|
// 主 API:extractMarkdown(纯函数,无副作用,可单测)
|
|
36
55
|
// ============================================================
|
|
37
56
|
/**
|
|
@@ -89,11 +108,6 @@ export async function extractMarkdown(html, opts) {
|
|
|
89
108
|
articleMarkdown = null;
|
|
90
109
|
}
|
|
91
110
|
// ---------- 2. HTML→markdown(T2-4:defuddle 转换优先,turndown 降级保底) ----------
|
|
92
|
-
const turndown = new TurndownService({
|
|
93
|
-
headingStyle: opts.headingStyle ?? "atx",
|
|
94
|
-
bulletListMarker: opts.bulletMarker ?? "-",
|
|
95
|
-
codeBlockStyle: "fenced",
|
|
96
|
-
});
|
|
97
111
|
const inputHtml = articleHtml ?? html; // defuddle 失败时降级转全页
|
|
98
112
|
const servedBy = articleHtml ? MARKDOWN_ENGINE.pipeline : "turndown-only";
|
|
99
113
|
let markdown;
|
|
@@ -106,7 +120,10 @@ export async function extractMarkdown(html, opts) {
|
|
|
106
120
|
}
|
|
107
121
|
else {
|
|
108
122
|
try {
|
|
109
|
-
markdown =
|
|
123
|
+
markdown = createTurndownService({
|
|
124
|
+
headingStyle: opts.headingStyle,
|
|
125
|
+
bulletMarker: opts.bulletMarker,
|
|
126
|
+
}).turndown(inputHtml);
|
|
110
127
|
}
|
|
111
128
|
catch (e) {
|
|
112
129
|
// turndown 失败 = 引擎彻底挂,抛错让调用方走 outcome=unknown
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-extractor.js","sourceRoot":"","sources":["../../src/browse/markdown-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,kEAAkE;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,eAAe,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,cAAc,EAAuB,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAuC3C,+DAA+D;AAC/D,qCAAqC;AACrC,+DAA+D;AAC/D,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3C,SAAS,EAAE,UAAU,EAAE,gCAAgC;IACvD,SAAS,EAAE,UAAU,EAAE,oBAAoB;IAC3C,QAAQ,EAAE,mBAAmB;CAC9B,CAAC,CAAC;AAEH,+DAA+D;AAC/D,sCAAsC;AACtC,+DAA+D;AAC/D;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,IAA4B;IAE5B,iCAAiC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;IAC7F,CAAC;IAED,2EAA2E;IAC3E,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9C,CAAC;IAED,kFAAkF;IAClF,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,KAAyB,CAAC;IAC9B,IAAI,MAA0B,CAAC;IAC/B,IAAI,OAA2B,CAAC;IAEhC,IAAI,CAAC;QACH,sFAAsF;QACtF,uDAAuD;QACvD,8DAA8D;QAC9D,0EAA0E;QAC1E,wBAAwB;QACxB,qEAAqE;QACrE,kEAAkE;QAClE,+DAA+D;QAC/D,+DAA+D;QAC/D,gEAAgE;QAChE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE;YAClD,gBAAgB,EAAE,IAAI;YACtB,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QACH,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC7B,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;YAC7B,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC;YACjD,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC;YAClC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC;YACpC,OAAO,GAAG,MAAM,CAAC,WAAW,IAAI,SAAS,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,qDAAqD;QACrD,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACxE,WAAW,GAAG,IAAI,CAAC;QACnB,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,2EAA2E;
|
|
1
|
+
{"version":3,"file":"markdown-extractor.js","sourceRoot":"","sources":["../../src/browse/markdown-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IAEjB,kEAAkE;IAClE,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,cAAc,EAAE,aAAa,CAAC;IAC9B;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAMD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,SAAU,CAAC;AAchD;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAc7C;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAa5D;AAED,6DAA6D;AAC7D,eAAO,MAAM,mBAAmB,EAAE,QAAQ,GAAG,SAAoB,CAAC;AAgBlE;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAIR;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA0CxB;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAyBnD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAiB7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,WAAW,CA6E/D"}
|