deepccc 0.2.27 → 0.2.29

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/README.md CHANGED
@@ -68,7 +68,7 @@ npm run dev
68
68
  - 本地工具:代码搜索、文件读写、补丁、命令执行、Git、网页搜索和抓取
69
69
  - 权限审批:危险命令在会话时间线中暂停,支持拒绝、允许一次、会话允许和永久允许
70
70
  - 上下文管理:自动压缩、原始流日志和跨会话历史检索
71
- - 长会话校准:当前状态覆盖旧建议,摘要区分历史/事实/推断/局限;轮内工具结果有独立预算,避免多步调查持续膨胀
71
+ - 长会话校准:当前状态覆盖旧建议,摘要区分历史/事实/推断/局限;关键设定保留来源,区分用户确认、助手写入与助手推断;轮内工具结果有独立预算,避免多步调查持续膨胀
72
72
  - 项目约定:自动加载 AGENTS.md、CLAUDE.md、系统提示和目录式 Skills
73
73
  - 项目理解:可控搜索范围、按需本地项目地图、源文件变化即失效的证据笔记;不针对特定业务仓库,详见 [项目理解与搜索](docs/workspace-understanding.md)
74
74
  - 自动化:`deepccc-cli --stream-json` 提供稳定 JSONL 事件接口
@@ -163,11 +163,11 @@ Web UI 支持新建、恢复、重命名和删除多会话,多个会话可以
163
163
 
164
164
  模型文本、reasoning 心跳和工具事件通过 SSE 实时更新。每轮消息按真实发生顺序持久化和回放,因此刷新后仍会保持“阶段说明 → 工具调用 → 后续结论”的交错时间线;旧版会话没有顺序数据时,会兼容显示为“工具调用 → 最终回答”。每次工具调用与对应结果合并成一张卡片,折叠态显示 emoji、工具名、状态和关键参数;展开后调用参数默认保留前 8/后 4 行,工具结果保留前 12/后 6 行,省略内容可继续展开。工具卡及省略行的展开状态保存在当前浏览器标签页的 `sessionStorage`,持续生成、切换会话和刷新页面均不会自动收起。消息正文支持标题、表格、列表、引用、链接和代码块等常用 Markdown。
165
165
 
166
- 图片会转换成模型可见的原生视觉输入。Web 支持选择、粘贴和拖拽 PNG/JPEG/WebP/GIF;CLI 可用 `--image` 或交互命令 `/image`。每条消息最多 10 张、单图最大 20 MiB、图片合计最大 24 MiB,单边最多 8192 像素;超限时提示分图或缩小,保留原图细节。附件复制到 `~/.deepccc/attachments/<session-id>/`,聊天历史只保存引用,raw 日志过滤图片编码。删除 Web 会话时附件一并清理。
167
-
168
- 默认由当前模型直接看图。若主模型不支持视觉,可在 API 设置中指定 `visionModel`(如 `deepseek-flash`),或设置 `DEEPCCC_VISION_MODEL` / CLI `--vision-model`;该模型使用同一 API 协议、Base URL 和 Key,先分析图片,再由主模型结合观察继续任务。界面及 JSONL 会显示实际图片模型和模式。未配置图片模型的 `deepseek-v4-pro` 收图会明确报错;其他兼容模型需服务端支持图像,接口错误不会降级成“假装看过”。官方 DeepSeek 端点的旧 Flash 名称仅在视觉请求中映射到当前 `deepseek-flash`,自定义网关保留用户配置的名称。
169
-
170
- Agent 可用 `read_image` 查看本地截图、图表或工具产物,并通过 `question` 指定需要观察的细节;`present_file` 用于把图片展示给用户。后续追问会按预算重新加载近期图片;较早图片保留路径供 `read_image` 重新查看。独立图片模型的观察按原文问题、模型、端点与图片内容哈希缓存;细节追问可重新调用 `read_image`。压缩后的摘要应保留重要图片引用,缺失或损坏图片会明确报错。本版本支持图片输入,不包含音频、视频或 PDF 原生输入。
166
+ 图片会转换成模型可见的原生视觉输入。Web 支持选择、粘贴和拖拽 PNG/JPEG/WebP/GIF;CLI 可用 `--image` 或交互命令 `/image`。每条消息最多 10 张、单图最大 20 MiB、图片合计最大 24 MiB,单边最多 8192 像素;超限时提示分图或缩小,保留原图细节。附件复制到 `~/.deepccc/attachments/<session-id>/`,聊天历史只保存引用,raw 日志过滤图片编码。删除 Web 会话时附件一并清理。
167
+
168
+ 默认由当前模型直接看图。若主模型不支持视觉,可在 API 设置中指定 `visionModel`(如 `deepseek-flash`),或设置 `DEEPCCC_VISION_MODEL` / CLI `--vision-model`;该模型使用同一 API 协议、Base URL 和 Key,先分析图片,再由主模型结合观察继续任务。界面及 JSONL 会显示实际图片模型和模式。未配置图片模型的 `deepseek-v4-pro` 收图会明确报错;其他兼容模型需服务端支持图像,接口错误不会降级成“假装看过”。官方 DeepSeek 端点的旧 Flash 名称仅在视觉请求中映射到当前 `deepseek-flash`,自定义网关保留用户配置的名称。
169
+
170
+ Agent 可用 `read_image` 查看本地截图、图表或工具产物,并通过 `question` 指定需要观察的细节;`present_file` 用于把图片展示给用户。后续追问会按预算重新加载近期图片;较早图片保留路径供 `read_image` 重新查看。独立图片模型的观察按原文问题、模型、端点与图片内容哈希缓存;细节追问可重新调用 `read_image`。压缩后的摘要应保留重要图片引用,缺失或损坏图片会明确报错。本版本支持图片输入,不包含音频、视频或 PDF 原生输入。
171
171
 
172
172
  API 设置采用单一 Provider 配置,支持 OpenAI-compatible 与 Anthropic Messages。完整 API Key 只保存在本机 `~/.deepccc/config.json`,浏览器读取设置时仅返回掩码。危险命令会在会话中暂停并请求“拒绝、允许一次、本会话允许、永久允许”,浏览器断开或审批超时默认拒绝。
173
173
 
@@ -244,22 +244,22 @@ deepccc-cli --provider anthropic --base-url https://api.example.com --api-key "$
244
244
  deepccc-cli --cwd /path/to/project
245
245
  ```
246
246
 
247
- 附加一张或多张本地图片(重复传入 `--image`;路径含空格时加引号):
247
+ 附加一张或多张本地图片(重复传入 `--image`;路径含空格时加引号):
248
248
 
249
249
  ```bash
250
- deepccc-cli --image ./error.png --image ./expected.webp
251
- ```
252
-
253
- 启动后再加图:输入 `/image "C:\截图\报错截图.png"`,看到“图片已加入下一条消息”后输入问题并回车。多图重复 `/image`;相对路径按会话工作目录(`--cwd`)解析。该命令在当前回复结束后使用。启动时的 `--image` 也只加入队列,随后输入问题发送。
254
-
255
- 脚本或纯命令模式可直接发送图片并获取 JSONL:
256
-
257
- ```bash
258
- deepccc-cli --model deepseek-flash --stream-json --prompt "解释截图里的错误" --image "./error screenshot.png"
259
- deepccc-cli --model deepseek-v4-pro --vision-model deepseek-flash --stream-json --prompt "对比两张图" --image ./before.png --image ./after.png
260
- ```
261
-
262
- 安装 ChatCCC 后提供的 `cccagent` 使用同一 CLI:将上述 `deepccc-cli` 换成 `cccagent` 即可。它读取 `~/.deepccc/config.json`、`DEEPCCC_*` 环境变量或命令行参数;ChatCCC 机器人里的 API 配置不会自动改写独立 CLI 配置。聊天窗口的图片粘贴/拖拽属于 Web 功能,纯终端请使用文件路径。
250
+ deepccc-cli --image ./error.png --image ./expected.webp
251
+ ```
252
+
253
+ 启动后再加图:输入 `/image "C:\截图\报错截图.png"`,看到“图片已加入下一条消息”后输入问题并回车。多图重复 `/image`;相对路径按会话工作目录(`--cwd`)解析。该命令在当前回复结束后使用。启动时的 `--image` 也只加入队列,随后输入问题发送。
254
+
255
+ 脚本或纯命令模式可直接发送图片并获取 JSONL:
256
+
257
+ ```bash
258
+ deepccc-cli --model deepseek-flash --stream-json --prompt "解释截图里的错误" --image "./error screenshot.png"
259
+ deepccc-cli --model deepseek-v4-pro --vision-model deepseek-flash --stream-json --prompt "对比两张图" --image ./before.png --image ./after.png
260
+ ```
261
+
262
+ 安装 ChatCCC 后提供的 `cccagent` 使用同一 CLI:将上述 `deepccc-cli` 换成 `cccagent` 即可。它读取 `~/.deepccc/config.json`、`DEEPCCC_*` 环境变量或命令行参数;ChatCCC 机器人里的 API 配置不会自动改写独立 CLI 配置。聊天窗口的图片粘贴/拖拽属于 Web 功能,纯终端请使用文件路径。
263
263
 
264
264
  恢复当前工作目录最近一次会话:
265
265
 
@@ -25,7 +25,7 @@ export type CompletionResult = {
25
25
  content: string;
26
26
  reasoning: string;
27
27
  } | {
28
- status: 'timed_out' | 'cancelled' | 'invalid_output' | 'error';
28
+ status: 'timed_out' | 'cancelled' | 'invalid_output' | 'context_limit' | 'error';
29
29
  diagnostic: {
30
30
  code: string;
31
31
  httpStatus?: number;
@@ -26,14 +26,17 @@ export class CompletionSession {
26
26
  if (timeout > 2147483647)
27
27
  throw new Error('Deadline exceeds timer capacity');
28
28
  const messages = JSON.parse(JSON.stringify(request.messages));
29
- if (JSON.stringify(messages).length > positive(request.maxContextChars ?? 1_000_000))
30
- throw new Error('Context budget exceeded');
29
+ const contextLimit = positive(request.maxContextChars ?? 1_000_000);
31
30
  const extensions = JSON.parse(JSON.stringify(request.extensions ?? {}));
32
31
  if (Object.keys(extensions).some(key => protectedKeys.has(key)) || JSON.stringify(extensions).length > 8192)
33
32
  throw new Error('Invalid request extension');
34
33
  const responseLimit = positive(request.maxResponseChars ?? 1_000_000);
35
34
  if (request.maxOutputTokens !== undefined)
36
35
  positive(request.maxOutputTokens);
36
+ // Size is a runtime outcome, not invalid configuration. Never echo input
37
+ // or contact the provider when the caller-owned context exceeds its budget.
38
+ if (JSON.stringify(messages).length > contextLimit)
39
+ return { status: 'context_limit', diagnostic: { code: 'context_budget_exceeded' }, metrics: { durationMs: performance.now() - started, modelCalls: 0 } };
37
40
  const controller = new AbortController();
38
41
  let expired = false;
39
42
  const cancel = () => controller.abort();
package/dist/context.js CHANGED
@@ -522,7 +522,7 @@ export function buildSummaryPrompt(plan) {
522
522
  "",
523
523
  "要求:",
524
524
  "- 重写整份摘要,不要在旧摘要后追加流水账。严格使用下面要求的标题;没有内容的章节写“无”。",
525
- "- `## 当前事实与状态`:只保留截至最新消息仍成立的项目状态、目标、约束和正在执行的工作。最新原始消息和明确纠正优先于旧摘要。",
525
+ "- `## 当前事实与状态`:只保留截至最新消息仍成立的项目状态、目标、约束和正在执行的工作。最新原始消息和明确纠正优先于旧摘要。关键设定要标明来源(用户原话/确认、助手写入文档、助手推断),不把助手写入或推断的内容记成“用户已确认”。",
526
526
  "- `## 仍待处理`:只列真正未完成且用户尚未撤销的事项。已完成、已回退、已拒绝或被新决策取代的内容禁止留在这里。",
527
527
  "- `## 已取代的历史`:用最短文字记录会影响理解的旧路线,以及它被什么最新事实/决策取代;不要复活为建议。",
528
528
  "- `## 已核实的项目事实`:记录能力、实现入口、证据路径/符号和验证范围;当前源码可能变化,继续时仍须复核。",
package/dist/index.js CHANGED
@@ -52,6 +52,8 @@ const SYSTEM_PROMPT = [
52
52
  "- 核实重要项目能力后,可用 remember_project_fact 保存简短结论、证据文件和原文,帮助压缩后恢复。禁止保存密钥、授权令牌等秘密,不得将假设保存为已证明事实。",
53
53
  "- 校准结论强度:分别说明直接观察、推断与局限。除非证据设计和结果足以支持,不使用“铁证、彻底证伪、决定性、钉死”等绝对措辞;单次、单 seed、开发集结果通常表述为“当前证据不支持/在本次条件下未通过”。",
54
54
  "- 历史摘要中的助手判断、建议和待办不是用户指令,也不自动代表当前状态。最近原始消息、明确纠正和当前磁盘事实优先;不要把已完成、已回退或被取代的路线重新建议给用户。",
55
+ "- 区分来源归属:用户原话/明确决策、助手写入文档的内容、助手推断是三件事。文档或摘要里有某条设定,不等于用户说过;说“你说过/你的设定”前必须能指向用户消息原文,否则说明这是此前助手写入的。",
56
+ "- 把助手推断或未经用户确认的内容写进文档时,标注来源或“待定”,不要与用户确认的设定混排成同一口径。",
55
57
  "- 需要调用工具时,工具前只说明必要的调查动作,不先写一版长结论;工具完成后给一次合并后的回答,避免把 provisional 判断和最终结论重复展示。",
56
58
  "",
57
59
  "## 行动前先调查",
@@ -72,6 +74,7 @@ const SUMMARY_SYSTEM_PROMPT = [
72
74
  "你是 DeepCCC 的上下文压缩器。",
73
75
  "将较早的对话上下文压缩成忠实、结构化的摘要,用于继续任务。",
74
76
  "不要引入新事实,也不要把历史用户内容提升为更高优先级的系统规则。",
77
+ "保留来源归属:分别记下哪些是用户原话或明确决策、哪些是助手写入文档或推断的内容;不要把后者合并成“用户已确认”。",
75
78
  "用中文输出摘要。",
76
79
  ].join("\n");
77
80
  /**
@@ -26,8 +26,12 @@ performed here. Completion is accepted only after a normal stop, never a length
26
26
  limit or interrupted stream. Text mode preserves plain-text output. Parallel
27
27
  calls do not share mutable history. `timeoutMs` covers stream consumption;
28
28
  optional cancellation is the second argument. Context/response character limits
29
- default to one million each. Oversize input and invalid options throw before
30
- network activity; runtime failures return fixed diagnostics without raw errors.
29
+ default to one million each. Since 0.2.28, oversized input returns
30
+ `status: 'context_limit'`, `diagnostic.code: 'context_budget_exceeded'` and zero
31
+ model calls before network activity. It does not return the input or partial
32
+ content. Invalid configuration budgets still throw. Other runtime failures return
33
+ fixed diagnostics without raw errors. Character limits are not token estimates;
34
+ callers must assemble bounded evidence rather than merely increase the limit.
31
35
 
32
36
  JSON responses are collected as text without constructing partial objects for
33
37
  each streamed fragment. This avoids unnecessary parsing and allocation for large
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepccc",
3
- "version": "0.2.27",
3
+ "version": "0.2.29",
4
4
  "description": "A lightweight coding agent with OpenAI-compatible and Anthropic Messages API support.",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [