From 87cc91a73676231575c4a245d4ab8c4649b7fa47 Mon Sep 17 00:00:00 2001 From: awork Date: Mon, 7 Sep 2026 00:20:49 +0800 Subject: [PATCH] release v0.1.58 --- CHANGELOG.md | 4 ++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2245b1..060bfea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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..model`(`"provider/id"`)、`delegate.agents..thinkingLevel`,以及全局 `delegate.thinkingLevel`。模型解析优先级 per-call `model` > 角色默认 > 父 Agent 当前模型;thinking level 优先级 per-call > 角色 > 全局 > Pi 默认。角色配置的模型经 `ctx.modelRegistry.find()` 校验,不存在时回退到父模型并记警告(**绝不失败**,omo 教训);per-call / 继承的模型原样透传(允许自定义非目录模型)。无任何配置时行为完全不变(继承父模型 + Pi 默认)。子进程 CLI 新增 `--thinking ` 透传(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`) diff --git a/package-lock.json b/package-lock.json index 65ee0b9..52aaa57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "billion-context-pi", - "version": "0.1.57", + "version": "0.1.58", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "billion-context-pi", - "version": "0.1.57", + "version": "0.1.58", "license": "MIT", "devDependencies": { "@earendil-works/pi-coding-agent": "0.83.0", diff --git a/package.json b/package.json index 2a89c91..36048ee 100644 --- a/package.json +++ b/package.json @@ -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",