Files
claude-code/src/utils/taskStateMessage.ts
2026-04-17 16:21:27 +08:00

77 lines
1.6 KiB
TypeScript

import { randomUUID } from 'crypto'
import type { SDKMessage } from 'src/entrypoints/agentSdkTypes.js'
import type { Task } 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 a.id.localeCompare(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,
}
}