外部精选
omp · v18.10.1
本文来自外部来源,不是黄奕彬的原创文章。本站提供原文入口,并在采集端生成 AI 结构化摘要、解读与中文翻译(如有),一切以原文为准。
阅读原文(github.com)结构化摘要 AI 生成
背景与问题
这是 oh-my-pi(omp)项目 v18.10.1 的发布说明(Full Changelog:v18.10.0...v18.10.1),属于补丁级增量更新。它面向该生态的两个包——@oh-my-pi/pi-coding-agent(含 Tern 客户端)与 @oh-my-pi/pi-tui(组件库)。
要解决的问题是上一版本中 Tern 及组件原生渲染在视觉一致性、交互细节与若干缺陷上的不足,例如原生倒计时自始冻结、单文件 grep 展示异常等。除变更清单外,原文未说明更早的版本历史或发布动机。
方法或内容
发布说明以 Added / Changed / Fixed 三段式列出两个包的变更:
@oh-my-pi/pi-coding-agent:在 Tern 回答下方的回合页脚新增复制按钮;将运行中的 agent 与后台任务合并为单一紧凑计数器;把/session pin、/usage reset等小型选择器统一为同一 picker sheet;扩展打开的文本编辑器改为 composer 处的 sheet。@oh-my-pi/pi-tui:重写多个组件的原生渲染(turn footer、悬停工具栏、ContextUsageView、AskDialogComponent、MCPAddWizard、HookInputComponent、JobsSheet、BtwHistoryPanel等),并修复 CountdownTimer、焦点与 MCP 向导的缺陷。
关键发现 / 结果
具体变更点(原文逐条列示,未提供其他数据):
pi-coding-agent:回合页脚新增复制按钮(替换原时钟位置,示例为 ⧉ · 2m13s · 71K tok · $0.85 this turn);两个「N running」胶囊合并为一个紧凑计数器(悬停显词,各计数仍各开各的 sheet);思考等级选择器以 meter 显示深度,插件/队列选择器改用徽章与通俗名称,主题选择器不再重复显示 (current);扩展打开的编辑器与 ask 工具的自定义回答/备注变为 composer 处的 sheet,按键显示于 tooltip;修复单文件grep无文件行、无语法着色的问题。pi-tui:AssistantMessageComponent页脚以omp.turn.copy复制图标领衔;UserMessageComponent悬停工具栏改为 Copy 与 Rewind 图标;ContextUsageView改为已用 token、压缩前余量、阈值刻度堆叠条、分类分行与 snapcompact 估算;MCPAddWizard改为每步一问的分步 sheet(Ctrl+C / Esc / Enter 操作);JobsSheet改为 master–detail 分栏;修复stopped: 0冻结所有原生倒计时、overlay sheet 内字段无法聚焦、MCP 向导多处交互缺陷。
结论与意义
原文未给出总结性结论,发布说明本身即交付物。可确认的意义:v18.10.1 是一次以 UI 一致性打磨与缺陷修复为主的补丁更新,核心收益包括修复原生倒计时自始冻结的 stopped: 0 缺陷、修复 overlay/picker sheet 内字段焦点、统一 Tern 内各类选择器与编辑器形态。
适用边界:所有变更描述均限定在 Tern 客户端与 pi-tui 组件原生渲染的语境下,部分能力依赖终端特性(如 meter)或原生后端;原文未提供性能数据、测试结果或兼容性承诺。
AI 解读 AI 生成
方法:按「时空变量」分析(时间 / 空间 / 变量,严格区分包含、相关与因果),对象包括原文作者、署名人员与关键技术及其实际原理;结论用「元反空」(元思考、反思考、空思考、综合)整理。
时间:何时发生,现在是否仍成立
来源日期为 2026-10-12 13:55:11(北京时间,由 UTC 时间换算),对应 tag v18.10.1,变更区间为 v18.10.0...v18.10.1。作为历史记录,这份变更清单本身长期有效;但其中描述的界面行为、omp.* 类名与交互细节均绑定该版本,后续版本可能再次调整,现在是否仍如此呈现,原文未说明。
空间:谁的环境 / 场景
适用对象与场景:
- 产品:oh-my-pi(omp)生态,版本
v18.10.1。 - 包:
@oh-my-pi/pi-coding-agent与@oh-my-pi/pi-tui。 - 形态:主要影响 Tern 客户端内的界面(回合页脚、composer、picker sheet、编辑器 sheet、任务面板等),以及宿主使用
pi-tui组件原生渲染时的表现。 - 环境限定:
ContextUsageView的原生 body 明确限定于支持 meter 的终端;焦点修复限定于原生后端;键位提示(Esc / Enter / Ctrl+C)适用于相应 sheet 交互。
变量:实际改变了什么
相对 v18.10.0 的实际变化(择要):
- 行为:两个「N running」胶囊 → 单一紧凑计数器;单文件
grep由无文件行、无语法着色的分块片段 → 与目录grep一致的展示;CountdownTimer不再发送stopped: 0(此前导致扩展输入、选择器与编辑器提示中的原生倒计时自始冻结为 0)。 - 交互:键帽提示行 → 按键写入按钮 tooltip;
MCPAddWizard的 Yes/No 保存选择 → 回车即存;登录失败后 Edit OAuth settings 可再次打开设置而非无响应。 - 展示:插件/队列选择器由方括号文本 → 徽章与通俗名称;
ContextUsageView移除 blocks meter 与 legend kv,页头不再重复窗口大小;主题选择器不再显示 (current);JobsSheet中任务型 job 不再绘制 agent 节点;Review 标签页答案不再带 (Recommended) 后缀。
区分:包含 ≠ 相关 ≠ 因果
原文中唯一有明确因果证据的条目:CountdownTimer 的原生 elapsed 发送 stopped: 0,原文明确写「which froze every native countdown … at zero from the start」,即该消息导致所有原生倒计时自始冻结,修复即去除该发送。
焦点修复中的「so that field shows the live caret and focus ring」属于目的/效果描述,可视为弱因果。其余条目多为包含关系(某组件属于 @oh-my-pi/pi-tui、某按钮属于某页脚)或并列的相关变更,不构成因果主张;发布说明未对性能、稳定性或用户收益做任何因果性断言。
对象:作者/署名与关键技术原理
署名:仅结构化作者字段给出 github-actions[bot](GitHub 自动化账号),无人类作者信息;正文未提及其他人员,也不应从正文猜测。关键技术(按原文描述的原理):
- Tern 回合页脚:显示每回合时长、token 用量与费用,新增复制入口
omp.turn.copy。 - 语义化原生渲染:组件以
omp.*角色/类暴露结构,如omp.user.tools、omp.context.cat、omp.editor.ask、omp.mcpAdd.*系列、omp.jobs.split、omp.btw.*系列等。 - 上下文用量视图:展示已用 token 与自动压缩(auto-compaction)阈值前的余量,一条在阈值处刻度的堆叠条,按类别分行列出 swatch、名称、token 与占比,并给出 snapcompact 估算。
- MCP 添加向导:每步一问、阶段进度条、OAuth client secret 掩码、连接测试忙碌态、Enter 保存。
JobsSheet:master–detail 分栏,按 Running / Recent 分组,展示状态、实时时长、agent、目录、PID、退出码、产物与输出。
元反空综合结论
元:这份内容本质在回答「v18.10.1 相对上一版改了什么」,核心是把 Tern 已确立的交互语言(sheet、picker、徽章、图标加悬停文字、tooltip 键位)系统性推广到 pi-tui 各组件的原生渲染,并清除新 UI 层引入的回归缺陷。
反:最可能失效或有边界的部分——所有界面细节(omp.* 类名、布局、文案)都绑定 v18.10.1,后续版本可随时改动;ContextUsageView 依赖 meter 终端、焦点修复依赖原生后端,能力边界由宿主环境决定;发布说明不含任何性能数据、测试结果或兼容性承诺,不能据此推断质量改善幅度。
空:去掉叙述后剩下的必要事实是——2026-10-12 由 github-actions[bot] 发布 tag v18.10.1,对 @oh-my-pi/pi-coding-agent 与 @oh-my-pi/pi-tui 各列出一组新增/变更/修复;其中唯一被明确陈述的因果缺陷是 stopped: 0 冻结原生倒计时,且已修复。
综合:这是一次低风险、以 UI 一致性与缺陷修复为主的补丁发布,条目与 changelog 一一对应、可信度高;但其价值受版本时效与环境依赖限制,只宜作为该版本的变更记录阅读,而非长期稳定的行为承诺。
中文译文 AI 生成
@oh-my-pi/pi-coding-agent
新增
- 新增了一个 Copy 按钮,打头显示在 Tern 中答案下方的 turn 页脚(⧉ · 2m13s · 71K tok · $0.85 this turn,取代原来的时钟),用于复制该答案
变更
- 在 Tern 中,正在运行的 agent 和后台任务现在在 composer 上方共用一个紧凑计数器(各有一个图标和计数,悬停时显示文字),而不是两个 "N running" 胶囊标签;每个计数仍会打开各自的 sheet
- 在 Tern 中,
/session pin和/usage reset会打开与其他小型选择器相同的选取 sheet(当前账户带勾选标记,执行一次 reset 前有一条确认条,不可用的账户置灰并显示原因);thinking 级别选择器以计量条显示每个级别的深度,插件和队列模式选择器使用徽章(version、installed、scope、recommended)和通俗名称取代方括号文本,主题选择器不再在其勾选标记旁重复显示 "(current)" - 在 Tern 中,扩展所打开的文本编辑器(以及 ask 工具的自定义回答和备注)现在是一个位于 composer 位置的 sheet:标题位于其详细信息之上,文本直接写在 sheet 上,并有 Open in editor、Cancel 和 Submit 按钮,其按键显示在各自的 tooltip 中,而非按键帽提示行
修复
- 修复了在 Tern 中对单个文件
grep时显示为各自独立的带框片段、既无文件行也无语法颜色的问题;现在其外观与对目录的grep相同
@oh-my-pi/pi-tui
新增
AssistantMessageComponent的原生 turn 页脚以一个 Copy 图标(omp.turn.copy)和一个圆点打头,取代时钟图标;它复制答案的文本,并在宿主处理 transcript 操作时显示
变更
UserMessageComponent的原生悬停工具栏(omp.user.tools)以 Copy 和 Rewind 图标按钮(copy、rewind)打头,取代文字标签,随后是一个圆点和时间,与 turn 用量页脚一致ContextUsageView的原生主体(在带计量条的终端上)以已使用的 token 数和 auto-compaction 之前的剩余空间打头,随后是一条在阈值处带刻度的堆叠条,明细以行呈现(omp.context.cat、.cat.free、.cat.buffer:色块、名称、token 数、占比;确切计数在行的 title 中),snapcompact 估算以带标签的行呈现(omp.context.snap);blocks 计量条和 legend kv 已移除,contextUsageHead不再重复显示窗口大小AskDialogComponent的原生根元素是omp.editor.ask(折叠时:omp.editor.ask.hidden、倒计时、作为omp.ask.summary的问题、Skip 和 Show):选中的答案是带强调色的行(勾选状态还带勾选图标),而非高亮行;多选中的 Other… 为omp.ask.other.check;问题标签页会对已回答的问题打勾,并在该条带的 title 中报出其按键;倒计时从头部移至 Hide 旁的 action bar;预览为omp.ask.preview;Review 标签页以omp.ask.notice打头,并按问题名称列出答案(omp.ask.answers),内联代码为等宽字体且不带 (Recommended) 后缀;选项描述中的内联代码为等宽字体,备注以 em 形式附于该行的 detail 上;Submit/Next 的 tooltip 只报出 Enter(多选时还有 Space)MCPAddWizard的原生 sheet 每步只问一个问题:一条阶段条(omp.mcpAdd.progress,属omp.mcpAdd.phase,done/current/upcoming 各有色调,无需 auth 时为中性色)、问题及其引导(omp.mcpAdd.title,可选字段为omp.mcpAdd.tag,omp.mcpAdd.lead),然后是一个带占位符及其规则或拒绝提示的等宽字体输入框(omp.mcpAdd.field,tone: "error";omp.mcpAdd.note)、带图标和等宽标签的选项行(omp.mcpAdd.choices)、状态行(omp.mcpAdd.status、omp.mcpAdd.checks、omp.mcpAdd.error)或审阅行(omp.mcpAdd.summary)。Cancel、Back 和 Continue / Save server 按钮分别执行 Ctrl+C、Esc 和 Enter,取代按键提示条。连接测试会显示自己的忙碌步骤,OAuth 的 client secret 字段做了掩码处理,审阅页按 Enter 保存(没有 Yes/No 选择)ReportPanel的原生主体承担omp.report.body角色HookInputComponent描述一个 dock sheet(omp.overlay.hook-inputcol),与HookEditorComponent的相同:标题首行(omp.hook-input.title,倒计时为omp.hook-input.timer)位于其余各行(omp.hook-input.detail)之上,输入框(omp.hook-input.field,提交被拒绝时 tone: "error")带其占位符,以及执行 Esc / Enter 的 Cancel / Submit 按钮;输入框下方的按键图例仅限终端显示JobsSheet的原生主体是一个主从分栏(omp.jobs.split:omp.jobs.master|omp.jobs.detail):任务列表按 Running / Recent 分组(omp.jobs.group标签),每行是一个按状态着色的类型图标及其时长,旁边是所选任务的状态胶囊、实时耗时和 Cancel job(omp.jobs.status)、其任务标题或命令(omp.jobs.title/omp.jobs.command)、事实信息(omp.jobs.facts:agent、directory、pids、exit code、artifact)以及输出(omp.jobs.out、omp.jobs.nooutput);页脚统计正在运行和最近的任务(omp.jobs.summary),没有任务时显示空状态(omp.jobs.empty)。Task 任务不再在此绘制 agent 节点BtwHistoryPanel的原生 sheet 居中显示,阅读体验类似邮件阅读器:问题以两行条目呈现(omp.btw.history,列表为omp.btw.list/ 答案持有按键时为omp.btw.list.idle),旁边是所选 thread(omp.btw.reader›omp.btw.thread›omp.btw.turn:omp.btw.question/omp.btw.followup、omp.btw.meta、omp.btw.answer、omp.btw.error),最后一个答案下方是追问输入框(omp.btw.composer),页脚按钮为 Stop answer、Copy answer、Close 和 Follow up(撰写时为 Cancel 和 Send),取代焦点标签和按键提示条;空历史是一个 md sheet(omp.btw.empty)
修复
CountdownTimer的原生 elapsed 不再发送stopped: 0,该值曾使所有原生倒计时(扩展输入、选择器和编辑器提示)从一开始就冻结为零- 原生后端的焦点现在可以到达从 dock 组件提升到 layer 的 overlay/picker sheet 内的输入框(MCP add 向导、login),因此该输入框会显示实时光标和焦点环
MCPAddWizard 会将被拒绝的名称或 URL 保留在其输入框中,在点击 Back 时清除过期的拒绝信息,并忽略在用户后退之后才返回结果的连接测试;登录失败后,Edit OAuth settings 会再次打开设置,而不是毫无反应。
完整变更日志:v18.10.0...v18.10.1
展开原文提取正文(采集端自动提取,可能有缺失)
@oh-my-pi/pi-coding-agent
Added
Added a Copy button that leads the turn footer under an answer in Tern (⧉ · 2m13s · 71K tok · $0.85 this turn, in place of the clock), which copies that answer
Changed
Running agents and background jobs in Tern now share one compact counter over the composer (an icon and a count each, the words on hover) instead of two "N running" pills; each count still opens its own sheet In Tern, /session pin and /usage reset open the same picker sheet as the other small selectors (the active account checked, a confirm strip before a reset is spent, unusable accounts dimmed with the reason); the thinking level picker shows each level's depth as a meter, the plugin and queue mode pickers use badges (version, installed, scope, recommended) and plain-language names instead of bracketed text, and the theme picker no longer repeats "(current)" beside its check In Tern, the text editor an extension opens (and the ask tool's custom answer and note) is now a sheet in the composer's place: the title over its details, the text written straight on the sheet, and Open in editor, Cancel and Submit buttons whose keys show in their tooltips instead of a keycap hint row
Fixed
Fixed grep on a single file showing in Tern as separate boxed snippets with no file row or syntax colors; it now looks the same as a grep over a directory
@oh-my-pi/pi-tui
Added
AssistantMessageComponent's native turn footer leads with a Copy icon (omp.turn.copy) and a dot instead of the clock icon; it copies the answer's text and shows when the host handles transcript actions
Changed
UserMessageComponent's native hover toolbar (omp.user.tools) leads with Copy and Rewind icon buttons (copy, rewind) instead of text labels, then a dot and the time, like the turn usage footer ContextUsageView's native body (on terminals with meter) leads with the tokens used and the room left before auto-compaction, then one stacked bar ticked at the threshold, the breakdown as rows (omp.context.cat, .cat.free, .cat.buffer: swatch, name, tokens, share; the exact count in the row's title) and the snapcompact estimate as labelled rows (omp.context.snap); the blocks meter and legend kv are gone, and contextUsageHead no longer repeats the window size AskDialogComponent's native root is omp.editor.ask (collapsed: omp.editor.ask.hidden, the countdown, the question as omp.ask.summary, Skip and Show): a chosen answer is the accent-toned row (a check also carries the check icon) instead of the highlighted one; multi-select Other… is omp.ask.other.check; the question tabs check answered questions and say their keys in the strip's title; the countdown moves from the head to the action bar beside Hide; the preview is omp.ask.preview; the Review tab leads with omp.ask.notice and lists answers (omp.ask.answers) by question name with inline code mono and no (Recommended) suffix; option descriptions run inline code mono, notes ride the row's detail as em; Submit/Next's tooltip names only Enter (and Space on a multi-select) MCPAddWizard's native sheet asks one question per step: a phase strip (omp.mcpAdd.progress of omp.mcpAdd.phase, toned done/current/upcoming and neutral when no auth was needed), the question and its lead (omp.mcpAdd.title, omp.mcpAdd.tag for optional fields, omp.mcpAdd.lead), then a mono field with a placeholder and its rule or refusal (omp.mcpAdd.field, tone: "error"; omp.mcpAdd.note), choice rows with icons and mono tags (omp.mcpAdd.choices), status lines (omp.mcpAdd.status, omp.mcpAdd.checks, omp.mcpAdd.error) or the review rows (omp.mcpAdd.summary). Cancel, Back and Continue / Save server buttons run Ctrl+C, Esc and Enter instead of a key-hint strip. The connection test shows its own busy step, the OAuth client secret field is masked, and the review saves on Enter (no Yes/No choice) ReportPanel's native body carries the role omp.report.body HookInputComponent describes a dock sheet (omp.overlay.hook-input col) like HookEditorComponent's: the title's first line (omp.hook-input.title, the countdown as omp.hook-input.timer) over its further lines (omp.hook-input.detail), the field (omp.hook-input.field, tone: "error" while a submit was refused) with its placeholder, and Cancel / Submit buttons that run Esc / Enter; the key legend under the field is terminal-only JobsSheet's native body is a master–detail split (omp.jobs.split: omp.jobs.master | omp.jobs.detail): the job list grouped Running / Recent (omp.jobs.group labels), each row a type icon tinted by status with its duration, beside the selected job's status pill, live elapsed and Cancel job (omp.jobs.status), its task title or command (omp.jobs.title / omp.jobs.command), facts (omp.jobs.facts: agent, directory, pids, exit code, artifact) and output (omp.jobs.out, omp.jobs.nooutput); the footer counts running and recent jobs (omp.jobs.summary), and no jobs shows an empty state (omp.jobs.empty). Task jobs no longer draw an agent node here BtwHistoryPanel's native sheet is centered and reads like a mail reader: the questions as two-line rows (omp.btw.history, list omp.btw.list / omp.btw.list.idle while the answer has the keys) beside the selected thread (omp.btw.reader › omp.btw.thread › omp.btw.turn: omp.btw.question / omp.btw.followup, omp.btw.meta, omp.btw.answer, omp.btw.error), the follow-up field under the last answer (omp.btw.composer), and footer buttons Stop answer, Copy answer, Close and Follow up (Cancel and Send while composing) in place of the focus labels and key-hint strip; an empty history is an md sheet (omp.btw.empty)
Fixed
CountdownTimer's native elapsed no longer sends stopped: 0, which froze every native countdown (extension input, selector and editor prompts) at zero from the start The native backend's focus now reaches a field inside an overlay/picker sheet hoisted into the layer from a dock component (the MCP add wizard, login), so that field shows the live caret and focus ring MCPAddWizard keeps a refused name or URL in its field, clears a stale refusal on Back, ignores a connection test that settles after the user stepped back, and Edit OAuth settings after a failed sign-in opens the settings again instead of doing nothing
Full Changelog: v18.10.0...v18.10.1
原文入口
阅读原文(github.com)原文将在新窗口打开。收录时间不是内容更新时间;正文、译文与解读的版权归原作者/来源所有,本站仅作个人阅读辅助并保留原文入口;页面时间均为北京时间。
了解来源批准与收录规则