Repository navigation
Releases: GooDAnDReaDY/dsh-web-gateway
Release list
v0.2.3 [DSH v0.2.1-rc.2]
English
@goodandready/dsh-web-gateway 0.2.3 is a patch release for DeepSeek Harness 0.2.1-rc.2.
Fixed
- Connect-time DNS re-validation for extract URLs is active through the
undicidispatcher. - The settings card health and update routes work from a same-origin remote DSH UI; cross-site requests remain blocked.
- Local readability rejects PDF/DOCX explicitly; use Jina or Firecrawl for documents.
- Provider timeouts count toward the circuit breaker.
- Provider JSON responses are bounded at 2 MB.
- Provider order, timeout documentation, settings card fields and Keenable health are updated.
Verification
- 138/138 offline tests, syntax check, preflight FAIL=0.
- Package: 24 files, no file over 256 KiB.
Install
dsh plugin --profile web add @goodandready/dsh-web-gateway@0.2.3中文
@goodandready/dsh-web-gateway 0.2.3 是面向 DeepSeek Harness 0.2.1-rc.2 的补丁版本。
修复
- 通过
undicidispatcher 启用提取 URL 的连接期 DNS 重新校验。 - 设置卡片的 health/update 路由支持同源远程 DSH UI;跨站请求仍被拒绝。
- 本地 readability 明确拒绝 PDF/DOCX;文档请使用 Jina 或 Firecrawl。
- 提供商超时计入熔断器。
- 提供商 JSON 响应限制为 2 MB。
- 更新提供商顺序、超时文档、设置卡片字段和 Keenable health。
验证
- 138/138 离线测试,语法检查,preflight FAIL=0。
- 包:24 个文件,没有文件超过 256 KiB。
安装
dsh plugin --profile web add @goodandready/dsh-web-gateway@0.2.3Русский
@goodandready/dsh-web-gateway 0.2.3 — патч-релиз для DeepSeek Harness 0.2.1-rc.2.
Исправлено
- Включена повторная DNS-проверка URL при соединении через
undicidispatcher. - Маршруты health/update карточки настроек работают из same-origin удалённого DSH UI; cross-site запросы по-прежнему блокируются.
- Локальный readability явно отклоняет PDF/DOCX; для документов используйте Jina или Firecrawl.
- Таймауты провайдеров учитываются circuit breaker-ом.
- JSON-ответы провайдеров ограничены 2 MB.
- Обновлены порядок провайдеров, документация по таймаутам, поля карточки и Keenable health.
Проверки
- 138/138 офлайн-тестов, проверка синтаксиса, preflight FAIL=0.
- Пакет: 24 файла, ни один файл не больше 256 KiB.
Установка
dsh plugin --profile web add @goodandready/dsh-web-gateway@0.2.3v0.2.2 [DSH v0.2.1-rc.2]
English
Why this release
The plugin used to spend API keys before free capacity. 0.2.2 makes free tiers first-class: every enabled keyless attempt runs before any keyed attempt, with separate accounting for limits, circuit breaking, and telemetry.
Added
- Free-tier-first attempt model:
provider:freeattempts run beforeprovider:keyattempts;providerandskippedexpose the exact mode, e.g.firecrawl:freeorfirecrawl:key#2. - Keyless Firecrawl v2 search and extract, including category/freshness mapping and screenshot requests.
- Keenable search: keyless public endpoint and keyed endpoint.
- Multi-key rotation from a comma-separated credential value; authentication, rate-limit, and quota failures rotate to the next key.
- Per provider+mode daily caps (
firecrawl:free,firecrawl:key,keenable:free,keenable:key). - Run-wide
searchDeadlineMs/extractDeadlineMs, per-attempt timeout, and tier-bounded race/aggregate strategies. - Internal-target policy: with
allowInternalUrls=true, cloud providers are skipped and only localreadabilityruns. - Settings-card controls, English/Chinese UI strings, and updated README/CHANGELOG/DESIGN documentation.
Changed
- Default search order:
firecrawl,keenable,searxng,duckduckgo,tavily,brave,exa. - Firecrawl search and extract use the v2 endpoints.
- Keyless Firecrawl is enabled by default, so public queries and URLs are sent to Firecrawl cloud even without a key. Disable with
firecrawlKeylessSearch=false/firecrawlKeylessFetch=false. - Firecrawl daily caps moved to
firecrawl:free/firecrawl:key.
Fixed
category=news+freshnessno longer silently drops the freshness filter through Firecrawl; such attempts are ineligible.- Tavily
general+freshnessis ineligible because Tavily'sdaysapplies to news only. take_screenshot=trueno longer returns a screenshot-less success; the attempt falls through when no screenshot is produced.- All keys of a provider share one keyed daily cap;
firecrawl:key#2can no longer resolve to an unlimited counter. - An empty eligible-attempt list now explains the filter situation instead of
all providers failed ().
Compatibility and migration
- Existing configurations parse unchanged.
- New default order includes Keenable; opt out with
keenableEnabled=falseor remove it fromsearchProviderOrder. - Firecrawl moves to v2; keyless search/extract is a new default cloud boundary.
- For an internal extract target with
allowInternalUrls=true, cloud providers are skipped by design. - No
attempts[]output array was added;skipped[]remains the diagnostics channel.
Verification
- 130/130 offline tests pass;
node --checkclean; preflightFAIL=0. - Exact release candidate passed an isolated DSH test server: install, health 200, plugin present in the boot manifest, then cleanup.
- The same candidate was accepted in production before publication: service active, plugin health 200, plugin present in the boot manifest.
- Visual acceptance was explicitly waived by the project owner for this release.
Related work
- Gitea issue #62; feature PR #63; release PR #64.
- Plugin commit
f629ec2; Gitea tagv0.2.2; sanitized GitHub mirror commit343a364. - Package: https://www.npmjs.com/package/@goodandready/dsh-web-gateway/v/0.2.2
Deploy and rollback
- After publication the production profile is switched from the temporary
.tgzcandidate to the exact registry version0.2.2, then health/smoke checks are repeated. - Rollback: install
@goodandready/dsh-web-gateway@0.2.1from the registry and restart the DSH web service.
中文
为什么发布
插件过去会先消耗 API key,而不是免费额度。0.2.2 将免费层放在首位:所有启用的无密钥尝试都先于任何密钥尝试执行,并分别统计限额、熔断和遥测。
新增
- Free-tier-first 尝试模型:
provider:free先于provider:key;provider和skipped显示实际模式,例如firecrawl:free、firecrawl:key#2。 - Firecrawl v2 无密钥搜索与提取,支持 category/freshness 映射和截图请求。
- Keenable 搜索:无密钥公共端点和密钥端点。
- 逗号分隔的多密钥轮换;认证、限流和额度失败时切换到下一个密钥。
- 按 provider+mode 的每日限额(
firecrawl:free、firecrawl:key、keenable:free、keenable:key)。 searchDeadlineMs/extractDeadlineMs、单次尝试超时、按层级的 race/aggregate 策略。- 内网目标策略:
allowInternalUrls=true时跳过云提供商,仅使用本地readability。 - 设置卡片、英文/中文 UI 字符串,以及 README/CHANGELOG/DESIGN 文档更新。
变更
- 默认搜索顺序:
firecrawl,keenable,searxng,duckduckgo,tavily,brave,exa。 - Firecrawl 搜索和提取使用 v2 端点。
- 默认启用无密钥 Firecrawl;公开查询和 URL 即使没有密钥也会发送到 Firecrawl 云端。可用
firecrawlKeylessSearch=false/firecrawlKeylessFetch=false关闭。 - Firecrawl 每日限额改为
firecrawl:free/firecrawl:key。
修复
category=news+freshness不再通过 Firecrawl 静默丢弃 freshness;此类尝试视为不合格。- Tavily
general+freshness视为不合格,因为 Tavily 的days仅适用于新闻。 take_screenshot=true不再返回没有截图的成功结果;没有截图时会回退。- 同一提供商的所有密钥共享一个密钥层每日限额;
firecrawl:key#2不会变成无限制。 - 可尝试列表为空时会说明过滤条件,而不是只报
all providers failed ()。
兼容性与迁移
- 现有配置保持兼容。
- 新默认顺序包含 Keenable;可用
keenableEnabled=false退出或从searchProviderOrder移除。 - Firecrawl 迁移到 v2;无密钥搜索/提取是新的默认云端边界。
allowInternalUrls=true时,内网提取目标会跳过云提供商。- 未添加
attempts[];诊断仍通过skipped[]。
验证
- 130/130 离线测试通过;
node --check干净;preflightFAIL=0。 - 精确候选包通过隔离 DSH 测试服务器:安装、health 200、启动清单中存在插件,然后清理。
- 同一候选包在发布前通过 production 验收:服务 active、插件 health 200、启动清单中存在插件。
- 本次发布由项目所有者明确豁免视觉验收。
相关工作
- Gitea issue #62;功能 PR #63;发布 PR #64。
- 插件 commit
f629ec2;Gitea tagv0.2.2;GitHub 镜像 commit343a364。 - 包:https://www.npmjs.com/package/@goodandready/dsh-web-gateway/v/0.2.2
部署与回滚
- 发布后将 production 从临时
.tgz候选切换到精确 registry 版本0.2.2,并重复 health/smoke 检查。 - 回滚:从 registry 安装
@goodandready/dsh-web-gateway@0.2.1,重启 DSH web 服务。
Русский
Зачем этот релиз
Плагин тратил API-ключи раньше бесплатных квот. В 0.2.2 бесплатные каналы стали первыми: все включённые keyless-попытки идут до любых keyed-попыток, с раздельным учётом лимитов, circuit breaker и телеметрии.
Добавлено
- Модель free-tier-first: попытки
provider:freeидут доprovider:key;providerиskippedпоказывают реальный режим, напримерfirecrawl:freeилиfirecrawl:key#2. - Keyless Firecrawl v2 для поиска и извлечения, включая category/freshness и screenshot.
- Keenable: keyless и keyed поиск.
- Ротация нескольких ключей из значения credential через запятую; при auth/rate/quota плагин переходит к следующему ключу.
- Дневные лимиты по provider+mode (
firecrawl:free,firecrawl:key,keenable:free,keenable:key). searchDeadlineMs/extractDeadlineMs, таймаут на попытку, tier-bounded race/aggregate.- Политика внутренних целей: при
allowInternalUrls=trueоблачные провайдеры пропускаются, работает только локальныйreadability. - Карточка настроек, EN/ZH UI-строки, обновлённые README/CHANGELOG/DESIGN.
Изменено
- Default order:
firecrawl,keenable,searxng,duckduckgo,tavily,brave,exa. - Firecrawl search/extract переведены на v2.
- Keyless Firecrawl включён по умолчанию: публичные запросы и URL уходят в Firecrawl cloud даже без ключа. Отключение —
firecrawlKeylessSearch=false/firecrawlKeylessFetch=false. - Дневные лимиты Firecrawl теперь
firecrawl:free/firecrawl:key.
Исправлено
category=news+freshnessбольше не теряет freshness через Firecrawl; такие попытки невалидны.- Tavily
general+freshnessневалиден, потому чтоdaysу Tavily работает только для news. take_screenshot=trueбольше не возвращает успех без скриншота; попытка уходит в fallback.- Все ключи провайдера делят один keyed-лимит;
firecrawl:key#2не становится безлимитным. - Пустой список допустимых попыток объясняет причину фильтров, а не
all providers failed ().
Совместимость и миграция
- Существующие конфиги работают без изменений.
- Новый default order включает Keenable; отключение —
keenableEnabled=falseили удаление изsearchProviderOrder. - Firecrawl переведён на v2; keyless search/extract — новая облачная граница по умолчанию.
- При
allowInternalUrls=trueвнутренние цели обслуживает только локальныйreadability. attempts[]не добавлялся; диагностика остаётся вskipped[].
Проверки
- 130/130 offline tests;
node --checkчистый; preflightFAIL=0. - Exact candidate прошёл изолированный DSH test server: install, health 200, плагин в boot-манифесте, затем cleanup.
- Тот же candidate принят в production до публикации: сервис active, health 200, плагин в boot-манифесте.
- Visual acceptance явно отменён владельцем проекта для этого релиза.
Связанные работы
- Gitea issue #62; feature PR #63; release PR #64.
- Plugin commit
f629ec2; Gitea tagv0.2.2; GitHub mirror commit343a364. - Пакет: https://www.npmjs.com/package/@goodandready/dsh-web-gateway/v/0.2.2
Deploy и rollback
- После публикации production переключается с временного
.tgzcandidate на точную registry-версию0.2.2, затем повторяются health/smoke проверки. - Rollback: установить
@goodandready/dsh-web-gateway@0.2.1из registry и перезапустить DSH web service.
v0.1.6 — Security hardening and identity consistency
English
Release v0.1.6 focuses on security hardening against Server-Side Request Forgery (SSRF) and package identity alignment.
Changes
- IPv6 SSRF Protection:
isPublicIpv6now parses IPv6 addresses into 8 16-bit words and validates IPv4-mapped addresses in hex (::ffff:7f00:1,::ffff:a9fe:a9fe) and dot-decimal forms againstisPublicIpv4. Unspecified (::), multicast (ff00::/8), link-local, ULA, and documentation ranges are strictly blocked (#19). - SSRF Redirect Hardening:
readabilityExtractenforces manual redirect handling, verifying each intermediate target URL against public IP and scheme policies before issuing the next fetch, preventing redirect bypasses to loopback/metadata services (#20). - Host Export Identity: aligned
export const nameinlib/index.jswith@goodandready/dsh-web-gatewayacross package, patch, and browser loader (#34).
Correspondence
- Gitea commit:
7efcf3bb606c0e8f84451928b6b7226ae270d6ab - Mirror commit:
f4bca4351ac609b689e96c22c75a1c75c8459b39
简体中文
版本 v0.1.6 专注于防范服务端请求伪造(SSRF)安全加固以及包标识一致性。
变更
- IPv6 SSRF 防护:
isPublicIpv6现在将 IPv6 地址解析为 8 个 16 位字,并通过isPublicIpv4严格校验十六进制(::ffff:7f00:1、::ffff:a9fe:a9fe)和点分十进制形式的 IPv4 映射地址。严密拦截未指定地址(::)、组播(ff00::/8)、链路本地、ULA 和文档测试地址段(#19)。 - 重定向 SSRF 拦截:
readabilityExtract改用手动重定向模式,在执行下一次请求前先使用assertExtractUrlAllowed验证每个重定向目标 URL 的公网 IP 与协议,防止通过 302 重定向绕过访问本地回环与元数据服务(#20)。 - 主机导出名称对齐:将
lib/index.js中的export const name对齐为@goodandready/dsh-web-gateway,与 package、patch 和浏览器加载器保持一致(#34)。
提交对应
- Gitea 提交:
7efcf3bb606c0e8f84451928b6b7226ae270d6ab - 镜像提交:
f4bca4351ac609b689e96c22c75a1c75c8459b39
Русский
Релиз v0.1.6 направлен на устранение уязвимостей SSRF (Server-Side Request Forgery) и синхронизацию имени хост-экспорта с публичной идентичностью пакета.
Изменения
- Защита от SSRF в IPv6: функция
isPublicIpv6теперь полноценно парсит IPv6-адреса на 8 16-битных слов и проверяет IPv4-mapped адреса как в шестнадцатеричном виде (::ffff:7f00:1,::ffff:a9fe:a9fe), так и в точечном виде черезisPublicIpv4. Заблокированы:::(unspecified),ff00::/8(multicast),fe80::/10(link-local),fc00::/7(ULA) и2001:db8::/32(documentation) (#19). - Валидация редиректов:
readabilityExtractпереведён в режимredirect: 'manual', проверяя каждый промежуточный URL из заголовкаLocationчерезassertExtractUrlAllowedдо отправки запроса. Это предотвращает SSRF-обход через 302 редирект на127.0.0.1или169.254.169.254(#20). - Идентичность экспорта хоста: экспорт
export const nameвlib/index.jsприведён к значению@goodandready/dsh-web-gatewayв полном соответствии сpackage.json,cordis.patch.ymlи загрузчиком клиента (#34).
Соответствие коммитов
- Gitea commit:
7efcf3bb606c0e8f84451928b6b7226ae270d6ab - Mirror commit:
f4bca4351ac609b689e96c22c75a1c75c8459b39
v0.1.5 — Search resilience, circuit breaker and token efficiency
@goodandready/dsh-web-gateway v0.1.5
Release 1 (Phase D) — Core search resilience, provider circuit breaker, and token-efficient content pruning.
Added
- Brave Search API (
brave): Global independent index search withBRAVE_API_KEYcredential support. - Keyless DuckDuckGo Fallback (
duckduckgo): Free search fallback without requiring API keys or local SearXNG. - Circuit Breaker: Automatically pauses providers on consecutive 4xx/5xx or rate-limit errors (threshold 3, 5-minute cooldown), avoiding long agent timeouts.
- Token-Efficient Content Pruning: Strips cookie notices, navigation lists, social links, and collapses excessive blank lines while preserving code blocks and tables (
compact: true). - Category-Aware Search: Added
categoryparameter (general,news,code,academic) mapped to provider-native filters. - Structured Document Extraction: Support for
.csv,.json,.txtand PDF document links inweb_gateway_extract. - Settings card controls for new daily caps, circuit breaker threshold, and compact extract mode.
Verification
- 52/52 tests pass (
npm test) - Syntax check clean (
npm run check) - Pack dry-run verified (
npm pack --dry-run) - SSRF protection maintained
Provenance
- Gitea:
49fdc44eaf6b392c05f67f0f8f5301ab7d81fe0e - GitHub Mirror:
5116f1a86c3c9b3f51032ab01bd4a4dd90584bf5
v0.1.4
English
Settings no longer wait on the removed settingsScope service. The client reads its namespace from configForms.
中文
设置不再等待已移除的 settingsScope 服务。客户端通过 configForms 读取自己的命名空间。
Русский
Настройки больше не ждут удалённый сервис settingsScope. Клиент читает свой namespace через configForms.
@goodandready/dsh-web-gateway v0.1.3
@goodandready/dsh-web-gateway v0.1.3
Feature release after roadmap phases A+B+C.
Transparency & control
- Tool responses include
provider,skipped[],cached - Configurable provider order
- Settings health (credentials present/missing + local endpoint ping)
Query quality & cost
- Domain include/exclude + freshness
- Disk-backed profile cache
- Per-provider daily caps (UTC)
Agent power
web_gateway_research(search → top-N extract → brief)- Keyless extract: Jina Reader + HTML readability
Correspondence
| Tree | SHA |
|---|---|
Gitea main |
6b81cb23ee6b3d26d728555cd59c644a5014997b |
| GitHub mirror | b8f4eb2cab9b0fa5002238ced6a5eefb18b126b5 |
Install
dsh plugin add @goodandready/dsh-web-gateway@0.1.3中文
A+B+C 功能发布:透明回退、域名/时效过滤、磁盘缓存、日限额、web_gateway_research、Jina/readability 无密钥提取。
Русский
Релиз A+B+C: прозрачный fallback, фильтры/freshness, disk-кэш, daily caps, web_gateway_research, keyless extract (Jina/readability).
@goodandready/dsh-web-gateway v0.1.2
@goodandready/dsh-web-gateway v0.1.2
Resilient web search and page extract tools for DeepSeek Harness, with provider fallback and SSRF-safe extract.
Highlights
- Public package identity:
@goodandready/dsh-web-gateway - Tools:
web_gateway_search,web_gateway_extract - Settings card via
slots.inject(client activates correctly) - SSRF hardening for extract (private/link-local/metadata blocked)
- Trilingual README (EN / RU / ZH)
- Visual verification collage in
media/visual-verification.png
Correspondence
| Tree | SHA |
|---|---|
Gitea main |
8ce0835b70be808e34f09d3ba73b28791f56065b |
| GitHub mirror | 468c0fd99ae72c012e72f34cb237d759d5c9344e |
Install
dsh plugin add @goodandready/dsh-web-gateway@0.1.2Links
- npm: https://www.npmjs.com/package/@goodandready/dsh-web-gateway
- Repo: https://github.com/GooDAnDReaDY/dsh-web-gateway
中文
面向 DeepSeek Harness 的稳健网页搜索与页面提取工具,支持提供商回退与 SSRF 安全提取。
要点
- 公开包名:
@goodandready/dsh-web-gateway - 工具:
web_gateway_search、web_gateway_extract - 通过
slots.inject正确激活设置卡片 - 提取路径 SSRF 加固
- 三语文档与可视化验收图
安装
dsh plugin add @goodandready/dsh-web-gateway@0.1.2Русский
Устойчивый поиск и извлечение страниц для DeepSeek Harness с fallback провайдеров и SSRF-безопасным extract.
Главное
- Публичный пакет:
@goodandready/dsh-web-gateway - Инструменты:
web_gateway_search,web_gateway_extract - Карточка настроек через
slots.inject - SSRF-защита extract
- Документация EN/RU/ZH и visual verification
Установка
dsh plugin add @goodandready/dsh-web-gateway@0.1.2