@goodandready/dsh-clinebot 0.6.30 → 0.6.31

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/CHANGELOG.md CHANGED
@@ -5,6 +5,12 @@ All notable changes to `@goodandready/dsh-clinebot` will be documented in this f
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.6.31] - 2026-11-07
9
+
10
+ ### Security & Bug Fixes
11
+ - **Profile Data Isolation (`DSH_HOME`)**: Stats, event logs, price cache, and models cache resolve strictly within the active `DSH_HOME` directory, preventing data leakage into `$HOME/.dsh` when isolated profiles are configured (#299).
12
+ - **Updater Hostname Hardening**: Origin hostname verification in `isTrustedUpdateRequest` now strictly uses `isLoopbackHostname`, rejecting non-loopback domains starting with `127.` such as `127.attacker.example` (#294).
13
+
8
14
  ## [0.6.30] - 2026-11-06
9
15
 
10
16
  ### Fixed
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  <h3>Native ClineBot / ClinePass Provider Companion for DeepSeek Harness</h3>
6
6
 
7
- <p><b>0.6.30</b> fixes a stream idle timer race in Node 22 (removing <code>timer.unref()</code> to prevent premature event loop termination) and defaults on-screen UI badges (sidebar quota meter and composer session cost) to disabled so users can enable them explicitly in Settings -> ClineBot -> Integrations. It keeps the complete security boundary, DSH <code>0.2.2-rc.1</code> support, automatic model/free/dated catalog backfill, model-scoped credit cooldowns and 402/413 errors. Chat runs on the native <code>ctx.llm</code> adapter; the legacy <code>llm-pi-ai</code>, loopback proxy and <code>llm/stream</code> path are removed.</p>
7
+ <p><b>0.6.31</b> ensures strict profile data isolation (telemetry, stats, events, and price cache resolve strictly inside active <code>DSH_HOME</code> without leaking into <code>~/.dsh</code>, #299) and hardens updater loopback verification (origin hostname check with <code>isLoopbackHostname</code> rejects external domains like <code>127.attacker.example</code>, #294). Maintains full security boundary, default-disabled screen badges (#297), DSH <code>0.2.2-rc.1</code> compatibility, and native <code>ctx.llm</code> adapter.</p>
8
8
 
9
9
  <p align="center">
10
10
  <a href="https://www.npmjs.com/package/@goodandready/dsh-clinebot"><img src="https://img.shields.io/npm/v/@goodandready/dsh-clinebot.svg?style=for-the-badge&color=6366f1&labelColor=1e1b4b" alt="npm version"></a>
package/README.ru.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  <h3>Нативное подключение провайдера ClineBot / ClinePass для DeepSeek Harness</h3>
6
6
 
7
- <p><b>0.6.30</b> исправляет гонку idle-таймера стрима в Node 22 (удален вызов <code>timer.unref()</code> для предотвращения преждевременного завершения цикла событий) и переводит экранные значки (квоту в сайдбаре и индикатор стоимости в композере) в состояние выключено по умолчанию для явного включения пользователем в «Настройки → ClineBot → Интеграции». Сохраняются полная security-граница, поддержка DSH <code>0.2.2-rc.1</code>, автодобор каталога моделей/FREE/dated, cooldown недостатка кредитов для конкретной модели и ошибки 402/413. Чат работает через нативный адаптер <code>ctx.llm</code>; старые <code>llm-pi-ai</code>, loopback-прокси и <code>llm/stream</code> удалены.</p>
7
+ <p><b>0.6.31</b> обеспечивает строгую изоляцию профилей (телеметрия, статистика, логи событий и кэш цен сохраняются строго внутри активного <code>DSH_HOME</code> без утечки в <code>~/.dsh</code>, #299) и усиливает безопасность updater'а (проверка origin hostname через <code>isLoopbackHostname</code> отклоняет домены вида <code>127.attacker.example</code>, #294). Сохраняются полная security-граница, экранные значки, отключенные по умолчанию (#297), поддержка DSH <code>0.2.2-rc.1</code> и нативный адаптер <code>ctx.llm</code>.</p>
8
8
 
9
9
  <p align="center">
10
10
  <a href="https://www.npmjs.com/package/@goodandready/dsh-clinebot"><img src="https://img.shields.io/npm/v/@goodandready/dsh-clinebot.svg?style=for-the-badge&color=6366f1&labelColor=1e1b4b" alt="npm version"></a>
package/README.zh.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  <h3>适用于 DeepSeek Harness 的 ClineBot / ClinePass 原生模型提供商伴侣插件</h3>
6
6
 
7
- <p><b>0.6.30</b> 修复 Node 22 中的流式传输空闲定时器竞争问题(移除 <code>timer.unref()</code> 以防止事件循环提前终止),并将屏幕徽标/指示器(侧边栏配额表和编辑器会话费用)默认设为禁用,供用户在“设置 -> ClineBot -> 集成”中显式启用。保留完整的安全边界、DSH <code>0.2.2-rc.1</code> 支持、模型/免费/日期变体自动补齐、按模型隔离的余额不足冷却和明确的 402/413 错误。聊天使用原生 <code>ctx.llm</code> 适配器;旧的 <code>llm-pi-ai</code>、回环代理和 <code>llm/stream</code> 已删除。</p>
7
+ <p><b>0.6.31</b> 保证严格的配置隔离(统计信息、遥测、事件日志与价格缓存严格存储在激活的 <code>DSH_HOME</code> 目录中,防止泄露至 <code>~/.dsh</code>,#299),并加固更新器的回环验证(通过 <code>isLoopbackHostname</code> 拒绝形如 <code>127.attacker.example</code> 的域名,#294)。保留完整安全边界、默认禁用的屏幕指示器 (#297)、DSH <code>0.2.2-rc.1</code> 兼容性及原生 <code>ctx.llm</code> 适配器。</p>
8
8
 
9
9
  <p align="center">
10
10
  <a href="https://www.npmjs.com/package/@goodandready/dsh-clinebot"><img src="https://img.shields.io/npm/v/@goodandready/dsh-clinebot.svg?style=for-the-badge&color=6366f1&labelColor=1e1b4b" alt="npm version"></a>
package/lib/http.js CHANGED
@@ -46,14 +46,14 @@ function header(request, name) {
46
46
  return Array.isArray(value) ? value[0] : value
47
47
  }
48
48
 
49
- function isLoopbackAddress(value) {
49
+ export function isLoopbackAddress(value) {
50
50
  const address = String(value || '').toLowerCase().replace(/^\[|\]$/g, '')
51
51
  return address === 'localhost' || address === 'localhost.' || address === '::1'
52
52
  || address.startsWith('127.')
53
53
  || address.startsWith('::ffff:127.')
54
54
  }
55
55
 
56
- function isLoopbackHostname(value) {
56
+ export function isLoopbackHostname(value) {
57
57
  const host = String(value || '').toLowerCase().replace(/^\[|\]$/g, '')
58
58
  if (host === 'localhost' || host === 'localhost.' || host === '::1') return true
59
59
  const parts = host.split('.')