Skip to content

fix: 会话列表工作态不再受 health 否决 - #73

Merged
Florious95 merged 32 commits into
mainfrom
pr/external-session-status-ui
Sep 7, 2026
Merged

fix: 会话列表工作态不再受 health 否决#73
Florious95 merged 32 commits into
mainfrom
pr/external-session-status-ui

Conversation

@Florious95

@Florious95 Florious95 commented Sep 3, 2026

Copy link
Copy Markdown
Owner

会话行的工作动画只消费 activity 与在线状态,health 保持独立展示,修复服务端返回 working 而外部列表不显示工作态的问题。

原修复 e7e7779 在本 PR 追加合入已验 nodeprobe main,当前 head 9e04b7c。App subtree 与原 PR73 完全相同;tools/nodeprobe subtree 保持已验 N bdc49c7b8cbaad7604e8c2a7066d89784d9d8abf;唯一文本冲突 DELIVERY.md 已保留两份原始收据。

验证:新 head 的 PR73 activity projection run 34143541172 success;历史决定性红绿为 run 34089083105 / 34091745276。leader已核合并 parents、完整14路径差量及两产品 subtree。用户已用最终 App 组合 APK 完成手机验收并授权合并;最终名称与三面收藏组合随后通过 #89 进入 main。历史未闭架构门不追认为通过。

claude and others added 24 commits September 3, 2026 15:51
Ordinary and favorite rows share one gesture owner: online short-press
opens, offline short-press does not navigate, long-press shows exactly
one favorite action. Working uses the existing busyDot lamp frames;
idle is static; unknown/abnormal play no animation and do not show
question marks or repeated 未知. The right side is the official
Provider mark from the status-core DTO, with pinned LobeHub SVG bytes.
Workspace and favorites production routes now share one SessionRow
(title + cwd, 66dp). Runtime AndroidSVG and LobeHub SVG copies are
removed because the frozen visual source JPEG contains no Provider
glyphs to crop. Canonical ids stay closed; no invented marks.
Reuse icon() inline SVG fallbacks for claude_code/codex/grok/cursor.
Copilot and Pi have no source glyph; those rows stay blank.
Exact drawable-nodpi bytes from 96a075f
(R.drawable.provider_pi / provider_copilot_color). No overlay, no LobeHub download.
Exact prior-app LICENSE/NOTICE blobs for the two reused PNGs only.
KDoc @contract/@inv/@consumes on touched UI files; no icon regeneration.
Grok tiles use BRAND img slug grok, not icon() dead X switch.
Pi working+normal DTO still maps to shared busyDot; no status-core change.


Partial reversal of the activity gate introduced in
1dc7443 (parent
23e0c4f), on owning PR #73.

Keep offline, abnormal/malformed health and unknown activity quiet;
do not erase authoritative working/idle merely because health is unknown.
Keep provider marks, naming, gestures, favorites, server and nodeprobe unchanged.
Add separate Grok and Codex working/unknown-health Compose regressions and
correct the contradictory projection expectations.

Executed standalone Kotlin against exact Models.kt source: 300 combinations,
12 failures before, 0 after. Full Gradle/Compose/device/daemon acceptance not run.
Does not claim to fix the separate Pi server regression or Codex naming.
No merge, deployment, production :9900 access or history rewrite.

Copy link
Copy Markdown
Owner Author

已在原 PR 撤掉已复现的 App 引入点;未 merge / 未部署

本次独立追踪 Grok 工作动态、Codex 工作指示、Codex 名称、Pi 服务端状态四条问题。此提交只处理前两条中已确认的 App known-activity + unknown-health 投影错误,不把 Pi 两端缺失工作状态或 Codex 显示名问题合并进来。

命中坐标

项目 坐标
仓库 / owning PR Florious95/corral-core / #73 (同分支旧 PR71 已被本 PR 取代)
引入 commit 1dc7443dfbf29ce342aec85b0944d7e8da7a08e7
引入 parent 23e0c4f1529b7b51192d6e65ecc62b3b517e2cf5
本次修改前 HEAD 51ea20b6a04629e5eb25bfad11c3f0e1696e002e
局部回退 / 新 HEAD 1642902e7b9fe002f72a0a16a6963be2ef865141
写入分支 pr/external-session-status-ui,单 parent、非强推快进

这是在引入 PR 上撤掉错误条件,不是整体 git revert 1dc7443:整笔回退会同时撤走 Provider 图标、菜单/收藏等无关改动。没有另开补丁 PR,也没有改 main、PR72/74/76、corral-serve、corral-app 或 nodeprobe。

根因与最小撤销

修改前 Models.kt L90–L102health != "normal" 无条件返回 None,把已经明确的 activity=working 与缺乏健康证据的 health=unknown 合并成灭灯。该条件已存在于 引入提交;其 parent 的 SessionListScreenStatusChip(item.status, ...),不通过这个 health veto。

本次只将谓词改为:

if (health != "normal" && health != "unknown") return SessionRowMotion.None

不推断 Provider,不伪造 activity,不把 unknown activity 当 idle。该函数对离线、显式 abnormal 和直接传入的非法 health 仍返回 None;上游 wire 解码/归一化没有修改,不把这个函数级断言冒充全协议验证。

先红后绿:本次确实执行的范围

直接以 Kotlin/JVM 编译仓库 完整 Models.kt,依赖仅取未改动的 L2Status enum;没有用 Python 重写产品判断。输入为合成 SessionItem,6 Provider × 5 activity × 5 health × 2 online = 300 组。

  • 修改前 Models Git blob:ec506ade518db950d79869f40064a14242c4ed14cases=300 failures=12,exit 1;Grok 与 Codex 的 working/unknown-health 分别实际命中 None。
  • 新 HEAD Models Git blob:ca4489748e4a2ce43320927ab04c48586219a69b。已回读核对并编译对应字节:cases=300 failures=0,exit 0。
  • 这证明 App 业务投影回归及局部撤销;不证明手机像素动画、真实服务端 Codex 四轴或 Pi 服务端回归已经验收

已加入原测试文件的独立用例

只修改两个文件:Models.kt 与 ExternalSessionStatusUiTest.kt。既有投影测试撤掉“Busy/Idle + unknown health 必须 None”的错误断言,并保留/补强 unknown activity、abnormal、offline 和直接非法 health 的反例。

Grok 与 Codex 各有独立 Compose 虚拟时钟测试,要求 working 语义存在且 950ms 后帧变化:

cd app
./gradlew :app:testDebugUnitTest \
  --tests 'dev.agentmirror.app.ui.ExternalSessionStatusUiTest.grokWorkingUnknownHealthAdvancesLampFrames' \
  --tests 'dev.agentmirror.app.ui.ExternalSessionStatusUiTest.codexWorkingUnknownHealthAdvancesLampFrames' \
  --tests 'dev.agentmirror.app.ui.ExternalSessionStatusUiTest.fourAxisProjectionKeepsUnknownActivityQuietWithoutVetoingKnownActivity' \
  --rerun-tasks --no-build-cache

以上 Gradle/Compose 命令在本次环境 未执行,不能沿用旧 HEAD 的绿色收据为新 HEAD 背书。需要 Android/Gradle 环境执行后再做设备验收。其他已有 PR 的静态组合或已安装 APK 不会因这个 owning 分支更新而自动改变。

分开的后续边界

  • Grok: 用户描述的桌面正常/手机不亮,与本次确定性 App 复现一致。
  • Codex 工作态: 相同输入下的 App 缺陷已撤掉;未采样用户当前 Codex 的 listing/Level2,不能排除它还存在服务端 activity 缺失。不得从“名字叫 node”推断工作态。
  • Codex 名称: 未修改。toSession 取 window_name 的行为在服务端 PR6 parent 900d7ef419178f614a88603eb9ac942d95e12e54 已存在;不是 PR11 Agent-only 过滤新引入。
  • Pi 两端状态缺失: 未修改、未宣称解决。App 不能补造服务端不存在的 working。

没有 merge、构建/安装 APK、替换探测二进制、重启 daemon 或访问 :9900;没有读取 pane 正文、真实 argv、凭据或真实对话。

@Florious95
Florious95 changed the base branch from pr/status-core-nodeprobe-863c to main September 7, 2026 16:28
@Florious95 Florious95 changed the title feat(app): render native CLI status, provider marks, and Pi session names fix: 会话列表工作态不再受 health 否决 Sep 7, 2026
@Florious95
Florious95 merged commit 2a25377 into main Sep 7, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants