deepccc 0.2.28 → 0.2.30

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 事件接口
@@ -195,7 +195,10 @@ Provider 发送 `max_tokens`,使用模型服务端默认值。可通过 `DEEPC
195
195
  默认取 `min(64000, 常规压缩阈值 × 25%)`,超过后会提前压缩,避免长会话积累大量低信号工具输出。
196
196
  可通过 `DEEPCCC_CONTEXT_WINDOW` 环境变量覆盖。⚠️ 超过模型/服务端实际上限时请求会被
197
197
  API 拒绝(context length exceeded),实际窗口以模型与所用服务端为准(如 litellm 的
198
- `max_input_tokens`)。
198
+ `max_input_tokens`)。
199
+
200
+ 同一轮连续工具调用也有独立的结果重放预算。较早的简短成功回执、JSON 结果和错误信息,
201
+ 若比省略提示更短,会保留原结果;较大的结果仍按预算截断或省略,工具调用关联保持不变。
199
202
 
200
203
  `subModel` 是子模型(选填),默认 `""`(留空跟随主模型)。配置后,DeepCCC 内部的轻量
201
204
  环节——上下文压缩摘要生成、`task` 子代理任务——使用子模型执行,主对话仍用主模型。
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
  /**
@@ -72,7 +72,9 @@ export function compactToolLoopMessages(input, options = {}) {
72
72
  for (let index = prepared.length - keepRecent - 1; index >= 0; index -= 1) {
73
73
  const item = prepared[index];
74
74
  const delta = item.cappedSize - omittedSize;
75
- if (delta <= 0 || retainedToolChars + delta > maximum)
75
+ // A short status/error can cost less than the omission marker. Always
76
+ // restore such results: this retains evidence and reduces replay size.
77
+ if (delta > 0 && retainedToolChars + delta > maximum)
76
78
  continue;
77
79
  item.message.content[item.partIndex] = { ...item.part, output: item.capped };
78
80
  retainedToolChars += delta;
@@ -26,12 +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. 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.
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.
35
35
 
36
36
  JSON responses are collected as text without constructing partial objects for
37
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.28",
3
+ "version": "0.2.30",
4
4
  "description": "A lightweight coding agent with OpenAI-compatible and Anthropic Messages API support.",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [