小海
f6ad4292f8
fix: 会话隔离 — 基于内容哈希派生确定性会话 ID ( #56 )
...
修复 CC 执行 /clear 或 /new 后旧会话上下文残留的问题。
将 CursorChatRequest.id 从随机 shortId() 改为基于
system prompt + 首条用户消息的 SHA-256 哈希派生,
确保不同逻辑会话获得不同的 Cursor 会话 ID。
v2.7.5
2026-03-19 10:53:11 +08:00
小海
14aa65349c
feat: v2.7.5 — 常量集中管理 + 自定义拒绝规则 + 响应清洗开关
...
🏗️ 常量集中管理
- 新增 constants.ts,提取 REFUSAL_PATTERNS、IDENTITY_PROBE_PATTERNS、
TOOL_CAPABILITY_PATTERNS、CLAUDE_IDENTITY_RESPONSE、CLAUDE_TOOLS_RESPONSE
- isRefusal() 统一导出,内置 + 自定义规则合并检测
🔧 自定义拒绝检测规则 (config.yaml: refusal_patterns)
- 用户可添加自定义正则匹配规则,追加到内置列表
- 无效正则自动退化为字面量匹配
- 缓存编译 + 热重载支持
🔀 响应内容清洗开关 (config.yaml: sanitize_response)
- 控制 sanitizeResponse() 是否替换 Cursor 身份引用为 Claude
- 默认关闭,关闭时零开销
- 支持环境变量 SANITIZE_RESPONSE 覆盖
2026-03-19 09:44:21 +08:00
小海
e15dd5af33
fix: 压缩上下文后首条消息返回"你有什么问题吗"的问题 ( #68 )
...
CC 压缩后,消息主体全是 XML 标签(压缩的上下文摘要),
剥离标签后 actualQuery 为空,回退保留了完整 XML 内容,
但追加的 suffix 是通用的"Respond with structured format",
模型看不到具体任务 → 回答"你有什么问题吗?"
修复:检测到压缩回退场景时,改用上下文感知的引导指令:
"Based on the context above, determine the next step and
proceed..." + "Do NOT ask the user what they want",
让模型直接根据压缩上下文继续工作,而非等待新指令。
2026-03-19 09:26:15 +08:00
小海
1dd24ca84d
feat: 多类别 few-shot 示范,提升 MCP/Skills/Plugins 工具调用率 ( #67 )
...
问题:模型只模仿 few-shot 中见过的工具(Read/Bash),
导致 MCP 工具、Skills、Plugins 等第三方工具从不被调用。
修复:
- 按命名空间/来源自动分组第三方工具(MCP 双下划线、
驼峰前缀、蛇形前缀等规则)
- 每个命名空间选一个代表性工具加入 few-shot 示范
- 核心工具(Read/Bash) + 最多 4 个第三方工具代表
- 在单个 assistant 回复中展示多工具调用格式
- 第三方工具的示例参数从 schema 中自动提取
示例:如果用户有 mcp__context7、SuperPowers、claude_mem
等不同来源的工具,few-shot 会各选一个代表进行示范,
让模型知道所有类别的工具都可以调用。
2026-03-19 09:23:38 +08:00
小海
4bd6066dda
fix: 检测模型退化循环输出并自动中止流 ( #66 )
...
当 Cursor 后端模型陷入退化循环时(不断重复输出 </s>、</br> 等
短文本标记),会导致内容输出一点就停止、后台日志充斥大量
重复标记的现象。
修复方案:在 cursor-client.ts SSE 解析层加入退化重复检测器:
- 跟踪连续相同的 text-delta(仅检测 ≤20 字符的短 token)
- 同一 delta 连续出现 ≥8 次时判定为退化循环
- 立即中止流(reader.cancel),保留已收到的有效内容
- 外层 sendCursorRequest 识别 DEGENERATE_LOOP_ABORTED 后
不再重试(重试也会重蹈覆辙)
所有流式路径(Anthropic handler、OpenAI handler、续写)
自动受保护,无需逐个修改。
2026-03-19 09:14:29 +08:00
小海
53335aeeab
fix: 修复 SVG 图片导致 tesseract.js 崩溃的问题 ( #69 )
...
SVG 是基于 XML 的矢量图格式,tesseract.js 无法处理。
尝试对 SVG 进行 OCR 会在 tesseract Worker 内部通过 process.nextTick
抛出未捕获的 TypeError (fetch failed),导致整个进程异常终止。
修复方案:在三层防御点过滤 SVG 图片:
1. converter.ts preprocessImages(): 下载/读取后检测 content-type
或文件扩展名为 SVG 时,替换为文本描述
2. vision.ts applyVisionInterceptor(): 在分发到 OCR/Vision API
之前过滤 SVG 类型的 image block
3. vision.ts processWithLocalOCR(): 在调用 worker.recognize()
之前检查 UNSUPPORTED_OCR_TYPES 集合(纵深防御)
2026-03-19 09:06:40 +08:00
chinadoiphin
23c9f16dff
perf: 视觉拦截器仅处理最后一条 user 消息的图片
...
历史消息中的图片已在前几轮被转换为文本描述,无需重复送入
OCR/Vision API 处理。此优化避免多轮对话中重复消耗 API 配额
并减少每次请求的延迟。
2026-03-18 21:17:50 +08:00
chinadoiphin
c2dae870ca
feat: config.yaml 热重载支持(修改后无需重启服务)
...
- 重构 config.ts:提取 parseYamlConfig / applyEnvOverrides 为可复用函数
- 新增 initConfigWatcher:fs.watch + 500ms 防抖监听 config.yaml
- 端口变更仅警告(需重启),其余字段下一次请求即生效
- 中间件改用 getConfig() 实时读取,确保 auth_tokens 等热更新生效
- 新增 onConfigReload 回调机制、detectChanges 变更检测
- 优雅关闭:SIGTERM/SIGINT 时停止文件监听
- 环境变量覆盖始终保持最高优先级
2026-03-18 21:16:11 +08:00
小海
f9bebeb4b5
fix: thinking 检测位置约束,防止正文字面量误触发 (Issue #64 )
...
将所有 includes('<thinking>') 替换为 hasLeadingThinking(),
只在 <thinking> 出现在响应开头时才触发提取,
防止用户消息或模型正文中的字面量标签误触发 extractThinking 导致内容丢失。
v2.7.4
2026-03-18 14:06:53 +08:00
小海
8a5117bbb1
v2.7.4: 截断安全 + 代理续写禁用 + 日志提示词对比视图
...
- 截断时跳过工具解析,防止损坏的工具调用(写入半截文件)
- maxAutoContinue 默认 0,交由 Claude Code 原生续写
- 系统提示词身份声明清除(防 prompt injection 拒绝)
- 流式热身窗口 96→300 chars(拒绝检测前不释放文本)
- 日志查看器「提示词对比」视图:原始 vs Cursor 转换后
- 转换摘要面板:工具数/消息数/上下文大小一目了然
- 标题提取增强:通用 XML 标签清除 + 更多引导语过滤
2026-03-18 11:56:26 +08:00
小海
e6f3a06416
chore: 从版本控制中移除 .claude 本地配置
2026-03-18 10:37:04 +08:00
小海
59e9ef51c0
chore: 添加 CTF 测试脚本,更新 .gitignore
...
- 添加 e2e-ctf-bypass.mjs 和 e2e-ctf-proxy.mjs 测试脚本
- .gitignore: 忽略测试结果 JSON 文件 (test/*-results*.json)
- .gitignore: 忽略 .claude/ 本地配置目录
2026-03-18 10:36:08 +08:00
小海
8a6b11a4c7
perf: optimize prompt efficiency via A/B tested behaviorRules
...
- behaviorRules: append action-first directive reducing narration 37% (32%→20%)
\"Each response must be maximally efficient: omit preamble and planning text
when the next step is clear—go straight to the action block.\"
- Continuation suffix: shorten from ~180 chars to ~30 chars (83% token saving)
\"Based on the output above, continue working...\" → \"Continue with the next action.\"
- Add A/B test harnesses (e2e-prompt-ab.mjs, e2e-prompt-ab2.mjs) for future prompt tuning
Tested 4 variants × 17 scenarios. Candidate B won with:
- Narration ratio: 32% → 20%
- Response latency: 2372ms → 1795ms (↓24%)
- Zero over-action side effects
- 9/9 continuation scenarios passed
2026-03-18 10:34:38 +08:00
Xu Kang
af6449300f
Merge pull request #62 from majorcheng/main
...
Fix OpenAI stream usage in final chunk
2026-03-18 09:48:47 +08:00
小海
c06755c46c
perf: 早期中止拒绝检测 + 降低重试/续写上限 + 续写上下文截断
...
性能优化:
- sendCursorRequest 支持外部 AbortSignal,允许调用方提前中止流
- 工具模式 executeStream 在前 200-400 字符即检测拒绝,立即中止流
(原先等完整响应再检测,浪费 2-5s/次)
- MAX_REFUSAL_RETRIES 2→1,减少最差情况 API 调用次数
- maxAutoContinue 默认 3→2,减少续写开销
- 续写请求只发最后 2000 字符作为上下文(原先发完整响应,可能 10K+)
测试:
- 重写 perf-diag.mjs 公平对比:直连也使用相同 reframing 提示词
- 公平测试结果:代理平均 0.78x(比直连更快),无性能瓶颈
2026-03-18 09:46:36 +08:00
majorcheng
0768c52790
Merge branch '7836246:main' into main
2026-03-18 09:34:40 +08:00
majorcheng
ee8a7135dd
Fix OpenAI stream usage in final chunk
2026-03-18 09:19:37 +08:00
小海
18c90e0720
feat: 续写次数可配置 + 历史消息条数硬限制 ( #61 )
...
采纳社区建议,新增两个配置项:
1. max_auto_continue(默认 3,设 0 禁用)
- 替换了 handler.ts 中 4 处硬编码的 MAX_AUTO_CONTINUE = 3
- 设为 0 时 while 循环直接短路,完全禁用自动续写
- 用户可在对话中自行要求续写,往往更精准
2. max_history_messages(默认 100,-1 不限制)
- 在 converter.ts 消息转换后、压缩步骤前执行裁剪
- 保留 few-shot 示例(工具模式前 2 条),删除最早的非 few-shot 消息
- 防止 800+ 条消息导致请求体积过大、响应变慢
两项配置均支持 config.yaml 和环境变量(MAX_AUTO_CONTINUE / MAX_HISTORY_MESSAGES)
2026-03-18 09:10:08 +08:00
小海
5e0c9a3ce7
fix: 修复工具模式误续写导致的截断终止
...
避免短参数 tool_use 在已可恢复时继续隐式续写,减少 OpenClaw/Telegram 场景下的长时间挂起与 terminated。
同时统一 Anthropic 与 OpenAI 兼容接口的截断续写判定,并补充对应回归测试。
Made-with: Cursor
v2.7.3
2026-03-17 15:11:22 +08:00
小海
ed6181a5a9
fix: harden OpenAI multimodal compatibility and image handling
...
Tighten image path normalization, preserve multimodal request content across OpenAI-compatible endpoints, and fail fast on unsupported image_file inputs so clients get predictable behavior instead of silent degradation.
Made-with: Cursor
2026-03-17 15:03:39 +08:00
小海
447dad8c03
fix: thinking 未配置时不再自动注入,跟随客户端请求
...
Made-with: Cursor
2026-03-17 14:42:33 +08:00
小海
e7ffa90a94
fix: Dockerfile 补充 COPY public 目录(日志查看器静态资源)
...
Made-with: Cursor
2026-03-17 14:40:04 +08:00
小海
fd9d17a49e
release: v2.7.3 — 统一 thinking 剥离 + 拒绝检测增强 + Docker 部署优化
...
Made-with: Cursor
2026-03-17 14:28:31 +08:00
小海
70d8da273d
feat: implement proper OpenAI Responses API streaming format for Codex compatibility
...
Fix "stream disconnected before completion: stream closed before response.completed"
error when using Codex CLI. The /v1/responses endpoint was outputting Chat Completions
SSE format (data-only) instead of the Responses API SSE format with event: prefixes.
Codex expects specific SSE events:
- response.created / response.in_progress
- response.output_text.delta (incremental text)
- response.function_call_arguments.delta (tool calls)
- response.completed (★ the critical event Codex waits for)
Changes:
- Rewrite handleOpenAIResponses() with dedicated stream/non-stream handlers
- Add writeResponsesSSE() for event: + data: format
- Support function_call output items for tool calls
- Add error recovery that always emits response.completed
- Add identity probe mock responses in Responses API format
2026-03-17 13:52:05 +08:00
小海
85d8666eeb
fix: 修复纯字符串 content 中的图片路径无法提取的根因 ( #39 )
...
核心修复:
- Phase 1.5 现在同时处理 string content 和 array content
(之前仅处理 Array.isArray 的情况,跳过了纯字符串)
- 重写正则引擎:使用 [^\\s\"')\\]] 替代 [\\w.\\/-]
匹配含 UUID/连字符的路径 (如 file_362---eb90f5a2-xxx.jpg)
- 新增图片诊断日志:记录客户端发送的 content 格式
帮助定位不同客户端的图片格式差异
2026-03-17 12:27:51 +08:00
小海
292c8c4557
fix: 修复 CC 自动压缩后模型丢失任务上下文的问题
...
- 检测 XML 标签剥离后 actualQuery 为空的情况(压缩产物),
回退到不分离模式,保留完整消息内容
- 增强 tool_result 续航指令,明确引导模型继续执行上下文中的任务
2026-03-17 11:54:38 +08:00
小海
e2acdd186d
fix: 修复 OpenClaw/Telegram 等客户端图片处理失败问题 ( #39 )
...
- 新增本地文件路径图片读取支持 (readFileSync)
- 新增文本消息中嵌入图片 URL/路径自动提取
- 新增 file:// URL 解析支持
- OpenAI handler 新增 image_file、扁平 url、通用兜底等格式兼容
- 修复 OpenClaw {{MediaPath}} 本地路径无法被 fetch() 处理的根因
2026-03-17 10:56:38 +08:00
小海
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