两个修复: 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>
75 lines
1.6 KiB
TypeScript
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,
|
|
}
|
|
}
|