Skip to content

Releases: GooDAnDReaDY/dsh-web-gateway

v0.2.3 [DSH v0.2.1-rc.2]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 21 Oct 13:58

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 undici dispatcher.
  • 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 的补丁版本。

修复

  • 通过 undici dispatcher 启用提取 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 при соединении через undici dispatcher.
  • Маршруты 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.3

v0.2.2 [DSH v0.2.1-rc.2]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 21 Oct 11:27

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:free attempts run before provider:key attempts; provider and skipped expose the exact mode, e.g. firecrawl:free or firecrawl: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 local readability runs.
  • 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 + freshness no longer silently drops the freshness filter through Firecrawl; such attempts are ineligible.
  • Tavily general + freshness is ineligible because Tavily's days applies to news only.
  • take_screenshot=true no 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#2 can 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=false or remove it from searchProviderOrder.
  • 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 --check clean; preflight FAIL=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

Deploy and rollback

  • After publication the production profile is switched from the temporary .tgz candidate to the exact registry version 0.2.2, then health/smoke checks are repeated.
  • Rollback: install @goodandready/dsh-web-gateway@0.2.1 from 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 干净;preflight FAIL=0。
  • 精确候选包通过隔离 DSH 测试服务器:安装、health 200、启动清单中存在插件,然后清理。
  • 同一候选包在发布前通过 production 验收:服务 active、插件 health 200、启动清单中存在插件。
  • 本次发布由项目所有者明确豁免视觉验收。

相关工作

部署与回滚

  • 发布后将 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 чистый; preflight FAIL=0.
  • Exact candidate прошёл изолированный DSH test server: install, health 200, плагин в boot-манифесте, затем cleanup.
  • Тот же candidate принят в production до публикации: сервис active, health 200, плагин в boot-манифесте.
  • Visual acceptance явно отменён владельцем проекта для этого релиза.

Связанные работы

Deploy и rollback

  • После публикации production переключается с временного .tgz candidate на точную 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

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 26 Sep 18:50

English

Release v0.1.6 focuses on security hardening against Server-Side Request Forgery (SSRF) and package identity alignment.

Changes

  • IPv6 SSRF Protection: isPublicIpv6 now 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 against isPublicIpv4. Unspecified (::), multicast (ff00::/8), link-local, ULA, and documentation ranges are strictly blocked (#19).
  • SSRF Redirect Hardening: readabilityExtract enforces 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 name in lib/index.js with @goodandready/dsh-web-gateway across 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

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 24 Sep 17:31

@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 with BRAVE_API_KEY credential 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 category parameter (general, news, code, academic) mapped to provider-native filters.
  • Structured Document Extraction: Support for .csv, .json, .txt and PDF document links in web_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

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 22 Sep 14:21

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

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 21 Sep 18:19

@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

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 20 Sep 17:34

@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.2

Links


中文

面向 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