mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 12:55:51 +00:00
77 lines
1.6 KiB
TypeScript
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,
|
|
}
|
|
}
|