fix opencode todowrite footer state (#1046)

This commit is contained in:
Caprika 2026-05-09 15:08:19 +08:00 committed by GitHub
parent 6f74ac304d
commit b020f1e39a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 41 additions and 1 deletions

View file

@ -35,7 +35,7 @@ export function latestTodosFromEvents(events: AgentEvent[] | undefined): TodoIte
if (!events) return [];
for (let i = events.length - 1; i >= 0; i -= 1) {
const event = events[i];
if (event?.kind !== 'tool_use' || event.name !== 'TodoWrite') continue;
if (event?.kind !== 'tool_use' || !isTodoWriteToolName(event.name)) continue;
return parseTodoWriteInput(event.input);
}
return [];
@ -44,3 +44,7 @@ export function latestTodosFromEvents(events: AgentEvent[] | undefined): TodoIte
export function unfinishedTodosFromEvents(events: AgentEvent[] | undefined): TodoItem[] {
return latestTodosFromEvents(events).filter((todo) => todo.status !== 'completed');
}
function isTodoWriteToolName(name: string): boolean {
return name === 'TodoWrite' || name === 'todowrite';
}

View file

@ -53,6 +53,42 @@ describe('todo event helpers', () => {
]);
});
it('recognizes lowercase OpenCode todowrite events', () => {
const events: AgentEvent[] = [
{
kind: 'tool_use',
id: 'todo-1',
name: 'todowrite',
input: {
todos: [
{ content: 'Self-check template', status: 'completed' },
{ content: 'Emit single artifact', status: 'pending' },
],
},
},
];
expect(unfinishedTodosFromEvents(events)).toEqual([
{ content: 'Emit single artifact', status: 'pending', activeForm: undefined },
]);
});
it('uses lowercase todowrite as the latest todo truth over older TodoWrite events', () => {
const events: AgentEvent[] = [
{ kind: 'tool_use', id: 'todo-1', name: 'TodoWrite', input: firstTodoInput },
{
kind: 'tool_use',
id: 'todo-2',
name: 'todowrite',
input: { todos: [{ content: 'Emit single artifact', status: 'pending' }] },
},
];
expect(latestTodosFromEvents(events)).toEqual([
{ content: 'Emit single artifact', status: 'pending', activeForm: undefined },
]);
});
it('treats an empty latest TodoWrite event as authoritative', () => {
const events: AgentEvent[] = [
{ kind: 'tool_use', id: 'todo-1', name: 'TodoWrite', input: firstTodoInput },