小海
90be75ff9f
feat: add tool passthrough mode, identity leak sanitization & enhanced tool_choice=any
...
1. Tool passthrough mode (config: tools.passthrough: true)
- Bypasses multi-namespace few-shot injection
- Embeds raw tool definitions in <tools> tags with minimal 1-shot example
- Cleans conflicting client prompts (provider-native tool calling, XML markup)
- Ideal for Roo Code / Cline clients
2. Enhanced Cursor identity leak sanitization
- New refusal detection patterns for "currently in Cursor context" leaks
- 4 new sanitizeResponse regexes targeting full context leak paragraphs
- Covers "I apologize - it appears I'm in Cursor support assistant context"
3. Enhanced tool_choice=any force message
- Lists available tool names (up to 15) with format example
- Uses collaborative guidance tone to avoid triggering refusal
- Stream and non-stream paths aligned
2026-03-20 09:14:28 +08:00
Xu Kang
127f635592
Merge pull request #73 from huangzt/feature/vue-logs-ui
...
feat: 添加 Vue3 日志 UI(/vuelogs 路由 + 前端全面优化)
2026-03-20 08:58:37 +08:00
huangzhenting
54cb89c11a
feat: Vue UI 全面优化 — 暗色主题、搜索、交互、动效
2026-03-20 03:42:32 +08:00
huangzhenting
c868bf3074
feat: 添加 /vuelogs 路由(服务端)
2026-03-20 03:42:27 +08:00
Xu Kang
17a1633617
Merge pull request #72 from huangzt/feature/vue-logs-ui
...
feat: 新增 Vue3 日志查看界面 (/vuelogs)
2026-03-19 23:09:02 +08:00
huangzhenting
349c729d38
docs: 新增 vue-ui 开发说明文档
...
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 23:00:20 +08:00
huangzhenting
8e50c7bf9b
Merge remote-tracking branch 'origin/main' into feature/vue-logs-ui
2026-03-19 22:43:18 +08:00
huangzhenting
69983e3996
feat: 添加 Vue3 日志 UI — 新增 /vuelogs 路由及 vue-ui 前端目录
...
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 22:42:33 +08:00
chinadoiphin
f17353e05b
fix: 修复 Cursor 身份泄漏 — 模型声称只有 read_file/read_dir 工具 ( #68 )
...
问题:模型回复"在当前环境中我只有读取 Cursor 文档的工具
(read_file / read_dir),无法访问你的本地文件系统",
暴露了 Cursor 文档助手身份。
修复:
1. handleDirectTextStream 的 warmupChars 从 96 → 300,
与工具模式对齐,确保拒绝检测窗口覆盖完整的中文拒绝句式
2. constants.ts 新增 9 条中文拒绝检测规则,覆盖
"只有读取 Cursor/文档的工具"、"无法访问本地文件"、
"无法执行命令"、"需要在 Claude Code CLI 环境" 等新措辞
3. sanitizeResponse 新增 5 条清洗规则作为最后防线
2026-03-19 22:12:14 +08:00
小海
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