claude-code-best/packages/builtin-tools/src/tools/ScheduleCronTool/UI.tsx
2026-05-01 21:39:30 +08:00

67 lines
2.0 KiB
TypeScript

import React from 'react';
import { MessageResponse } from 'src/components/MessageResponse.js';
import { Text } from '@anthropic/ink';
import { truncate } from 'src/utils/format.js';
import type { CreateOutput } from './CronCreateTool.js';
import type { DeleteOutput } from './CronDeleteTool.js';
import type { ListOutput } from './CronListTool.js';
// --- CronCreate -------------------------------------------------------------
export function renderCreateToolUseMessage(input: Partial<{ cron: string; prompt: string }>): React.ReactNode {
return `${input.cron ?? ''}${input.prompt ? `: ${truncate(input.prompt, 60, true)}` : ''}`;
}
export function renderCreateResultMessage(output: CreateOutput): React.ReactNode {
return (
<MessageResponse>
<Text>
Scheduled <Text bold>{output.id}</Text> <Text dimColor>({output.humanSchedule})</Text>
</Text>
</MessageResponse>
);
}
// --- CronDelete -------------------------------------------------------------
export function renderDeleteToolUseMessage(input: Partial<{ id: string }>): React.ReactNode {
return input.id ?? '';
}
export function renderDeleteResultMessage(output: DeleteOutput): React.ReactNode {
return (
<MessageResponse>
<Text>
Cancelled <Text bold>{output.id}</Text>
</Text>
</MessageResponse>
);
}
// --- CronList ---------------------------------------------------------------
export function renderListToolUseMessage(): React.ReactNode {
return '';
}
export function renderListResultMessage(output: ListOutput): React.ReactNode {
if (output.jobs.length === 0) {
return (
<MessageResponse>
<Text dimColor>No scheduled jobs</Text>
</MessageResponse>
);
}
return (
<MessageResponse>
{output.jobs.map(j => (
<Text key={j.id}>
<Text bold>{j.id}</Text> <Text dimColor>{j.humanSchedule}</Text>
</Text>
))}
</MessageResponse>
);
}
// --- Shared -----------------------------------------------------------------