70 Commits

Author SHA1 Message Date
小海
a0af1c8934 feat: 可配置工具处理 + 修复 URL 图片兼容性
tools 配置:
- schema_mode: compact/full/names_only 三种 Schema 呈现模式
- description_max_length: 工具描述截断长度 (0=不截断)
- include_only/exclude: 工具白名单/黑名单过滤
- 启动 banner 显示 tools 配置摘要
- 日志记录完整工具描述(不再截断200字符)

图片 URL 修复:
- 归一化 Anthropic API source.url → source.data
- 支持 image/input_image 等多种客户端格式
- 图片下载添加 User-Agent 头(解决 Telegram 403)
- 增强日志:记录每张图片下载过程和结果
v2.7.2
2026-03-17 10:13:09 +08:00
小海
73651d1bc9 release: v2.7.2 — 日志查看器升级 + 工程化改进
- 日/夜主题切换、标题提取修复、前端静态文件分离
- 移除 WELL_KNOWN_TOOLS、config.yaml 模板化、Thinking 默认关闭
- README 新增日志查看器说明、配置表格、环境变量参考
2026-03-17 09:46:39 +08:00
小海
5b4210a270 chore: 默认关闭 thinking 2026-03-17 09:43:05 +08:00
小海
f40bfaee64 refactor: 移除 WELL_KNOWN_TOOLS 工具白名单
所有工具现在统一保留描述(截取前50字符),不再对特定工具名跳过描述。
2026-03-17 09:40:10 +08:00
小海
222485ca93 chore: 移除 config.yaml 跟踪 + 更新 README 使用说明
- config.yaml 加入 .gitignore(含敏感 token,不再上传)
- 新增 config.yaml.example 作为配置模板
- README 新增:日志查看器功能介绍、配置表格、环境变量参考
- README 更新:项目结构增加 public/ 目录说明
- .gitignore 清理重复条目 + 排除截图文件
2026-03-17 09:37:34 +08:00
小海
d388fefa21 feat(log-viewer): 日夜主题切换 + 标题提取修复
- 新增日/夜主题切换按钮(☀️/🌙),支持 localStorage 持久化,首次自动检测系统偏好
- 完整暗色主题 CSS 变量覆盖,所有 UI 元素适配
- 修复标题提取:过滤 <system-reminder> 注入内容和 Claude Code 引导语
- 日志页面前端重构为独立 HTML/CSS/JS 静态文件
- 登录页面样式同步更新为现代玻璃态主题
- Express 静态文件服务配置修复(兼容 v5 path-to-regexp)
2026-03-17 09:33:00 +08:00
小海
91679d39b3 fix: 修复 thinking 内容泄漏到正文 + PR#51 keepalive 定时器泄漏 (#53)
1. Thinking 提取修复 (Issue #53):
   - 用 indexOf/lastIndexOf 替换所有非贪婪正则 [\\s\\S]*?
   - 防止 thinking 内容包含 </thinking> 字面量时提前截断
   - 新增 extractThinking() 工具函数统一处理
   - 修复涉及 handler.ts、openai-handler.ts、streaming-text.ts

2. PR#51 keepalive 修复:
   - handleDirectTextStream 新增独立 keepalive + try/finally 清理
   - handleStream 的 keepalive 仅在工具模式分支创建,避免泄漏
2026-03-17 09:00:34 +08:00
Xu Kang
66b5d5d0b3 Merge pull request #51 from xiaoyun172/feat/streaming-text-output
改进普通响应的流式文本输出
2026-03-17 08:54:42 +08:00
xiaoyun172
ece889101c Improve incremental text streaming output 2026-03-16 21:58:09 +08:00
小海
a7994ccbd5 feat: add thinking toggle in config.yaml with highest priority
- Add `thinking.enabled` config option to globally control thinking on/off
- Config priority: env THINKING_ENABLED > config.yaml > client request
- When disabled, removes thinking param even if client requests it
- Applies to both Anthropic and OpenAI format handlers
2026-03-16 18:25:53 +08:00
小海
d366125a56 feat(v2.7.1): 智能压缩算法 + 可配置压缩系统 + 日志鉴权 + Thinking 修复
🗜️ 智能历史压缩算法:
- 修复 JSON Action 块截断: 工具调用消息摘要化, 不再切断代码块
- 工具结果 60% 头 + 40% 尾保留, 错误信息不丢失
- 修复非工具模式 few-shot 偏移量 Bug
- 普通文本在自然边界(换行符)处截断

⚙️ 可配置压缩系统 (config.yaml):
- compression.enabled: 开关
- compression.level: 1(轻度) / 2(中等) / 3(激进)
- compression.keep_recent / early_msg_max_chars: 高级覆盖
- 支持 COMPRESSION_ENABLED / COMPRESSION_LEVEL 环境变量

🔐 日志查看器鉴权:
- 配置 auth_tokens 后 /logs 及 API 端点需验证
- 精美登录页, token 缓存到 localStorage
- 支持 query/header/x-api-key 三种传入方式

🧠 Thinking 修复:
- 拒绝检测先剥离 <thinking> 标签, 防止误判
- OpenAI 格式默认启用 thinking
v2.7.1
2026-03-16 17:11:01 +08:00
小海
3458de0ac8 feat: 支持 Claude Code thinking 显示 (adaptive 模式)
- 修复 thinking 类型检测:支持 Claude Code 的 `adaptive` 类型(之前只检查 `enabled`)
- 区分 GUI/CLI thinking 策略:GUI(enabled)发 content block,CLI(adaptive)保留标签在正文中
- few-shot 示例包含 thinking:当 thinking 启用时,assistant 回复中演示 `<thinking>` 标签
- 优化短响应重试:仅在响应 <3 字符且不含数字时重试,避免 `2` `25岁` 等短回答被误判
- 验证发现 Claude Code signature 为密码学签名,无法伪造
2026-03-16 16:48:58 +08:00
小海
a848706613 refactor: 精简控制台输出 — 详细日志转移到 Web UI
- 移除 converter.ts 中 20+ 行诊断日志 (消息摘要/工具统计/图片处理)
- 移除 openai-handler.ts 中 3 行冗余日志
- 移除 vision.ts/tool-fixer.ts 中的过程日志
- 精简 index.ts 启动 banner (从 25 行大框→7 行树形)
- 仅保留: 错误/警告 + 启动信息 + logger.ts 核心请求一行日志
- 所有详细信息均可通过 /logs Web UI 查看
2026-03-16 15:59:57 +08:00
小海
84c26aa332 feat: 全链路日志系统 — Web UI + 详细请求/响应追踪
- 新增 logger.ts: 全链路日志记录器,支持完整请求/响应 payload 存储
- 新增 log-viewer.ts: Web UI 日志查看器 (/logs),SSE 实时推送
- UI 支持四个标签页: 日志、请求参数、提示词、响应内容
- 存储完整消息内容 (100K/条上限),支持展开/折叠查看
- 阶段耗时可视化 (receive → convert → send → response → stream)
- 修复 Cursor 消息格式 parts vs content 导致的 500 错误
- handler/openai-handler 集成全链路日志记录
- 控制台仅打印核心简短日志
2026-03-16 15:22:31 +08:00
小海
0e16861b2c fix: 连接保活 + 续写收敛优化 + 拒绝模式扩充
- 流式路径:每 15s 发送 SSE 注释 keepalive,防止 504 网关超时
- 非流式路径:chunked 空白字符保活,JSON.parse 天然兼容
- MAX_AUTO_CONTINUE 6→3,新增最小进展阈值(<100 chars 停止)
- 新增连续小增量检测(2 次 <500 chars 停止挤牙膏)
- 追加 15 条 REFUSAL_PATTERNS(EN scope/expertise + CN 中文拒绝)
v2.7.0
2026-03-16 11:43:16 +08:00
小海
f0ab29056f docs: 添加版本说明 — v2.7.0 基于 v2.5.6 回滚优化,v2.6.x 见 Tags 2026-03-16 09:52:53 +08:00
小海
85147d2fef fix: 远程URL图片下载转base64 — 修复OpenClaw/Telegram/ccagents等客户端的URL图片处理
- preprocessImages() 中检测 source.type='url' 的图片块
- 自动下载远程图片并转为 base64 格式
- 使用 vision proxy 下载(支持代理环境)
- 下载失败优雅降级为错误提示文本
- 同时更新 README(用户删除旧版更新日志)
2026-03-16 09:51:34 +08:00
小海
db41b741a5 docs: 更新 README 至 v2.7.0 — 新增功能说明 + 项目结构 + 配置项 + 更新日志 2026-03-16 09:48:12 +08:00
小海
48de59cba7 feat: v2.7.0 — API鉴权 + Thinking支持 + 动态预算 + response_format + Vision独立代理 + 拒绝模式更新
 新功能:
- API Token 鉴权 (auth_tokens): 公网部署安全,Bearer token / x-api-key 双模式
- Thinking 支持 (客户端驱动): Anthropic thinking block + OpenAI reasoning_content
- response_format 支持: json_object / json_schema + markdown 自动剥离
- Vision 独立代理 (vision.proxy): 图片API走代理,Cursor API保持直连

🔧 优化:
- 已知工具跳过描述 (WELL_KNOWN_TOOLS): 减少 ~30% 工具指令输入
- 动态工具结果预算 (getToolResultBudget): 替代固定 15K 限制
- isTruncated 重写: 消除反引号误判导致的无限重试
- 计费头清除: 清除 x-anthropic-billing-header 防注入警告

🛡️ 防御:
- 新增 4 个 Cursor 拒绝措辞匹配模式
2026-03-16 09:44:15 +08:00
小海
cb0bf5c632 feat: v2.5.6 — 渐进式历史压缩 + 续写智能去重 + 非流式续写对齐 + Token估算优化 + JSON解析器加固 v2.5.6 2026-03-12 10:48:54 +08:00
小海
3dceac115c fix: 修复长响应误判为拒绝 + 减少 tolerantParse 日志噪音 (v2.5.5)
- 工具模式下长文本(8654 chars)正文碰巧含拒绝关键词被误判,导致 Claude Code 死循环
- 截断响应(max_tokens)跳过拒绝检测;长响应仅检查前300字符
- tolerantParse 对非工具调用的 JSON 代码块降为 warn 级别日志
v2.5.5
2026-03-12 10:05:31 +08:00
小海
13098fb84d feat: 内网代理支持 (Issue #17)
- 新增 proxy-agent.ts: 基于 undici.ProxyAgent 让 Node.js fetch 走代理
- cursor-client.ts / vision.ts: 接入代理 dispatcher
- config.yaml: 补充代理配置说明 (含认证格式)
- 新增 16 个单元测试覆盖代理模块逻辑
- 版本升级至 v2.5.4
v2.5.4
2026-03-11 14:42:17 +08:00
小海
2bea3ce4d8 chore(release): v2.5.3 - Schema压缩+JSON感知解析器+续写重写 v2.5.3 2026-03-11 10:24:41 +08:00
小海
4b3715700b fix: 修复截断问题 - Schema压缩+JSON感知解析器+续写机制重写
三个关键修复:

1. Schema 压缩(converter.ts)
   - 新增 compactSchema() 将完整 JSON Schema 压缩为紧凑类型签名
   - 90 工具的 Schema 从 ~135k chars 降至 ~15k chars
   - 工具描述截断至 200 chars
   - 直接增大 Cursor API 输出预算(输入越小→输出越大)

2. JSON-string-aware 解析器(converter.ts)
   - 替换 parseToolCalls 的 lazy regex 为手动扫描器
   - 正确跳过 JSON 字符串内部的 ``` 标记
   - 修复 Write/Edit 工具 content 含 markdown 代码块时被提前截断的 bug
   - 新增截断代码块恢复(无闭合 ``` 时仍可解析工具调用)

3. 续写机制重写(handler.ts)
   - 续写请求增加 user 引导消息(解决模型返回空响应的问题)
   - 每次基于原始消息快照重建(防止上下文膨胀)
   - 提取最后 300 chars 作为续写锚点
   - 空响应时立即停止,避免无效循环
   - MAX_AUTO_CONTINUE 从 4 提升至 6
2026-03-11 10:21:27 +08:00
小海
ecf4fa82ee { "message": "fix: stop renaming file_path to path implicitly, and remove compression tests" } v2.5.2 2026-03-11 09:55:15 +08:00
小海
74f1a632a9 chore(release): v2.5.2 - Remove context compression and implement internal auto-continue 2026-03-11 09:54:10 +08:00
小海
d9c423027d docs: 更新 README 至 v2.5.1,新增压缩和截断检测特性说明 v2.5.1 2026-03-10 17:32:07 +08:00
小海
5f0f9b7936 feat: v2.5.1 - 上下文智能压缩 + 截断检测 + tolerantParse 增强
🗜️ 智能压缩
- 长对话老消息压缩而非丢弃,保留因果链语义
- 工具结果压缩为摘要,助手消息保留工具名
- 压缩率 70-80%,解决 Cursor 上下文溢出问题

⚠️ 截断检测
- 代码块/XML 未闭合时返回 stop_reason=max_tokens
- Claude Code 自动继续,无需手动点击"继续"

🔧 tolerantParse
- 新增正则兜底层,处理未转义双引号的 JSON
- 解决 position 5384 等长参数解析崩溃

🛡️ 拒绝 fallback 优化
- 工具模式下返回极短引导文本
2026-03-10 17:29:49 +08:00
小海
f12ca30893 feat(v2.5.0): Cursor IDE 完整适配 + 工具参数自动修复 + 增量流式优化
🖥️ Cursor IDE 适配:
- 新增 /v1/responses 端点(Responses API → Chat Completions 自动转换)
- 兼容 Cursor 扁平工具格式 { name, input_schema }
- 扩展 /v1/models 模型列表(claude-sonnet-4-5/4/3.5)
- 连续同角色消息自动合并(mergeConsecutiveRoles)
- content 数组中 tool_use/tool_result 块直接透传

🔧 工具参数自动修复 (tool-fixer.ts):
- normalizeToolArguments: file_path → path 字段名映射
- replaceSmartQuotes: 中文/法文智能引号替换
- repairExactMatchToolArguments: 模糊匹配修复
- extractToolResultNatural: 自然语言 tool_result 转换

🚀 流式增量优化:
- input_json_delta / tool_calls 按 128 字节分块
- 拒绝重试扩展到工具模式
- 极短响应自动重试

🧪 新增 44 个单元测试 (tool-fixer + openai-compat)
v2.5.0
2026-03-10 16:27:19 +08:00
小海
be9341af7c refactor: 版本号统一从 package.json 动态读取,去除所有硬编码 2026-03-10 15:16:22 +08:00
小海
24da706ffe chore: 同步 index.ts 版本号 + README changelog 至 v2.4.0 2026-03-10 15:15:38 +08:00
小海
ef9d36e8c4 chore: 升级版本号至 v2.4.0 v2.4.0 2026-03-10 15:13:24 +08:00
小海
c072795528 feat: 修复流式中断 + JSON 解析 + tool_choice 强制工具调用
核心修复:
- cursor-client.ts: 固定总超时 → 空闲超时,防止长输出被截断 (#12)
- converter.ts: tolerantParse 三级修复策略,处理截断 JSON (#13)
- types.ts: 新增 AnthropicToolChoice 类型,补齐 tool_choice 字段
- converter.ts: buildToolInstructions 支持 tool_choice,注入 MANDATORY 约束
- handler.ts: tool_choice=any 时检测无工具调用 → 自动追加强制消息重试

测试覆盖:
- test/unit-tolerant-parse.mjs: 18 个单元测试(tolerantParse/parseToolCalls)
- test/e2e-chat.mjs: 16 个 E2E 测试(基础问答、工具调用、流式、边界防御)
- test/e2e-agentic.mjs: 7 个 Agentic 压测(完整 Claude Code 工具链模拟)
- package.json: 新增 test:unit / test:e2e / test:agentic 快捷命令
2026-03-10 15:11:51 +08:00
小海
59d350b032 fix: 修复 README changelog 中的 emoji 乱码 v2.3.2 2026-03-06 14:45:20 +08:00
小海
41db85cb6f feat(v2.3.2): 视觉预处理统一化 + OpenAI防御强化 + 认知重构
📸 视觉预处理统一化 (修复 #8)
- 新增 preprocessImages() 在 convertToCursorRequest 入口统一处理图片
- 修复 Claude CLI 图片不进 vision 预处理的 bug
- extractMessageText 新增 case 'image' 兜底处理
- Express body 限制 10MB → 50MB 支持大图

🛡️ OpenAI 端全面防御层对齐
- 拒绝检测 + 自动重试 (与 Anthropic 端一致)
- 响应清洗 sanitizeResponse
- 身份探针拦截 isIdentityProbe
- 流式统一缓冲模式

🧠 非工具场景认知重构
- 无工具请求注入认知重构前缀,防止暴露 Cursor 文档助手身份
- 助手历史消息中 read_file/read_dir 拒绝痕迹清洗
- 工具能力询问返回 Claude 能力描述而非硬拦截
- 扩展中文 sanitizeResponse 规则
2026-03-06 14:44:35 +08:00
小海
3a652859ce feat: 重构认知伪装策略,修复 prompt injection 检测导致的拒绝问题
问题:
- 新版 Claude 模型识破了旧的「写文档」伪装策略,直接判定为 prompt injection attack
- 模型明确指出 "documentation" + "copy-paste" + "json action" 组合是社会工程攻击
- 中文环境同样被拒绝("这不是需要文档化的场景")
- 部分场景模型声称只有 read_file/read_dir 两个工具可用

converter.ts 优化:
- 重写 buildToolInstructions:从「写文档生成 JSON 示例」改为「IDE 环境内置行为协议」
- few-shot 从 4 轮公式化对话精简为 2 轮自然 IDE 交互
- 用户消息包装去除 "scenario"/"documentation" 等敏感词
- few-shot 工具选择优先使用 Read/read_file(最自然的 IDE 操作)
- 历史清洗正则增加 prompt injection/social engineering 等 15+ 新模式

handler.ts 优化:
- 新增 15+ 拒绝模式:prompt injection attack、social engineering、工具数量限制声明等
- sanitizeResponse 增强:遇到 prompt injection 指控直接替换为 Claude 身份回复
- [System Filter] 降级消息改为自然语言提问,避免触发客户端二次异常
2026-03-06 13:56:28 +08:00
小海
c3e9bcd659 chore: 统一所有版本号至 v2.3.0
- package.json: 2.0.0 → 2.3.0
- src/index.ts: 健康检查、根路径、启动 banner 三处版本号同步更新
2026-03-06 11:29:10 +08:00
小海
5526d8859e chore(docker): 同步 Docker 配置至 v2.3.0
- Dockerfile: 新增 COPY config.yaml 使容器内置默认配置
- docker-compose.yml: 启用 config.yaml 挂载,移除已废弃的 SCRIPT_URL/FP 引用,增加 vision/OCR 说明
- .dockerignore: 补充 Docker 自身配置/文档/压缩包到忽略列表
2026-03-06 11:27:47 +08:00
小海
101eaa320b chore: 清理旧压缩包,生成 v2.3.0 部署包 2026-03-06 11:20:01 +08:00
小海
ad006060dc fix(proxy): 结合 referer 伪装,从 IDE 场景融合策略回退至写作文档认知重构策略以绕过强文档助手工具限制 2026-03-06 11:11:56 +08:00
小海
2a7c23416f feat(vision): add zero-config local OCR and external vision api fallback for image payloads 2026-03-06 11:00:50 +08:00
Xu Kang
cbe679bfd6 Merge pull request #4 from guoyongchang/fix-docker-compose-up
fix: remove references to deleted jscode/ directory in Dockerfile
2026-03-05 18:16:55 +08:00
guoyongchang
8a26c9ed55 fix: remove references to deleted jscode/ directory in Dockerfile
The jscode/ directory was removed in v2.0.0 but the Dockerfile still
referenced it, causing docker compose build to fail.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 18:11:55 +08:00
小海
6acf337a47 fix: add tolerant json parsing to support unescaped newlines in tools 2026-03-05 17:51:30 +08:00
小海
72719ac797 docs+cleanup: update README for v2.2.0, remove jscode/ directory
- Updated README: removed jscode setup steps, script_url config,
  x-is-human Token section; updated project structure; added v2.2.0
  changelog with identity protection and code cleanup details
- Deleted jscode/ directory (env.js, main.js, README.md) - no longer
  needed since token generation was removed
- Updated defense layer table (L3: 50+ patterns, L4: sanitizeResponse)
2026-03-05 17:23:54 +08:00
小海
184cabf5cc refactor: remove dead x-is-human token generation system
Cursor no longer validates the x-is-human header, so the entire token
generation pipeline was dead code producing only error logs.

Removed:
- loadScripts(), fetchCursorScript(), generateToken(), replenishPool(),
  getXIsHumanToken() and token pool management from cursor-client.ts
- scriptUrl config field and SCRIPT_URL env var support
- unmaskedVendorWebGL/unmaskedRendererWebGL fingerprint fields
- jscode/ script loading (env.js, main.js templates)
- script_url and WebGL fields from config.yaml

Kept:
- Chrome TLS fingerprint headers (user-agent, sec-ch-ua, etc.)
- x-is-human header sent as empty string (Cursor accepts it)
2026-03-05 17:20:51 +08:00
小海
03a3484067 feat(identity): add topic refusal detection + enhanced response sanitization
- Added 9 English topic refusal patterns (e.g. \"help with coding and Cursor IDE\",
  \"unrelated to programming or Cursor\", \"Cursor-related question\")
- Added 3 Chinese topic refusal patterns
- Enhanced sanitizeResponse with topic-refusal text replacement:
  - \"Cursor IDE features\" → \"AI capabilities\"
  - \"unrelated to programming or Cursor\" → \"a general knowledge question\"
  - \"Cursor or coding documentation\" → \"relevant documentation\"
  - Straggler \"and Cursor\" / \"or Cursor\" cleanup
- Fixed double-word artifacts in sanitization output
- Removed overly broad /unable\\s+to/i pattern to reduce false positives
2026-03-05 17:13:31 +08:00
小海
3a7575cdeb feat(identity): three-layer identity protection - broadened probe detection, response sanitization, Claude fallback
1. Expanded identity probe detection with keyword-based matching (Chinese & English)
   - Catches questions about model, platform, system prompt, real identity
   - Agent mode (with tools) bypasses probe detection
2. Added sanitizeResponse() post-processor for ALL responses
   - Replaces Cursor identity references with Claude equivalents
   - Covers both English and Chinese Cursor persona leaks
3. Added Chinese refusal patterns (14 new regexes)
4. Auto-retry with IDE-context reframing on refusal (max 2 retries)
5. Refusal fallback now returns Claude identity response instead of [System] filter message
2026-03-05 17:02:56 +08:00
小海
89e4f5eb99 v2.1.0: Prompt strategy overhaul - Cursor IDE scene-fusion, remove tool whitelist, multi-layer refusal defense, context sanitization 2026-03-05 15:30:14 +08:00
小海
53740f7300 Expand refusal patterns: catch 'coding assistant', 'focused on software development' and other new refusal variants 2026-03-05 15:26:02 +08:00