2026 2026年10月29日 31 min · 9.0k chars by yxc023

GitHub 调研周报 2026-10-29

扫描窗口:2026-09-08T09:23:29Z → 2026-10-29T00:30:00Z(共 50.6 天)| 基准来源:上次报告 2026-10-28

2026-10-29 GitHub 调研周报

扫描窗口:2026-09-08T09:23:29Z → 2026-10-29T00:30:00Z(共 50.6 天)| 基准来源:上次报告 2026-10-28 本期新增内容全部落在 2026-10-28T00:30:00Z 之后的约 24 小时(上次报告生成时间)

本期速览

  1. opencode 的 v1 发布线重新抢回「Latest release」,代价是同一个生态里出现了两个 latest 标签。 v1.19.5 于 2026-10-28 06:17 发布,GitHub releases/latest 现在指向它;npm 上 opencode-ai 的 latest = 1.19.5,而 @opencode/cli 的 latest = 2.2.0。v1.19.5 内容极少——只有一条修复:TUI worker 请求失败时返回错误而不是让调用方永久挂起(#54936,作者 @Nowaker,是本期唯一一条社区贡献进 v1 release 的修复)。上一期记录的「双发布线」从权宜之计变成了默认状态,且 v1 线仍在被修复、仍在收到用户报错(#60056、#59975)。

  2. opencode 的 process-daemon v0.3.2 发布说明宣称「已发布到 npm」,但 npm 上根本没有这个版本。 GitHub release process-daemon-v0.3.2(2026-10-28 16:05)正文只有一句:opencode-pty 0.3.2(protocol 7),发布为 npm 包 @opencode/pty@0.3.2。实测 npm registry 上 @opencode/pty 只有 0.0.0 与 0.0.0-stage 两个占位版本,8 个平台包(@opencode/pty-darwin-arm64 等)同样停在 0.0.0;仓库里 packages/process-daemon/npm/package.json 的 version 字段确实写着 0.3.2。与此同时,未合并的 PR #59969 标题正是「fix(process-daemon): publish the GitHub release after npm and release 0.3.3」。发布顺序问题从上一期的 app-update.yml 缺失延续到了「先发 GitHub release、后发 npm」这一步,而 release notes 已经宣称 npm 上有。

  3. opencode 桌面端 2.2.0 出现一批彼此独立但都指向「新特性未收尾」的故障,其中三个可量化。 #60050:/api/experimental/generate 在 12.8 KB prompt 上从 2.1.4 的 18–42 s 变成 200–223 s(两次超过 300 s),同一模型直连 provider 只需 2.5 s——慢在宿主侧,不在模型;#60017:v2 二进制在 x86-64-v1 CPU(Intel Core 2 Quad Q9400)上启动即 SIGILL,因为 Bun 的 baseline 构建仍有 Nehalem 硬底线(SSE4.2 + POPCNT);#60059:桌面每次重连都会让常驻 service 再拉起一整套本地 MCP server 子进程且不回收,两次重启后两代共 3 个 MCP server 同时存活(约 440 MB 进程),子进程被杀后也不重启。此外 #60014(Code Mode 目录漏掉内置工具,tools.shell 报 Unknown tool shell)、#60030(后台 shell 变成杀不掉的僵尸条目且跨重启存活)、#60004(plugin.list() 无 location 时把 $HOME 变成永久 location,启动所有全局插件)、#60005(插件 server 重启后卡在 loading,事件流反复请求 http://127.0.0.1:0)全部指向同一个来源:v2.2.0 的桌面插件体系(#55246 起)在本期被至少 6 个 issue 指名。

  4. opencode 连续第三期出现「费用显示不可信」,本期的新形态是桌面恒显示 0,00 USD。 #60052:桌面右上角一直显示 0,00 USD,真实费用只出现在 Console > Activity 里。上一期已记录同一面板上并存 10⁶ 倍高估、6 倍低估与归零三种故障。成本面板已经连续三期被用户当作不可信数据源。

  5. 免费模型问题从「提示文案」升级为「模型选择器把免费模型藏起来」,当天即修。 #59971「Desktop no longer supports free models」、#59967「Free usage limit reached」、#59983「Limit reached」继续把界面提示原样当标题提交。根因是桌面模型选择器的 visible() 规则:超过 6 个月、或同族有更新的免费模型就被隐藏——Big Pickle(2025-10-17 发布)因此既不出现在选择器里、又在 Settings > Models 中默认关闭。修复 PR #60047 改为「所有 OpenCode 免费模型默认可见,用户手动隐藏的仍隐藏」。免费额度是本期唯一被当天闭环的产品问题。

  6. opencode 同期做了两件「让 agent 自己长期跑」的事:定时任务与目标(/goal)。 #59401 feat(core): scheduled tasks storage and time triggers(experimental)——会话可挂一次性 / 定点 / 每 N 分钟 / cron 的计划(when + ends + prompt),由 server 端一个定时循环驱动(最长睡 30 s),承诺每次触发恰好送达一次,宕机或停机期间到期的会补发一次并标记为 late;本期只落存储与定时器,agent 与 app 的创建入口在下一个 PR。#59437 feat(core): add /goal with a client-side done check——/goal <objective> 让会话持续工作直到评审者认为目标达成,不新增 server 事件,客户端用已同步的数据自行判定「done」,桌面端是一个内建 GUI 插件(走 SDK 的 ComposerPill 注册表),它是 #58508(session.settled)的替代方案。两者都在把「一轮一问」改造成「一轮接一轮直到某个条件成立」。

  7. pi 的 Chord v2 一夜之间推进两个 slice,并被自查发现「实现跑在设计前面」。 commit 6eb99ad(slice 8:registries 与 host.root)与 14b4c56(slice 6b:Durable 与 jobs 落到 store 上)落地;slice 8 带来 defineRegistry / host.serve(R, …) / self.contribute(R, value) / self.registry(R) / host.registry(R, ctx) 与 RegistryValue.observe、按插件名排序的惰性组合表、helpers keyedEntries / orderedEntries、新的 onError 分类 registry_conflict / registry_failed / contribution_failed / contribution_refused、self.writable(initial)、self.retryOn(...sources),以及在对象之外运行代码的 host.root(fn, context, { principal? })。同时 commit 391e83f 明确写着「Chord v2 follows its design where the audit of slices 1-6a found it did not」——一次针对已实现 slice 的设计审计,随后是 30 余个 docs(chord) 提交逐条修正文档。这是连续第四期同一主题(watch / observer / report → failure → 状态快照 → 设计对齐)。

  8. pi 的用户侧本期出现三个可复算的「缓存经济账」问题,全部当天关闭。 #11529:getCurrentTools() 按注册顺序返回工具,被移除再加回的工具会排到 Map 末尾,于是 MCP 重连、tool_search 加载、扩展延迟注册都会改变最终顺序——同样的工具集合、不同的字节、在不支持 supportsMidConvoToolChanges 的 provider(Bedrock)上就是一次完整缓存重写;#11528:Bedrock 上的 Claude 模型没有 promptCache 标注,cache-warmer 因此从不在 Bedrock 上运行;#11527:bedrock-converse-stream.ts 在 stream() 内部 new BedrockRuntimeClient(config),每次调用都新建凭证提供器与 HTTP/2 会话——作者实测每次调用多 2 次 TLS 握手约 0.35 s(0.24 s SSO + 0.11 s TLS),且留下 29 条空闲连接。对应修复:#11514(保持工具顺序)、#11513(union / 多行 codemode 输出类型改为摘要)。

  9. hindsight 本期把三处「静默丢弃」改成「显式失败或显式保留」。 #6153 fix(refresh): bound the delta gate per refresh; a late failure keeps its memory——此前刷新闸门一次性为每条记忆发一个 decision 请求,其中任何一个失败就丢弃整批(#6103);#6158 fix(embed): keep the user’s HINDSIGHT_API_DATABASE_URL instead of replacing it with pg0——Windows zh-CN 下内置 pg0 报「stream did not contain valid UTF-8」且用户的库地址被忽略(#6065);#6162 fix(docker,helm): give the API 60s to hand back in-flight tasks on shutdown,配合 #6092 不再等待长时间维护任务——此前 entrypoint 在 SIGTERM 后 30 s 就 SIGKILL 掉 API(#6068)。另一条 #6154 让 trace 与 recall 日志能指名是哪一个 reranker 成员在服务(#6072)。「先回答再校验」正在被逐个替换成「先校验再回答」。

  10. ACP 单日合并数从上一期的 69 降到 17,但内容全部落在「生命周期语义」上;社区侧仍是零 issue、零讨论。 #2579 定义 v2 会话生命周期(retention:会话自 session/new 存在直到 Agent 丢弃,session/list / session/resume 只看得到保留的会话,恢复被丢弃的会话返回 -32002;active:自 session/new/session/resume 成功起、到 session/close 或连接结束止);#2575 让 session/close 幂等(重复关闭应成功,客户端应把 -32002 当作成功);#2586 让 session/delete 像 archive 一样先关闭活跃会话;#2582 定义「拒绝权限请求」——cancelled 现在也覆盖用户关闭弹窗与客户端按策略拒绝(包括没有 reject 选项时),此后 Agent MUST NOT 继续;#2588 定义 stdio 关闭语义(客户端关 stdin 即结束连接)并删掉空的「Streamable HTTP — draft proposal in progress」占位段。规范在补「会话什么时候算活着、什么时候算结束」这个此前含糊的底层。

  11. pi-web 连续第 9 天零提交,并且第一次出现了「是不是不维护了」的公开质疑。 最后一次 push 仍是 2026-10-20T16:53:57Z;本期 7 个新 issue、2 个新 PR 全部零回复,其中 #1435 的标题就是两个字:「停更了?」。另有 #1438 提出直接放弃追版本——从用户已装的 pi 里解析 SDK,而不是像现在这样精确 pin(package.json 里 7 个 @earendil-works/* 包仍精确 pin 在 1.2.0,上游已到 1.4.0)。#1441 则指出前端对所有 >1 MB 图片硬编码缩到最长边 1024px / JPEG 85,导致试卷、文档等文字类图片不可用。

各仓库详情

anomalyco/opencode

开源 coding agent(终端 TUI + 桌面 app + web),TypeScript / Bun 内核,多 provider 架构 | stars: 222756(+378) | open issues: 3919(+59) | 默认分支: dev | 最近 push: 2026-10-29T00:17:32Z | 主页: https://opencode.ai

近 N 周 release 重点:

  • v1.19.5(2026-10-28 06:17)— v1 线修复版,现为 GitHub releases/latest
  • process-daemon-v0.3.2(2026-10-28 16:05)— opencode-pty 0.3.2(protocol 7)
    • release notes 声称发布为 npm 包 @opencode/pty@0.3.2,但 npm registry 实测只有 0.0.0 与 0.0.0-stage;8 个平台包同样停在 0.0.0
    • 未合并的 #59969 计划「先发 npm 再发 GitHub release」并做 0.3.3
  • v2.2.0(2026-10-27 09:04)— 上一期已详述,本期无补充;npm @opencode/cli 的 latest 仍是 2.2.0
  • 版本标签现状:npm opencode-ai = 1.19.5、npm @opencode/cli = 2.2.0、GitHub Latest release = v1.19.5

其他重要 commits / PRs(按重要性挑选 5–10 条):

  • #59401 feat(core): scheduled tasks storage and time triggers (experimental) (@kitlangton, 10-28)——会话级计划(when: in/at/every/cron + 可选时区;ends: after/at/times)+ prompt;server 一个定时循环最多睡 30 s;每次触发恰好送达一次,宕机期间到期的补发一次并标 late;开关 experimental.schedules,关闭时创建直接失败、计时器永不触发
  • #59437 feat(core): add /goal with a client-side done check (@neriousy, 10-29)——/goal <objective>,靠新的 session idle 插件 hook 判断「真的空闲」,不新增 server 事件(客户端用已同步数据判定 done),不向 compaction 摘要注入 note;桌面端是内建 GUI 插件;是 #58508(session.settled)的替代方案,二者只能合一个
  • #59977 refactor(ai): remove fal, Black Forest Labs, Replicate and Stability (@rekram1-node, 10-28)——packages/ai 移除 4 个媒体 provider 及其协议、测试与录制夹具;理由是 core 不接线、models.dev 里也没有,而 FLUX / SD 仍可通过 Vercel AI Gateway、OpenRouter、Cloudflare Workers AI 触达
  • #59963 feat(ai): freeform tools (@rekram1-node, 10-28)——OpenAI 风格 custom tool:只有一个必填 string 参数的工具可设 freeform(lark / text / regex 语法),模型以原始文本而非 JSON args 写入;编码在 OpenAI Responses / Chat Completions 一侧,因此 Azure、Bedrock Mantle、Vercel、OpenRouter、Cloudflare AI Gateway、DigitalOcean、Venice 及 xAI / Meta / Alibaba 的 Responses 自动获得;Anthropic、Gemini、Bedrock Converse 仍发普通 JSON tool,且没有 fallback
  • #59934 fix(core): leave headroom when fitting output to the context window (@neriousy, 10-28)——本地 token 计数低于 provider(chat template、tool schema),会把 max_tokens 顶到窗口边界导致严格 provider 拒绝(Kimi K2.6 经 OpenRouter 报「requested about 262223」);修复后在拟合输出预算时留 1% 窗口不用(Kimi 约 2.6 k,1M 模型约 10 k)
  • #60047 fix(app): always list OpenCode free models in the model picker (@Hona, 10-28)——选择器 visible() 规则改为默认列出所有免费 OpenCode 模型;Big Pickle(2025-10-17)此前被隐藏且默认关闭
  • #60045 fix(core): tell agents they can message running subagents (@rekram1-node, 10-28) / #59496 feat(app): show a background shell’s output from the pill
  • #59072 refactor(client): group experimental SDK methods under client.experimental (@rekram1-node, 10-28) / #59991 feat(ai): Responses routes for OpenRouter, DigitalOcean and Venice / #59929 feat(ai): add MiniMax image generation / #59947 请求内联图片字节改为默认
  • #59996 feat(theme): lay out migrated V1 themes on opencode2 steps under new designs (@jlongster, 10-28) / #60016 fix(theme): give migrated V1 dialogs an opaque background (@jlongster, 10-29)
  • #60024 fix(codemode): run extension before hooks before the host call (@rekram1-node, 10-28) / #59981 fix(codemode): let search be awaited or chained like a Promise / #59948 feat(codemode): let extension globals return Effects
  • 未合并但值得记的:#60054 feat(core): subscribe to MCP resources and wake sessions(PatrickLaflamme)、#60025 feat(core): configure session warming per provider and model、#60028 feat(core): let a Code Mode check decide when a schedule fires、#60041/#60039/#60035 feat(mcp): per-server TLS trust for remote MCP servers(karup,同一主题三份)、#60057 fix(core): stop merging credential metadata into model settings

社区讨论 / 行业方向:

  • OpenCode 官方 changelog: v2.2.0 条目仍是官方口径的变更清单(桌面插件、experimental image/decision 生成 API、keyed session instructions、per-provider prompt cache TTL,以及三条 breaking change)
  • opencode.asia 变更摘要: 第三方整理版,标注「Reviewed as of October 28, 2026」,把 8 月以来 20+ tag 归为「性能与稳定性 / 认证 / 兼容」三类,并强调 v1.18.x 系列大量围绕 provider 认证、Cloudflare AI Gateway、compaction 与重试加固
  • AInnect 追踪页: 记录 stars 222,214(+432/日)、90 天 15 个 release、open issues 3,861;同页把 Pi 列为 v1.4.0、Codex 为 rust-v0.166.0-alpha.2
  • 讨论区无(该仓库 Discussions 已禁用,API 返回 410)

信号观察:

  • 24 小时内 56 个 commit、60 个合并 PR、146 个新 issue、139 个新 PR;合并作者集中在 rekram1-node、jlongster、Hona、karup、arvsrn
  • 发布线的混乱从「双轨」变成「双标签」:GitHub Latest release 指向 v1.19.5,npm @opencode/cli latest 是 2.2.0,npm opencode-ai latest 是 1.19.5——同一仓库的三个「最新版」指向两个不同的产品
  • 发布说明与实际产物脱节:process-daemon v0.3.2 的 release notes 宣称 npm 已发布,实际 npm 上不存在该版本;修这个顺序的 PR 仍开着
  • v2.2.0 的桌面插件体系是本期故障集中区:至少 6 个 issue(#60059 / #60005 / #60004 / #60023 / #59995 / #60013)指向它,且多数是「进程/端口/资源不回收」而非「功能不对」
  • 免费模型的修法是「默认显示 + 用户可隐藏」,而不是「按新鲜度启发式隐藏」——启发式可见性规则在上线半年后被认定为主要故障源
  • 成本面板连续第三期不可信(本期形态:桌面恒显示 0,00 USD,真实值只在 Console)
  • 两个「让会话长期自己跑」的实验(schedules、/goal)都带明确的 opt-in 开关,且都刻意不新增 server 事件

earendil-works/pi

AI agent 工具箱:统一 LLM API、agent loop、TUI、coding agent CLI,TypeScript monorepo | stars: 118537(+248) | open issues: 350(−30) | 默认分支: main | 最近 push: 2026-10-28T23:16:29Z | 主页: github.com/earendil-works/pi

近 N 周 release 重点:

  • 本期(24 小时)无新 release。npm @earendil-works/pi-coding-agent latest 仍为 1.4.0(2026-10-21),pi-ai 同为 1.4.0——已停滞 8 天
  • packages/chord/CHANGELOG.md 的 [Unreleased] 段继续整包 Breaking Changes,本期又扩:
    • traceIn(options, fn, context) 把 context 移到末尾
    • watch 监听器收一个 change 对象:WatchChange<T> = { value, ops, retired },NativeWatchChange<T> = { value };帧单独投递时按来源原样送达
    • 退休从「结束」降级为「标志」:WatchEnd 去掉 retired,Watch.retire(context) 被移除;来源用 advance({ value, ops, retired: true }, context) 报告退休,watch 继续存在,下一次调用带 retired: true 并与其余待投递帧折叠
    • 失败也是一种 watch 调用:WatchCall<T> = { kind: "value", … } 或 { kind: "failed", error };失败后 watch.value 保持上次值,下一个值以 [["r", value]] 到达
    • WatchEnd 用 kind 而非 reason:{ kind: "stopped" | "aborted" | "ended" } / { kind: "listener_error", error } / { kind: "failed", error };获取 context 被 abort 时结束为 aborted 而非 cancelled
    • SqliteExecutor.runCounted(sql, …params) 执行一条语句并 resolve 被影响行数(按 SQLite changes() 计,不含索引写与触发器改动);Durable Object 驱动读 SELECT changes()
    • 新增:defineRegistry / host.serve / self.contribute / self.registry(R) / host.registry(R, ctx) / RegistryValue.observe / self.writable(initial) / self.retryOn(...sources) / host.root(fn, context, { principal? });新增 onError 分类 registry_conflict / registry_failed / contribution_failed / contribution_refused;新增 unavailable/undeclared 失败原因

其他重要 commits / PRs(按重要性挑选 5–10 条):

  • 6eb99ad feat(chord): Chord v2 slice 8, registries and host.root (10-28)——registry 贡献表按插件名排序、惰性组合(load 的 setups 结束后一次,之后在读取或被 follow 时组合);读取方 self.registry(R) 是声明式依赖:registry 有值即激活,没人服务时以 unavailable/undeclared 失败
  • 14b4c56 feat(chord,durable): Chord v2 slice 6b, Durable and jobs on the store (10-28)
  • 391e83f fix(chord): Chord v2 follows its design where the audit of slices 1-6a found it did not (10-28)——一次针对已实现 slice 的设计审计,随后 30 余个 docs(chord) 提交逐条修文档(97553d1 设计文本、cc41246 审计决策、6975eb1 / e613c74 路由与重试语义、9ae3d88 seal fence、790a98b compose failure helper 命名等)
  • 556860a docs(chord): no client providers for now (10-28)
  • #11368 feat(ai): refactor provider definitions (@mitsuhiko, 10-28)——用每个内建 provider 一个 defineProvider() 文件 + 共享模型族规则(Claude / GPT / DeepSeek / Kimi / Google)+ 来源适配器替换 generate-models.ts,models.dev 改走 v2 API;输出与 CLI 参数不变
  • #11546 fix(coding-agent): cap pi.exec output at 256 MiB (@christianklotz, 10-28)——ExecOptions.maxBuffer 默认取 256 MiB 与运行时字符串上限的较小者;超限时终止命令并返回 truncated: true / killed: true 与非零退出码;关闭输出管道以免写入的后代进程让调用一直挂起;丢弃不完整的 UTF-8 尾巴;ExecResult.truncated 变成必填字段
  • #11544 fix(env): kill the daemon’s commands when it is terminated (@petrroll, 10-28)——Connection.close() 发 SIGTERM 而 daemon 未处理,命令被 reparent 到 init(ppid 1)继续跑,与 docs/protocol.md 的承诺矛盾;修复在启动任何线程前阻塞 SIGTERM/SIGINT/SIGHUP
  • #11513 fix(coding-agent): summarize union and multi-line codemode output types in tool descriptions (@robopipi[bot], 10-28) / #11514 fix(coding-agent): keep active tool order when the same tools are set again (@robopipi[bot], 10-28)
  • #11540 fix(env): fail exec and pty with spawn_error when a helper thread cannot start (@robopipi[bot], 10-28) / #11543 fix(coding-agent): strip private-parameter CSI sequences in stripAnsi (@petrroll, 10-28) / #11548 fix(coding-agent): report a deleted working directory instead of crashing on startup
  • #11467 fix(coding-agent): default openai provider to gpt-6.1-sol / #11471 feat(coding-agent): let inline ctx.ui.custom() components report blocked program status / #11494 fix(ai): detect LiteLLM ContextWindowExceededError as context overflow
  • 未合并:#11499 feat(compaction): prefix-preserving summarization calls(上一期已提,仍未合并)

社区讨论 / 行业方向:

  • #11500 Compaction/summarization requests share no prefix with live turns — every compaction pays a full prefill(上一期,本期 PR 仍未合并)
  • #11529 Tool order depends on registration order, so the same tools can bust the prompt cache(@DiegoGBrisa,10-28,1 条评论)——getCurrentTools() 按插入序返回,被移除再加回的工具排到 Map 末尾;MCP 重连、tool_search 加载、扩展延迟注册都会改变最终顺序,同样的工具集合产生不同的请求字节,在 Bedrock 这类不支持 supportsMidConvoToolChanges 的 provider 上就是一次完整缓存重写
  • #11528 Cache warming never runs on Bedrock because its Claude models have no promptCache(@DiegoGBrisa,10-28)——cache-warmer.ts 只在 model.promptCache 存在时预热,而 catalog 只给直连 Anthropic 标注;Bedrock 并非代理,用同样的 cache point 与 5 分钟 TTL,Claude 4.5+ 接受 ttl: "1h"
  • #11527 Bedrock: a new BedrockRuntimeClient is created for every request(@DiegoGBrisa,10-28)——实测每次调用 2 次新 TLS 握手约 0.35 s(0.24 s SSO + 0.11 s TLS,eu-west-1),一次 run 约 35 次调用,且留下 29 条到 portal.sso 的空闲连接
  • #11501 codemode: describeOutput prints the full type for union output schemas, so one tool adds about 8k characters to every request(@colinperel,10-28)——union(anyOf)输出 schema 下 describeFields 返回 undefined,describeOutput 回退到整个类型字符串并压成一行
  • #11517 OpenRouter Kimi K3.1 Pro requests an oversized default output budget, causing HTTP 402(@Lu1sDV,10-28,2 条评论)——报错「You requested up to 933349 tokens, but can only afford 931145」,页脚却显示仅用了 1.8% 上下文:缓存后的输出容量被当成了默认输出预算
  • #11539 MCP OAuth drops Bearer metadata when WWW-Authenticate contains multiple challenges(@XLi-hub,10-28)——parseWwwAuthenticate() 对 Basic 后接 Bearer 的合法头返回 {},丢失 metadata URL 与 step-up scope,且会跨 challenge 读参数(Bearer realm="mcp", Basic realm="gateway", scope="basic-only" 误取 Basic 的 scope)
  • #11537 GLM (Zhipu) HTTP 429 code 1308 (5-hour usage cap) is retried instead of failing fast / #11536 pi update --extensions reports success without upgrading / #11535 pi installed using bun, pi still looking node and npm / #11533 Git package ports collide: install B keeps A, remove B deletes A
  • 讨论区无新增讨论(最新讨论仍停留在 2025-12)

信号观察:

  • 24 小时内 78 个 commit、15 个合并 PR、36 个新 issue、11 个新 PR;commit 数是上一期(27)的近三倍,而合并 PR 数持平——增量几乎全部是 Chord v2 的实现与文档对齐
  • 「同一语义一个来源」进入第四期:本期从「事件 vs 状态」推进到「实现 vs 设计」——391e83f 承认已实现的 slice 偏离了设计文档,随后用三十余个提交逐条回填
  • watch API 的破坏性变更继续加码:本期把「退休」从终态降级为标志、把「失败」变成一种 watch 调用、给 WatchEnd 换 kind 标签——一个 watch 概念现在有三种状态表达(value / failed / retired)和四种结束原因
  • 缓存经济账成为本期 pi 用户侧的主线,且三个问题都附带实测数字(0.35 s、29 条连接、缓存重写),不再是主观感受
  • provider 层被重写:模型目录从单文件生成器改为 per-provider 定义 + models.dev v2 API,工具链从「脚本生成」转向「声明式定义」
  • npm latest 停在 1.4.0 已 8 天,main 上积压整包 Breaking Changes——发布节奏落后于 API 演进的连续第 N 期

agegr/pi-web

pi coding agent 的本地 Web UI(Next.js / TypeScript),读同一套本地 session 文件 | stars: 7881(+34) | open issues: 87(+9) | 默认分支: main | 最近 push: 2026-10-20T16:53:57Z(连续 9 天未变) | 主页: 无

近 N 周 release 重点:

  • 本期无新 release。GitHub Release 最新仍为 v0.12.2(2026-10-15),npm @agegr/pi-web latest 同为 0.12.2(2026-10-15)。
  • 仍需区分:npm 上未加 scope 的 pi-web(latest 0.15.3)属于另一个项目(ravshansbox/pi-web)。

其他重要 commits / PRs(按重要性挑选 5–10 条):

  • 本期 0 个 commit、0 个合并 PR。main 分支最后一次提交仍是 2026-10-20 的 e533d9b。
  • #1437 修复:整组子代理及主代理最终回复结束后再发送完成通知 (@tossp, 10-28,未合并,0 评论)
  • #1440 feat(agents): 在三行列表中显示子代理实际模型和思考深度 (@tossp, 10-28,未合并,0 评论)
  • #1435 停更了? (@kissstrike, 10-28,0 评论)——正文只有「如题」两个字,是本期最直接的一句质疑
  • #1441 前端硬编码压缩图片至 1024px / JPEG 85,导致试卷、文档等文字类图片不可用 (@xiaqii, 10-28)——所有 >1 MB 的非 GIF 图片在浏览器端被 canvas 缩到最长边 1024px、JPEG 质量 85
  • #1438 Resolve pi SDK from the user’s installed pi instead of exact-pinning (like jmfederico/pi-web does)? (@xwh5, 10-28)——针对 #1393(把 pin 从 1.2.0 提到 1.4.0)提出另一条路:直接从用户已装的 pi 里加载 SDK,从而不必每次 pi 发版都跟一个 pi-web 发版
  • #1439 功能建议:在 Agents 列表三行布局内显示子代理实际模型和思考深度 (@tossp, 10-28) / #1434 修复:有后台子代理未结束时,主会话不应提前发送完成通知 (@tossp, 10-28)
  • #1433 kimi 在 pi-web 中无法使用,但在终端中使用 pi 没问题 (@hyx07, 10-28) / #1436 使用 pi-web 启动后浏览器页面显示 offline,要过 30s 左右才能正常显示界面 (@kissstrike, 10-28)
  • 仍未合并的旧 PR 继续堆积:#1429 / #1427 / #1426 / #1425 / #1423 / #1421 / #1420 / #1418 / #1417 / #1414 / #1409 / #1408 / #1405 / #1398 / #1396 / #1392 / #1391 / #1389

社区讨论 / 行业方向:

  • 讨论区无新增讨论;最新一条仍是 2026-08-29 的「Pi Usage:在 pi-web 中查看模型余额和配额」(Show and tell)
  • 同类替代实现继续 proliferate:npm 上同时存在 @hyperdreamer/pi-webui、@youweichen/pi-web-ui、@chainingintention/pi-web-cn 等多个 pi Web UI 实现;#1438 提到的 jmfederico/pi-web 则走「不 pin、跟随用户已装 pi」的路线

信号观察:

  • 连续 9 天零提交;本期 7 个新 issue、2 个新 PR 全部零回复,外部贡献与维护响应之间的分界没有移动
  • 第一次出现「是否已停止维护」的公开质疑(#1435),且紧跟着出现「干脆别追版本、从用户已装的 pi 里解析 SDK」的方案提议(#1438)
  • package.json 里 7 个 @earendil-works/* 包仍精确 pin 在 1.2.0,而上游 pi-coding-agent / pi-ai 已到 1.4.0(两版之差)
  • 前端存在未经讨论的破坏性行为:>1 MB 图片一律压到 1024px / JPEG 85,直接让文字类图片不可用(#1441)
  • 报告类功能(子代理模型与思考深度、完成通知时机、用量明细)成为本期 issue 的主要来源——用户对 Web UI 的期待已经超过「能跑起来」
  • 包名 pi-web 仍被另一个项目占用并持续发布(0.15.3),本仓库只能用 scope 区分

vectorize-io/hindsight

Agent memory 平台(Hindsight:Agent Memory That Learns),Python 后端 + 控制面 | stars: 55511(+1081) | open issues: 177(+2) | 默认分支: main | 最近 push: 2026-10-28T20:27:54Z | 主页: https://hindsight.vectorize.io/

近 N 周 release 重点:

  • 本期无新 release。GitHub Release 最新仍为 v1.1.0(2026-10-21),v1.0.0(2026-10-13)已宣告 GA。
  • 官网博客目录 hindsight-docs/blog/ 最新一篇仍是 2026-10-27 的《What’s New in Hindsight Cloud: The API Is a Promise Now》(上一期已详述),本期无新博客。
  • Hindsight Cloud What’s New 页 仍以「October 13, 2026 · Hindsight 1.0」为头条;博客 tag 页另有 Memlake 的《Introducing Hindsight Memlake: serving 100M Memories at <100ms p99 on object storage》

其他重要 commits / PRs(按重要性挑选 5–10 条):

  • #6153 fix(refresh): bound the delta gate per refresh; a late failure keeps its memory (@nicoloboschi, 10-28)——每次刷新为每条记忆发一个 decision 请求,且其中任何一个失败就丢弃整批(#6103);修复后单次刷新有界、迟到的失败保留其记忆
  • #6158 fix(embed): keep the user’s HINDSIGHT_API_DATABASE_URL instead of replacing it with pg0 (@nicoloboschi, 10-28)——Windows zh-CN 下内置 pg0 报「stream did not contain valid UTF-8」,且用户的库地址被忽略(#6065)
  • #6162 fix(docker,helm): give the API 60s to hand back in-flight tasks on shutdown (@nicoloboschi, 10-28)——此前 entrypoint 在 SIGTERM 后 30 s 即 SIGKILL API,in-flight 任务全丢(#6068)
  • #6092 fix(worker): shutdown no longer waits out a long maintenance job (@cdbartholomew, 10-28)
  • #6154 feat(recall): name the serving reranker in the trace (opt-in) and tag recall log lines with one id (@nicoloboschi, 10-28)——trace 与日志能指名哪一个 reranker 成员在服务(#6072)
  • #6159 docs(dev): light start-docs that compiles pages on first visit (~1 GB instead of ~3.5 GB) (@nicoloboschi, 10-28)
  • #6142 fix(audit): an MCP tool call writes one audit row, not two (@nicoloboschi, 10-27) / #6143 fix(recall): break BM25 score ties on id so repeated recalls return the same list / #6133 fix(retain): store the ‘where’ dimension and fail instead of dropping an unsplittable chunk
  • #6131 feat(recall): prune flag for the decision-model reranker / #6130 chore(reranker): deprecate the typesafe reranker provider in favour of the shared decision model——reranker 提供方收敛到一条路线(上一期已述)

社区讨论 / 行业方向:

  • #6165 import-bank fails with CardinalityViolationError when a bank has legacy (pre-#4244) and new chunk ids for the same chunk (@alfindigital, 10-29 00:07——本期最新一条 issue)
  • #6157 Hermes plugin: operational noise becomes memory facts, and retain has no content filter (@TeaShaman-cyber, 10-28) / #6156 feat(hermes): pre-retain quality gate to skip low-value turns (cut LLM extraction calls and bank noise) (@mwielgosz-esky, 10-28)——噪音进记忆库的问题同时被提出与被提案解决
  • #6140 Mental-model refresh: a reranker socket timeout pauses automatic refresh (not treated as temporary)(@kobgec1993,10-27)——超时被当成永久失败,自动刷新从此停摆
  • #6132 recall: a date or ‘now’ in the question barely changes the ranking (±10% boosts on the cross-encoder score) (@nicoloboschi, 10-27)——时间语义对排序几乎不起作用
  • #6163 Pluggable asyncpg connect hook so the pool picks up rotated database credentials (@rgillinlz, 10-28)——数据库凭证轮换要靠改代码
  • #6152 coding-agents: add Command Code (cmdc) as a supported agent / #6151 coding-agents README: autoUpdate scope is unstated / #6135 auto-update never runs on npm 12 — npm view --json returns an array, check fails as “unparsable npm output”
  • 讨论区无新增讨论(最新讨论仍停留在 2026-01)

信号观察:

  • 24 小时内 6 个 commit、6 个合并 PR、6 个新 issue、9 个新 PR;合并作者几乎全为 nicoloboschi(4)与 cdbartholomew(2)
  • 本期主题是「不要静默丢东西」:刷新闸门的整批丢弃、‘where’ 维度不可切分时的静默丢弃、停机时的 in-flight 任务丢失、recall 日志说不清是哪个 reranker——四处分别用「有界 + 保留」「显式失败」「宽限 60 s」「指名 + 统一 id」修掉
  • recall 的确定性在继续收紧:BM25 同分按 id 打破(#6143)之外,本期又把服务中的 reranker 成员写进 trace(#6154)——「结果可复现」正在扩展到「结果可归因」
  • 时间语义与排序脱节(#6132)是一个新暴露的建模问题:检索层对「now」「最近」几乎不给权重
  • Hermes 插件同时被报「噪音进记忆」与被提「pre-retain 质量闸门」,记忆写入端正在补内容过滤
  • stars 24 小时 +1,081,是本期五个仓库里唯一显著增长的(其余 +248 / +378 / +34 / +2)

agentclientprotocol/agent-client-protocol

「让任意编辑器接任意 agent」的协议规范 + Rust crate + schema | stars: 4528(+2) | open issues: 31(±0) | 默认分支: main | 最近 push: 2026-10-28T22:11:55Z | 主页: https://agentclientprotocol.com

近 N 周 release 重点:

  • 本期(24 小时)无新 release。最新三个版本仍是 2026-10-27 21:56 发布的 Rust Crate v1.13.0 / Schema v1.27.0 / Schema v2.0.0-alpha.10(上一期已详述)。

其他重要 commits / PRs(按重要性挑选 5–10 条):

  • #2579 docs(protocol): define the v2 session lifecycle (@benbrandt, 10-28)——retention:会话自 session/new 起存在直到 Agent 丢弃它(Agent 可跳过从未 prompt 过的会话、过期旧的、或 session/delete),session/list 与 session/resume 只看得到保留的会话,恢复被丢弃的会话返回 -32002,Agent SHOULD NOT 丢弃活跃会话;active:自 session/new/session/resume 成功起、到 session/close 或连接结束止
  • #2588 docs(protocol): define stdio shutdown and drop the HTTP placeholder (@benbrandt, 10-28)——客户端关闭 Agent 的 stdin 即结束连接,Agent 的会话不再活跃,SHOULD 在工作结束或停止后退出,不退出时客户端 MAY 先 SIGTERM 再 SIGKILL;连接结束时双方都把自己未获响应的请求视为失败;同时删掉空的「Streamable HTTP — draft proposal in progress」段,指向远程传输 RFD
  • #2585 docs(protocol): make setup-response config options and commands authoritative (@benbrandt, 10-28)——setup 响应里的 configOptions / availableCommands 都是完整当前列表,省略或 [] 表示没有、null 非法;响应到达时客户端整体替换自己持有的列表(含响应之前收到的更新);此后每次 config_option_update / available_commands_update 通知同样整体替换(v2 only)
  • #2586 docs(protocol): close active sessions on delete like archive (@benbrandt, 10-28)——删除活跃会话时 Agent MUST 像 session/close 一样取消工作并释放资源再删除;此后对已删除会话的任何请求(不只是 resume)返回 -32002
  • #2582 docs(schema): define declining a permission request and unknown option IDs (@benbrandt, 10-28)——cancelled 现在也覆盖用户关闭弹窗与客户端按策略拒绝(包括没有提供 reject 选项时),此后 Agent MUST NOT 继续;若 selected 的 optionId 与提供的选项不匹配,Agent MUST 视为未批准;optionId 在一个请求内 MUST 唯一
  • #2575 docs(protocol): make session/close idempotent (@benbrandt, 10-28)——关闭不存在或已不活跃的会话(含重复 close)SHOULD 返回空结果成功,与 session/delete 一致;客户端 SHOULD 把 -32002 当作成功关闭
  • #2576 docs(schema): let cancelled cover stops the user chose through the Agent (@benbrandt, 10-28)——用户在 Agent 提供的交互里选择停止(如用「不,继续规划」拒绝计划审批)也是用户取消,报告为 error 是错的;Agent 自身原因停止仍用 max_tokens / max_turn_requests / refusal / error
  • #2580 docs(protocol): define what v2 history replay includes / #2581 in-progress updates on resume aren’t history replay / #2577 apply other terminal_update fields when the output snapshot is invalid / #2578 allow Clients to tolerate a/ and b/ prefixes on relative git_patch paths
  • #2571 fix(schema): mark SessionInfo.additionalDirectories as default-on-null (@benbrandt, 10-28) / 其余 8 个 docs: update registry agents 由 acp-release-bot[bot] 自动合并(#2572 / #2574 / #2583 / #2587)

社区讨论 / 行业方向:

  • 讨论区无新增讨论,最近的讨论仍是 2025 年的旧帖(#37 等)
  • acpserver.org(中文独立生态指南):仍写「线上协议 v1 稳定 / 下一个大版本 v2 草案」,并强调远程 HTTP / WebSocket 传输仍在标准化——与本期 #2588 删除 HTTP 占位段、指向远程传输 RFD 相互印证
  • safeguard.sh 的协议解读(2026-10-24):把 ACP / MCP / A2A / LSP 并列为互补而非竞争
  • 第三方实现侧仍在推进 v2 握手:claude-agent-acp PR #1217 提供 opt-in 的实验性 ACP v2 握手,v1 保持默认

信号观察:

  • 单日 17 个合并 PR(benbrandt 16、bot 1),比上一期的 69 个骤降——上一期是发版冲刺,本期回到语义收口节奏
  • 本期 17 个合并 PR 全部是协议语义,无一处代码实现:会话生命周期、关闭幂等、删除先关闭、stdio 关闭、setup 响应权威性、拒绝权限请求、cancelled 的语义边界、历史回放范围
  • 「会话什么时候算活着」此前在规范里是含糊的,本期用 retention / active 两个概念补齐,并连带修好 close / delete / resume 的失败码一致性
  • 「拒绝」终于有了线上语义:cancelled 覆盖策略性拒绝与用户关闭弹窗,且 Agent MUST NOT 继续——与上一期 security.mdx 的「权限请求只是建议」形成闭环
  • 仍然是 0 个 issue、0 条新讨论(该仓库 issue 区长期为空),规范推进与社区反馈之间的落差本期未变

yxc023/yxc023.github.io

本调研报告的发布载体(个人博客仓库)| stars: 1 | open issues: 27 | 默认分支: master | 最近 push: 2026-10-28T01:03:39Z | 主页: 无

近 N 周 release 重点:

  • 无 release。本期 2 个 commit,均为自动同步:8245b95 与 d3ec2ed「auto(reports): 同步 daily-research 2026-10-28」(2026-10-28 01:02 与 01:03,同一天两次同步)。

其他重要 commits / PRs(按重要性挑选 5–10 条):

  • 本期 0 个新 issue、0 个新 PR;仓库内容仅为每日报告同步产物,无人工变更。

社区讨论 / 行业方向:

  • 无。

信号观察:

  • 仓库保持单一职责:只承载报告同步产物;连续两天的推送时间(00:36 → 01:02)显示调度时点略有漂移。

跨项目观察

  1. 「发布说明与实际产物不一致」在同一个仓库内连出两处,而且都能被外部验证。 opencode 的 v1.19.5 release 宣称只有一条社区贡献修复,而 process-daemon v0.3.2 的 release notes 宣称「published to npm as @opencode/pty@0.3.2」——npm 上该包只有 0.0.0 与 0.0.0-stage,8 个平台包同样如此,而修发布顺序的 PR 还开着。同时同一个仓库的三个「latest」(GitHub Latest release = v1.19.5、npm opencode-ai = 1.19.5、npm @opencode/cli = 2.2.0)指向两个产品。发版流水线的问题已经从「产物格式」(上一期的 app-update.yml)下沉到「发布声明与事实不符」。

  2. 「同一语义只应有一个来源」这条原则本期在四个仓库同时落地,但形态各异。 pi 把 watch 的状态表达从「三种原因」重整为「value / failed / retired 三类调用 + 四种 kind 结束」;opencode 把「免费模型是否可见」的判定从「新鲜度启发式」改成「免费即默认可见、用户可显式隐藏」;ACP 把 setup 响应的 configOptions / availableCommands 定义为「完整当前列表、整体替换」;hindsight 把「哪个 reranker 在服务」写进 trace 与日志 id。四者都在消灭「同一含义有两份定义 / 两种推导」的结构性缺陷。

  3. 缓存与前缀的经济账同时出现在两个 agent 框架,且都从「用户体感」升级为「可复算的数字」。 pi 侧:工具注册顺序决定请求字节从而在 Bedrock 上触发完整缓存重写(#11529)、Bedrock 从不做 cache warming(#11528)、每次调用新建 BedrockRuntimeClient 多付 0.35 s 与 29 条空闲连接(#11527);opencode 侧:拟合输出预算时必须留 1% 窗口否则严格 provider 直接拒绝(#59934,Kimi K2.6 经 OpenRouter 报错),以及 v2.2.0 引入的 per-provider prompt cache TTL。「省 token」在 2026 年 10 月同时是账单问题、延迟问题和正确性问题——这一判断与上一期一致,且本期证据更硬。

  4. 「agent 自己算的钱 / 算的 token」仍然不可信,且本期出现了新形态。 opencode 桌面恒显示 0,00 USD(#60052),上一期已有 10⁶ 倍高估与 6 倍低估;pi 侧 OpenRouter 因「把缓存后的输出容量当作默认输出预算」而直接返回 402(#11517),而页脚只显示用了 1.8% 上下文。错误不只是算错,还会让请求直接失败。

  5. 「静默丢弃」正在被系统性清除,且三家清理的是同一类东西。 pi:超出 inlineBudget 的 codemode 工具连名字都不出现(上一期 #11473)、union 输出 schema 把 8 k 字符打进每次请求(#11501,本期已修);hindsight:刷新闸门一批失败整批丢弃(#6103,本期已修为有界 + 保留)、‘where’ 维度不可切分时 chunk 被静默丢弃(#6133);ACP:本期规定 cancelled 必须覆盖用户关闭弹窗与策略性拒绝,此后 Agent MUST NOT 继续(#2582)。「用户看不见的丢弃」正在从各家 issue 里的个案,被协议与实现同时收口。

  6. 协作形态的分化在本期出现一个方向性变化:ACP 的单人节奏开始回落,pi-web 的沉默开始被质疑。 ACP 单日合并从 69 降到 17(但 17 个全是协议语义,仍由 benbrandt 一人承担,社区零 issue 零讨论);pi-web 连续 9 天零提交、9 个新 issue 与 PR 全部零回复,且首次出现「停更了?」的公开质疑与「放弃追版本、从用户已装的 pi 解析 SDK」的替代方案(#1438)。一边是「一个人把规范写完」,另一边是「社区提交无人接」——两端的差距本期都没有缩小,但 pi-web 端第一次出现了问题本身的公开表述。

  7. 三家同时在做「让会话脱离单轮问答」的尝试,但都刻意不加新的 server 事件。 opencode 的 /goal 用客户端已有的同步数据判定「done」(不引入 session.settled),scheduled tasks 只落存储与定时器;pi 的 Chord v2 slice 8 用 host.root(fn, context, { principal? }) 提供在对象之外运行代码的入口,slice 6b 把 Durable 与 jobs 落到 store 上。「长时运行」的公共基础设施正在成形,且实现方都倾向于用已有机制组合而非新增协议面。

元信息

  • 报告生成时间: 2026-10-29T00:30:00Z
  • 基准时间: 2026-09-08T09:23:29Z(按 spec 读取自上次报告 reports/latest.md 的 基准时间: 字段,自 2026-09-08 起连续 18 期未变)
  • 扫描窗口: 2026-09-08T09:23:29Z → 2026-10-29T00:30:00Z(约 50.6 天);本期新增内容全部落在 2026-10-28T00:30:00Z 之后的约 24 小时
  • 数据源: GitHub API(gh CLI + Search API)+ mmx web search + npm registry + 仓库内 CHANGELOG / package.json 校验
  • API rate limit 剩余: 4975 / 5000(core,抓取完成后查询)
  • 抓取结果: 6 / 6 仓库 × 4 endpoint 全部成功(opencode 的 Discussions endpoint 返回 410「Discussions are disabled for this repo」,已跳过);本期增量统计口径为 created:>=2026-10-28T00:30:00Z / merged:>=2026-10-28T00:30:00Z 的 Search API 计数(opencode:56 commit、60 合并 PR、146 新 issue、139 新 PR;pi:78 commit、15 合并 PR、36 新 issue、11 新 PR;pi-web:0 commit、0 合并 PR、7 新 issue、2 新 PR;hindsight:6 commit、6 合并 PR、6 新 issue、9 新 PR;ACP:17 commit、17 合并 PR、0 新 issue、17 新 PR;blog:2 commit);opencode 的 release notes 取自 GitHub Release v1.19.5 与 process-daemon-v0.3.2、npm registry(opencode-ai、@opencode/cli、@opencode/pty 及 8 个平台包)与 packages/process-daemon/npm/package.json;pi 的 release notes 取自 GitHub Release v1.4.0 与 packages/chord/CHANGELOG.md 的 [Unreleased] 段;hindsight 无根级 CHANGELOG.md,release notes 取自 GitHub Release v1.1.0 与 hindsight-docs/blog/ 目录;ACP 取自 Rust Crate v1.13.0、Schema v1.27.0 与 Schema v2.0.0-alpha.10

评论