Skip to content

feat(cli): tighten response timestamp consistency and tests - #5850

Merged
yiliang114 merged 2 commits into
QwenLM:mainfrom
ZijianZhang989:feat/timestamp-consistency-tests
Jun 26, 2026
Merged

feat(cli): tighten response timestamp consistency and tests#5850
yiliang114 merged 2 commits into
QwenLM:mainfrom
ZijianZhang989:feat/timestamp-consistency-tests

Conversation

@ZijianZhang989

Copy link
Copy Markdown
Collaborator

What this PR does

Follow-up to PR #5001 (optional response timestamps). Three consistency and hardening items: (1) resumed assistant messages now carry their original conversation record timestamp so historical turns display [HH:MM:SS] consistently with newly streamed turns; (2) the time format now explicitly requests two-digit hour, minute, and second fields to guarantee HH:MM:SS across all ICU/runtime variants; (3) added positive stream tests that assert useGeminiStream attaches a numeric timestamp to gemini items and does not attach one to any non-gemini item type.

Why it's needed

With output.showTimestamps enabled, old assistant turns from a restored session appeared without timestamps while newly streamed turns included them — a visible inconsistency. The toLocaleTimeString options also lacked explicit digit-width hints, which could produce single-digit hours on some ICU variants. The stream-level timestamp behavior had no dedicated test coverage.

Reviewer Test Plan

How to verify

cd packages/cli && npx vitest run src/ui/utils/resumeHistoryUtils.test.ts src/ui/hooks/useGeminiStream.test.tsx -t "timestamp"
  1. Run npm run dev
  2. Enable output.showTimestamps in /settings
  3. Ask a question — verify [HH:MM:SS] appears before the response
  4. Resume a previous session — verify historical assistant turns also show timestamps
  5. Disable showTimestamps — next response should not have timestamp

Evidence (Before & After)

Before: Resumed sessions showed timestamps only on newly streamed turns; historical turns had none. Time format could vary across ICU versions.

After: All assistant turns (new and resumed) show [HH:MM:SS] when the setting is enabled. Format is guaranteed two-digit across all platforms.

Tested on

OS Status
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

Environment

Node v22, macOS arm64, dev build (npm run dev).

Risk & Scope

  • Main risk: Minimal — ChatRecord.timestamp is always a valid ISO 8601 string, so new Date().getTime() is safe. The timestamp field on HistoryItemGemini is optional, maintaining backward compatibility.
  • Not validated: Windows and Linux testing. Subagent responses (different rendering path). Non-interactive output modes.
  • Breaking changes: None. The setting defaults to false.

Linked Issues

Closes #5610

Refs #4899
Refs #5001

中文说明

这个 PR 做了什么

PR #5001(可选响应时间戳)的后续工作。三项一致性和加固改动:(1) 恢复的助手消息现在携带原始会话记录的时间戳,使历史 turn 与新流式 turn 一样显示 [HH:MM:SS];(2) 时间格式现在显式请求两位小时、分钟和秒字段,确保在所有 ICU/运行时变体上保证 HH:MM:SS;(3) 添加了正向流测试,验证 useGeminiStreamgemini 类型 item 附加数字时间戳,不为任何非 gemini 类型 item 附加时间戳。

为什么需要

启用 output.showTimestamps 后,从恢复的会话中加载的旧助手 turn 没有时间戳,而新流式 turn 有时间戳——可见的不一致性。toLocaleTimeString 选项也缺少显式的数字宽度提示,在某些 ICU 变体上可能产生单位数小时。流级别的时间戳行为没有专门的测试覆盖。

Reviewer Test Plan

cd packages/cli && npx vitest run src/ui/utils/resumeHistoryUtils.test.ts src/ui/hooks/useGeminiStream.test.tsx -t "timestamp"
  1. 运行 npm run dev
  2. /settings 中启用 output.showTimestamps
  3. 提问 — 验证响应前出现 [HH:MM:SS]
  4. 恢复之前的会话 — 验证历史助手 turn 也显示时间戳
  5. 禁用 showTimestamps — 下次回复不应有时间戳

风险与范围

  • 主要风险: 最小 — ChatRecord.timestamp 始终是有效的 ISO 8601 字符串。HistoryItemGemini 上的 timestamp 字段是可选的,保持向后兼容。
  • 未验证: Windows 和 Linux 测试。子代理响应(不同渲染路径)。非交互式输出模式。
  • 破坏性更改: 无。设置默认为 false

关联 Issues

Closes #5610

Refs #4899
Refs #5001

俊良 and others added 2 commits June 25, 2026 15:24
)

- Preserve timestamps for resumed assistant messages in convertToHistoryItems
  using ChatRecord.timestamp (ISO 8601 → epoch ms)
- Add explicit hour/minute/second 2-digit options to toLocaleTimeString for
  guaranteed HH:MM:SS format across ICU variants
- Add positive stream tests asserting commitItem attaches numeric timestamp
  to gemini items and does not attach one to user items
- Update existing resumeHistoryUtils tests to include timestamp in mock data

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
…ems (QwenLM#5610)

Review feedback: the previous test only asserted on user items, but the
issue asks to verify timestamps are not attached to continuation items
(gemini_content). Changed to assert on all non-gemini types.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@ZijianZhang989
ZijianZhang989 marked this pull request as ready for review June 25, 2026 08:23
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR, @ZijianZhang989!

Template looks good ✓ — all required headings present, bilingual, test plan included.

On direction: this is a solid follow-up to PR #5001. Resumed sessions showing timestamps on new turns but not historical ones is a genuine, user-visible inconsistency. Tightening the toLocaleTimeString options for ICU portability is also sensible — defensive in a good way. CHANGELOG has no direct reference, but timestamp display was introduced in #5001 and this is a natural hardening pass. Aligned.

On approach: the scope feels right. 6 lines of production code, the rest is test coverage. Each change maps directly to a stated goal: hour/minute/second: '2-digit' for format consistency, timestamp: new Date(record.timestamp).getTime() for resumed-session parity, and new stream tests for the commitItem path. No unrelated changes, no drive-by refactors. Clean.

One thing to flag (non-blocking): new Date(record.timestamp).getTime() will silently produce NaN if record.timestamp is ever an invalid date string. NaN != null is true, so HistoryItemDisplay would render [Invalid Date] rather than hiding the timestamp. In practice ChatRecord.timestamp is always set to a valid ISO 8601 string by chatRecordingService, so this is unlikely — but a Number.isNaN guard would be a one-liner. Your call on whether the belt is worth the suspenders.

Moving on to code review and testing. 🔍

中文说明

感谢贡献,@ZijianZhang989

模板完整 ✓ — 所有必需标题齐全,双语,含测试计划。

方向:这是 PR #5001 的一个合理后续。恢复的会话中,新 turn 有时间戳但历史 turn 没有,这是真实可见的不一致性。收紧 toLocaleTimeString 选项以保证 ICU 可移植性也是合理的防御性编程。CHANGELOG 无直接引用,但时间戳显示功能引入于 #5001,本次是自然的加固。方向对齐。

方案:范围合理。6 行生产代码,其余是测试覆盖。每项改动都直接对应一个声明的目标:hour/minute/second: '2-digit' 保证格式一致性,timestamp: new Date(record.timestamp).getTime() 保证恢复会话的一致性,新增流测试覆盖 commitItem 路径。无无关改动,无顺手重构。干净。

一个非阻塞提醒:如果 record.timestamp 碰巧是无效的日期字符串,new Date(record.timestamp).getTime() 会默默返回 NaN。由于 NaN != nulltrueHistoryItemDisplay 会渲染 [Invalid Date] 而不是隐藏时间戳。实际上 ChatRecord.timestamp 始终由 chatRecordingService 设为有效 ISO 8601 字符串,所以这不太可能发生——但加一个 Number.isNaN 守卫只需一行。你来决定是否需要这个额外保险。

进入代码审查和测试 🔍

Qwen Code · qwen3.7-max

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Code Review

Independent proposal (before reading the diff): to fix the resumed-session timestamp inconsistency, I would:

  1. In resumeHistoryUtils.ts, pass record.timestamp (already available as ISO 8601 on ChatRecord) through to the gemini item as a numeric epoch ms
  2. In HistoryItemDisplay.tsx, tighten toLocaleTimeString with explicit 2-digit fields for ICU portability
  3. Add tests for the stream path's commitItem timestamp attachment

The PR does exactly this. The implementation matches my proposal 1:1.

Findings:

  • No critical issues. All four changes are minimal and focused. The commitItem guard in useGeminiStream.ts (line 466: if (item.type === 'gemini' && !(item as HistoryItemGemini).timestamp)) correctly avoids overwriting an already-set timestamp — so resumed items carry their original time and new stream items get Date.now(). Clean handoff.
  • Non-blocking observation (from Stage 1): new Date(record.timestamp).getTime() can produce NaN for invalid strings, which would render [Invalid Date] since NaN != null. Unlikely in practice — ChatRecord.timestamp is always set by chatRecordingService to valid ISO 8601. A one-line guard (Number.isNaN(t) ? undefined : t) would close the edge case entirely.

Tests

All targeted tests pass:

✓ src/ui/hooks/useGeminiStream.test.tsx  (2 passed, 144 skipped by -t "timestamp")
  - "attaches a numeric timestamp to gemini items via commitItem" ✓
  - "does not attach timestamp to non-gemini items" ✓

✓ src/ui/utils/resumeHistoryUtils.test.ts  (18 passed)
  - All existing tests pass with updated fixture assertions (timestamp field on gemini items)

Typecheck: clean (0 errors across all packages)
Lint: clean (0 errors, 15 pre-existing warnings unrelated to this PR)

Real-Scenario Testing (tmux)

Attempted but could not complete — the CI environment has no API key configured, so qwen -p and interactive mode both time out waiting for a response. This PR's changes are inherently about TUI rendering (timestamp display format) and session-resume data flow, both of which require a live API response to observe visually.

Mitigation: the unit test coverage is strong. The two changed code paths are:

  1. toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' }) — standard Intl API, trivially correct
  2. timestamp: new Date(record.timestamp).getTime() — verified by 18 resumeHistoryUtils tests that assert the exact epoch ms

Terminal Output (attempted)

$ qwen -p 'say hi'
(command timed out — no API key configured in CI environment)
中文说明

代码审查

独立方案(阅读 diff 前):要修复恢复会话的时间戳不一致问题,我会:

  1. resumeHistoryUtils.ts 中将 record.timestamp(已有的 ISO 8601)传递给 gemini item 作为数字 epoch ms
  2. HistoryItemDisplay.tsx 中用显式 2-digit 字段收紧 toLocaleTimeString 的 ICU 可移植性
  3. 为流路径的 commitItem 时间戳附加添加测试

PR 完全按照此方案实现,1:1 匹配。

发现:

  • 无关键问题。 四项改动都是最小化的、聚焦的。commitItem 中的守卫(第 466 行:if (item.type === 'gemini' && !(item as HistoryItemGemini).timestamp))正确地避免了覆盖已有时间戳——恢复的 item 保留原始时间,新流 item 获得 Date.now()
  • 非阻塞观察new Date(record.timestamp).getTime() 对无效字符串会产生 NaN。实践中不太可能(ChatRecord.timestamp 始终由 chatRecordingService 设为有效 ISO 8601)。一行守卫即可关闭此边缘情况。

测试

所有目标测试通过:

  • useGeminiStream.test.tsx:2 个新时间戳测试通过
  • resumeHistoryUtils.test.ts:18 个测试全部通过(fixture 断言已更新)
  • Typecheck:全包 0 错误
  • Lint:0 错误(15 个预存警告与本 PR 无关)

真实场景测试(tmux)

已尝试但无法完成——CI 环境无 API key,qwen -p 和交互模式均超时。本 PR 的改动本质上关于 TUI 渲染(时间戳显示格式)和会话恢复数据流,两者都需要实时 API 响应才能视觉观察。

缓解: 单元测试覆盖充分。两条修改的代码路径均有可靠的测试验证。

Qwen Code · qwen3.7-max

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Stepping back: this is the kind of PR that's easy to approve because every line earns its place. Six lines of production code fix a visible inconsistency (resumed sessions missing timestamps) and tighten format portability (ICU digit-width). The remaining 111 lines are test coverage — both for the new resume path and for existing stream behavior that was previously untested.

My independent proposal matched the PR's approach exactly. The commitItem guard already in the codebase (if (item.type === 'gemini' && !item.timestamp)) makes the integration clean: resumed items carry their original timestamp, new stream items get Date.now(), and neither path stomps on the other.

The NaN edge case from an invalid record.timestamp is the only thing I'd flag for the author to consider — not as a blocker, but as a one-line defensive guard that's easy to add now.

Couldn't run tmux real-scenario testing (no API key in CI), but the unit test coverage is thorough: 20 tests across both changed files, all passing. Typecheck and lint clean.

Ships the fix cleanly, no scope creep, good test hygiene. LGTM. ✅

中文说明

退一步看:这个 PR 容易批准,因为每一行代码都物有所值。6 行生产代码修复了一个可见的不一致(恢复的会话缺少时间戳)并收紧了格式可移植性(ICU 数字宽度)。其余 111 行是测试覆盖——既覆盖新的恢复路径,也覆盖了之前未测试的现有流行为。

我的独立方案与 PR 的实现完全一致。代码库中已有的 commitItem 守卫(if (item.type === 'gemini' && !item.timestamp))使集成非常干净:恢复的 item 保留原始时间戳,新流 item 获得 Date.now(),两条路径互不干扰。

唯一要提醒作者考虑的是无效 record.timestamp 产生的 NaN 边缘情况——不是阻塞项,但一行防御性守卫很容易加上。

无法在 CI 中运行 tmux 真实场景测试(无 API key),但单元测试覆盖充分:两个改动文件共 20 个测试全部通过。Typecheck 和 lint 均干净。

干净地交付了修复,无范围蔓延,测试素养好。LGTM。✅

Qwen Code · qwen3.7-max

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship. ✅

Comment thread packages/cli/src/ui/utils/resumeHistoryUtils.ts
Comment thread packages/cli/src/ui/utils/resumeHistoryUtils.test.ts

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] agentHistoryAdapter.ts:65 — Sub-agent gemini items miss timestamps. The agentMessagesToHistoryItems adapter creates { type: 'gemini', text: msg.content } without propagating msg.timestamp, even though AgentMessage.timestamp is a required number field. Sub-agent assistant responses will never show timestamps when showTimestamps is enabled, undermining the PR's consistency goal. Add timestamp: msg.timestamp to the gemini item construction.

[Suggestion] HistoryItemDisplay.test.tsx:457 — The timestamp format test fixture uses new Date('2026-01-15T14:30:45') which has naturally 2-digit time components. The regex /\[\d{2}:\d{2}:\d{2}\]/ would pass with or without the explicit 2-digit options, so the test can't catch a regression if someone removes them. Consider changing the fixture to new Date('2026-01-15T09:05:03') with single-digit components.

— qwen3.7-max via Qwen Code /review

});

const geminiCalls = mockAddItem.mock.calls.filter(
(call: any[]) => call[0]?.type === 'gemini',

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] Inconsistent (call: any[]) type annotations in the new filter callbacks. All other mockAddItem.mock.calls.filter callbacks in this file (e.g., lines 5934, 5991, 7468) use untyped (call) parameters. The explicit any[] suppresses type checking and breaks the file's convention.

Suggested change
(call: any[]) => call[0]?.type === 'gemini',
const geminiCalls = mockAddItem.mock.calls.filter(
(call) => call[0]?.type === 'gemini',
);

— qwen3.7-max via Qwen Code /review

});

describe('timestamp attachment', () => {
it('attaches a numeric timestamp to gemini items via commitItem', async () => {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] The test name says "via commitItem" but the timestamp is actually set by setPendingHistoryItem at useGeminiStream.ts:1133 (which creates the pending item with timestamp: Date.now()). By the time commitItem receives the item, !item.timestamp is already false, so the guard's value-assignment branch is never exercised.

The branch where commitItem itself assigns Date.now() — when a gemini item arrives without a pre-existing timestamp — is only reachable via the split path at useGeminiStream.ts:1163 (buffer exceeding STREAM_PENDING_ITEM_MAX_CHARS). No test triggers this path.

Consider adding a test that directly invokes commitItem with a gemini item lacking a timestamp, or triggers the split path, to validate the guard's assignment branch.

— qwen3.7-max via Qwen Code /review

@wenshao

wenshao commented Jun 25, 2026

Copy link
Copy Markdown
Collaborator

✅ Local real-build verification (tmux) — PR #5850

Maintainer verification before merge. Built the real CLI from this PR's head and from main, recorded a real session, and A/B-compared --resume with output.showTimestamps enabled in an actual TUI. The fix reproduces — resumed historical assistant turns now render [HH:MM:SS] (using the original record timestamp), which main omits.

Setup: PR head b18d5d34 vs main 24edd459 (merge-base 37d59e8b), each own worktree + self-contained npm ci, npm run dev. Isolated QWEN_HOME with output.showTimestamps: true; model calls hit a local fake OpenAI server. To make the assertion exact, the recorded assistant record's timestamp was edited to a fixed 2020-06-15T20:05:09Z (machine TZ = UTC+8 → expected display [04:05:09]) — an old, fixed value so a correct render proves the original record timestamp is used, not "now". tmux 170×46, macOS, node v22.


1. Real TUI A/B — --resume of a historical assistant turn

Identical input (same output.showTimestamps: true, same edited assistant record …T20:05:09Z); only the binary differs.

BEFORE — main: the resumed historical assistant turn renders with no timestamp:

> Say hello briefly
✦ Step 1: the quick brown fox jumps over the lazy dog …

([HH:MM:SS] count on the resumed history: 0)

AFTER — this PR: the same resumed historical turn renders the timestamp ✅

> Say hello briefly
[04:05:09]
✦ Step 1: the quick brown fox jumps over the lazy dog …

[04:05:09] is exactly the local (UTC+8) conversion of the record's stored 2020-06-15T20:05:09Z — confirming the resumed item carries the original conversation-record timestamp (not the resume/current time), the headline fix.

2. New-turn timestamps still work (both binaries)

With showTimestamps on, a freshly streamed turn shows [HH:MM:SS] on both main ([03:14:10]) and PR ([03:04:07]) — the pre-existing #5001 behavior is intact; this PR only adds the resumed/historical case (the previously-missing half) so new and historical turns are now consistent.

3. Two-digit format

The render uses toLocaleTimeString('en-US', { hour12:false, hour:'2-digit', minute:'2-digit', second:'2-digit' }). In the capture, 04:05:09 shows the single-digit hour/min/sec values zero-padded. (The cross-ICU/runtime guarantee is the point of the explicit options; that is covered by the unit suite below rather than reproducible on a single platform.)

4. Unit tests — 20 relevant pass

packages/cli, --no-file-parallelism:

  • resumeHistoryUtils.test.ts18 (incl. the resumed-gemini-item timestamp behavior)
  • useGeminiStream.test.tsx -t timestamp2"attaches a numeric timestamp to gemini items via commitItem" and "does not attach timestamp to non-gemini items"

5. Static checks (PR worktree) — tsc --noEmit (cli) exit 0, eslint exit 0, prettier --check clean.

Notes / honesty

  • The per-project session store is keyed by cwd, so dropping one file into the other binary's project dir wasn't discovered on --resume. I instead recorded one session per binary and applied the identical edited assistant timestamp to each — so the A/B input that matters (the assistant record + showTimestamps) is identical; only the binary differs.
  • Out of scope (matches the PR): subagent rendering path, non-interactive output, Windows/Linux.

Verdict

Reproduces and behaves as described. Resumed historical assistant turns now show [HH:MM:SS] from the original record timestamp (main omits them), new-turn timestamps are unaffected, the format requests explicit two-digit fields, and tests / typecheck / lint / prettier are green. Safe to merge from this verification's standpoint.

🇨🇳 中文版(完整对应)

✅ 本地真实构建验证(tmux)— PR #5850

维护者合并前验证。分别从本 PR head 和 main 构建真实 CLI,录制一次真实会话,在真实 TUI 中开启 output.showTimestamps 后对 --resume 做 A/B 对比。修复复现——恢复的历史助手 turn 现在会渲染 [HH:MM:SS](用原始记录时间戳),而 main 不渲染。

环境: PR head b18d5d34 vs main 24edd459(merge-base 37d59e8b),各自独立 worktree + 独立 npm ci,npm run dev。隔离 QWEN_HOME + output.showTimestamps: true;模型调用走本地 fake OpenAI 服务。为让断言精确,把录制的助手记录时间戳改成固定的 2020-06-15T20:05:09Z(本机时区 UTC+8 → 预期显示 [04:05:09])——一个固定的旧值,这样正确渲染就能证明用的是原始记录时间戳而非"当前时间"。tmux 170×46,macOS,node v22。

1. 真实 TUI A/B — --resume 历史助手 turn

输入完全相同(同样 output.showTimestamps: true、同样编辑后的助手记录 …T20:05:09Z),只有二进制不同。

BEFORE — main: 恢复的历史助手 turn 没有时间戳:

> Say hello briefly
✦ Step 1: the quick brown fox jumps over the lazy dog …

(恢复历史上的 [HH:MM:SS] 计数:0)

AFTER — 本 PR: 同一个恢复的历史 turn 渲染出时间戳 ✅

> Say hello briefly
[04:05:09]
✦ Step 1: the quick brown fox jumps over the lazy dog …

[04:05:09] 正是记录里 2020-06-15T20:05:09Z 的本地(UTC+8)换算——证明恢复的 item 携带的是原始会话记录时间戳(而非 resume/当前时间),正是这个 PR 的核心修复。

2. 新 turn 时间戳仍然正常(两个二进制)

开启 showTimestamps 后,新流式 turn 在 main([03:14:10])和 PR([03:04:07])上都显示 [HH:MM:SS]——#5001 既有行为完好;本 PR 只补上恢复/历史这一半(此前缺失的),让新 turn 与历史 turn 一致。

3. 两位数格式

渲染用 toLocaleTimeString('en-US', { hour12:false, hour:'2-digit', minute:'2-digit', second:'2-digit' })。截取里 04:05:09 的单位数小时/分/秒都做了零填充。(跨 ICU/运行时的保证正是显式选项的意义所在,由下面的单测覆盖,而非单平台可复现。)

4. 单元测试 — 20 个相关用例通过

packages/cli,--no-file-parallelism:

  • resumeHistoryUtils.test.ts18(含恢复 gemini item 时间戳行为)
  • useGeminiStream.test.tsx -t timestamp2 —— "attaches a numeric timestamp to gemini items via commitItem""does not attach timestamp to non-gemini items"

5. 静态检查(PR worktree)—— tsc --noEmit(cli)exit 0eslint exit 0prettier --check clean

说明 / 诚实交代

  • 按项目存储的会话以 cwd 为键,所以把一个文件丢进另一个二进制的项目目录,--resume 时不会被发现。我改为每个二进制各录一次会话,并对各自施加完全相同的编辑后助手时间戳——所以真正起作用的 A/B 输入(助手记录 + showTimestamps)是一致的,只有二进制不同。
  • 范围外(与 PR 一致):子代理渲染路径、非交互输出、Windows/Linux。

结论

完整复现、行为符合描述。 恢复的历史助手 turn 现在用原始记录时间戳显示 [HH:MM:SS](main 不显示),新 turn 时间戳不受影响,格式显式请求两位数字段,测试 / typecheck / lint / prettier 全绿。就本次验证而言,可以安全合并。

🤖 Verified locally with real binaries in tmux. Method: isolated worktrees + self-contained npm ci + npm run dev + a recorded session with the assistant record timestamp pinned to a fixed value + --resume A/B (PR vs main) + unit suites + tsc/eslint/prettier.

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. The remaining points look like non-blocking nits: mostly test naming/coverage precision and a small type annotation cleanup. Production behavior and scope look good to me.

@yiliang114
yiliang114 added this pull request to the merge queue Jun 26, 2026
Merged via the queue into QwenLM:main with commit 4b83f8f Jun 26, 2026
105 checks 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.

Follow up: tighten response timestamp consistency and tests

5 participants