Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# Changelog

## Unreleased (master, since v0.1.38)
- **feat(kernel): acp-kernel 0.0.50 → 0.0.55 — 压缩提示词单源化 + nudge 行为适配** — 引用保真规则(verbatim 必须带 mNNNNN ref、TASK AS OF THIS BLOCK、禁止从工具输出抄 `\uXXXX`)并入内核 `howToCompressRules`,删除 bcp 适配器侧 SUMMARY FIDELITY RULES 节(单一来源)。适配内核新行为并修正 3 个断言旧行为的测试:#194 首见大积压绕过 + #198 压力 nudge 最小收益门槛 `max(5000, limit×1%)`(零收益压缩循环修复)— e2e 2w/2w 增大消息体量使 pending 过门槛、sent-view 缩小 MID 避开首见触发(floor 仲裁照测);新增 `compress.minPressureBenefitTokens` 配置透传(global/provider/model 三级,显式 0 = 恢复 legacy any-pending,微型窗口 e2e 场景使用),修复场景 03-nudge-triggered
- **fix(compress): 摘要保真 — 入库解码双重转义摘要 + 标记无 ref 用户引言 (closes #309)** — 小模型会随工具输出模仿产出 `\uXXXX` 字面转义写进 compress 参数,内核原样存储后每轮 prompt 携带乱码、模型再模仿再产出(正反馈污染,事故会话实测)。新增 `src/summary-sanitize.ts`:`sanitizeSummary` 转义数严格 >20 才解码(仅 `\uXXXX` 含代理对,`\n`/`\\` 不动,合法少量转义示例存活);`findUnverifiableUserQuote` 检测“声称用户原话但无 mNNNNN ref”的引用(只记日志不改写,含中文“原话”模式);挂载 `compress-tool.ts` 的 `handleCompress` 在 `applyCompression` 之前逐 range 清洗,打 `summary-unescaped` / `summary-unverifiable-quote` 事件日志
- **feat(delegate): `acp_delegate` 新增 per-call `timeoutMinutes` 硬超时覆盖 (#286)** — 主 agent 可按任务体量单独设定该次 run 的硬墙钟预算,不再依赖全局默认(`async=true` 覆盖 async 硬限、sync 覆盖 sync 限;无输出 idle watchdog 仍用全局值);缺省/非法值回退配置默认,封顶 1440m(24h)防坏值长期占用并发槽位;`asyncWatchdogDescription` 反映生效值。实现:`resolvePerCallTimeoutMs`(`src/delegate-tool.ts`)
- docs: AGENTS.md 新增问题报告规范 — 发现/修复的问题必须建 issue 追踪 (#313)
- **feat(delegate): 按角色配置默认模型与 thinking level (closes #117)** — `acp_delegate` 现支持为不同角色持久化配置默认模型与 reasoning/thinking level:`delegate.agents.<role>.model`(`"provider/id"`)、`delegate.agents.<role>.thinkingLevel`,以及全局 `delegate.thinkingLevel`。模型解析优先级 per-call `model` > 角色默认 > 父 Agent 当前模型;thinking level 优先级 per-call > 角色 > 全局 > Pi 默认。角色配置的模型经 `ctx.modelRegistry.find()` 校验,不存在时回退到父模型并记警告(**绝不失败**,omo 教训);per-call / 继承的模型原样透传(允许自定义非目录模型)。无任何配置时行为完全不变(继承父模型 + Pi 默认)。子进程 CLI 新增 `--thinking <level>` 透传(pi 支持 off|minimal|low|medium|high|xhigh|max,非法值告警不失败);`acp_delegate` 新增可选 `thinkingLevel` 参数
- **feat(delegate): `delegate.maxConcurrent` 后台子代理并发上限 / 强制串行开关(closes #294)** — 此前每个 `acp_delegate` async 调用立即 spawn 独立 pi 进程,无并发上限;低性能机器上并行子代理争抢 CPU 导致全部 watchdog 超时退出,主代理被迫自己干完。新增数值配置 `delegate.maxConcurrent`(默认 unlimited):限制**同时运行**的后台(async)delegate 数量,达上限后后续启动进入 FIFO 队列、有空位自动开始(不丢弃、只是等待)。`1` = 强制严格串行。优先级 env `PI_ACP_DELEGATE_MAX_CONCURRENT` > acp.json > unlimited,无效值(非整数 / `<1`)带警告回退而非失败。新增 `RunStatus:"queued"`:排队 run 立即可被 wait(挂起 waiter 跨排队→终态)与 cancel(释放槽位并显式唤醒挂起的 waiter,因其无子进程触发 finalize);watchdog 计时从实际 spawn 起算(不含排队时间);remaining-counts 计入 queued。sync 调用始终立即运行、不受影响。实现:`ConcurrencyGate`(provider 容量、FIFO、cancel 只标记不删除以防槽位泄漏)+ `spawnDelegateChild` 抽取;并发上限解析并入 `resolveDelegate`/`DelegatePolicy`;工具描述在有限制时动态提示;CONFIGURATION.md(+zh-CN) 文档。测试:`resolveDelegate().maxConcurrent` 解析 + ConcurrencyGate(FIFO/容量 N/cancel-跳过/无限)+ env>acp.json 解析与无效回退
- **fix(guardrail): 通用工具调用重复熔断 — 打断字节级相同调用的死循环(closes #308)** — 贪心解码小模型会把完全一致的 `(工具调用 → 工具返回)` 对逐轮自我强化(序列级吸引子,token 级惩罚跨轮无效),实测 `acp_status` 同参连发 30 次、上下文 57K→130K。现有防线全部失效:`compress-retry-capped` 熔断只统计 compress 失败(acp_status 永远成功 → 零计数)、nudge 去重按 turnKey(循环期无新用户消息 → 全程 `nudge-suppressed`)、`tool-guardrails.ts` 只有 bash 输出上限/超时检测。新增 `repetitionGuard`(默认开启,可配 `{enabled,warn,abort}`):每次调用指纹化 `sha1(toolName + 键排序 canonical JSON(args))`,只比参数不比结果(结果里可见消息数会微变也不影响命中);会话内跟踪连续相同次数,达 `warn`(默认 3) 在该 toolResult 尾部追加强警告,达 `abort`(默认 5) 拦截该调用不执行 + 中止本轮 + 终端通知;参数变化 / 换工具 / 真实用户消息重置计数(扩展自发消息不重置)。实现挂 `src/tool-guardrails.ts`(`RepetitionTracker` / `canonicalStringify` / `repetitionFingerprint`),配置解析在 `src/config.ts`(`resolveRepetitionGuard` / `REPETITION_GUARD_DEFAULTS`)
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "billion-context-pi",
"version": "0.1.57",
"version": "0.1.58",
"description": "One billion, not one million. Model-driven context management for the Pi coding agent.",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
Loading