claude-code-best/src/utils/taskStateMessage.ts
IronRookieCoder 5ee2d6dcc3 fix: 修复任务列表数字ID乱序和内存轮询导致滚动跳动
两个修复:

1. 任务列表数字ID乱序(#32):新增 compareTaskIds 比较函数,纯数字ID按
   数值大小排序(1, 2, 3, 10 而非 1, 10, 2, 3),非纯数字回退到
   localeCompare 自然排序。listTasks 和 taskStateMessage 两处排序入口
   均已修复。

2. 终端 RSS 内存轮询引发滚动跳动(#31):useRssDisplay hook 新增 isLoading
   参数,仅在加载中启用定时轮询,闲时仅渲染一次内存占用值,避免 Ink 重渲染
   干扰用户滚动查看结果。

附:TaskCreateTool.isConcurrencySafe 改为 false,防止并发任务创建的文件
IO 竞态。

Co-Authored-By: CoStrict-DeepSeek-V4-Pro <deepseek-ai@claude-code-best.win>
2026-05-13 16:44:13 +08:00

75 lines
1.6 KiB
TypeScript

import { randomUUID } from 'crypto'
import type { SDKMessage } from 'src/entrypoints/agentSdkTypes.js'
import type { Task } from './tasks.js'
import { compareTaskIds } from './tasks.js'
export type TaskStateItem = Pick<
Task,
| 'id'
| 'subject'
| 'description'
| 'activeForm'
| 'status'
| 'owner'
| 'blocks'
| 'blockedBy'
>
export type TaskStateMessage = SDKMessage & {
type: 'task_state'
uuid: string
task_list_id: string
tasks: TaskStateItem[]
}
export type TaskStateSnapshot = Pick<TaskStateMessage, 'task_list_id' | 'tasks'>
function toTaskStateItem(task: Task): TaskStateItem {
return {
id: task.id,
subject: task.subject,
description: task.description,
activeForm: task.activeForm,
status: task.status,
owner: task.owner,
blocks: [...task.blocks],
blockedBy: [...task.blockedBy],
}
}
function compareTaskStateItems(a: TaskStateItem, b: TaskStateItem): number {
return compareTaskIds(a.id, b.id)
}
export function buildTaskStateSnapshot(
taskListId: string,
tasks: Task[],
): TaskStateSnapshot {
return {
task_list_id: taskListId,
tasks: tasks
.filter(task => !task.metadata?._internal)
.map(toTaskStateItem)
.sort(compareTaskStateItems),
}
}
export function getTaskStateSnapshotKey(
taskListId: string,
tasks: Task[],
): string {
return JSON.stringify(buildTaskStateSnapshot(taskListId, tasks))
}
export function buildTaskStateMessage(
taskListId: string,
tasks: Task[],
): TaskStateMessage {
const snapshot = buildTaskStateSnapshot(taskListId, tasks)
return {
type: 'task_state',
uuid: randomUUID(),
...snapshot,
}
}