import type { VoiceTool } from './_types' import { tabletGet, tabletJson } from './_http' const getTodayEvents: VoiceTool = { schema: { type: 'function', function: { name: 'get_today_events', description: 'События из календаря (Даниил + Света). Вернёт id события, title, start, end, ' + 'owner («daniil» или «sveta»). ВАЖНО: для update_event / delete_event сначала ' + 'вызывай этот tool чтобы получить event_id.', parameters: { type: 'object', properties: { range: { type: 'string', enum: ['today', 'week', 'month'], description: 'today (по умолчанию), week (7 дней) или month (текущий месяц)', }, }, }, }, }, async execute(args) { const range = (args?.range as string) || 'today' return tabletGet('/api/voice/tools/events', { range }) }, } const createEvent: VoiceTool = { schema: { type: 'function', function: { name: 'create_event', description: 'Создать событие в Google Calendar. ВАЖНО: параметр owner обязателен. ' + 'Если пользователь не сказал чей это календарь — СПРОСИ у него ' + '(«в твой календарь или в Светин?») и только потом вызывай tool. Не угадывай.', parameters: { type: 'object', properties: { title: { type: 'string', description: 'Название события' }, date: { type: 'string', description: 'Дата в формате YYYY-MM-DD' }, start_time: { type: 'string', description: 'Время начала в формате HH:MM (24-часовой). Обязательно если all_day=false.', }, end_time: { type: 'string', description: 'Время окончания в формате HH:MM. По умолчанию start_time + 1 час.', }, all_day: { type: 'boolean', description: 'Событие на весь день без времени. По умолчанию false.', }, owner: { type: 'string', enum: ['daniil', 'sveta'], description: 'Чей это календарь — Даниила или Светы', }, }, required: ['title', 'date', 'owner'], }, }, }, async execute(args) { const title = String(args?.title || '').trim() const date = String(args?.date || '').trim() if (!title || !date) return { error: 'title and date required' } const payload: Record = { title, date, owner: args?.owner || 'daniil', all_day: !!args?.all_day, } if (!payload.all_day) { payload.start_time = args?.start_time || '' if (args?.end_time !== undefined) payload.end_time = args.end_time } return tabletJson('POST', '/api/voice/tools/events', payload) }, } const updateEvent: VoiceTool = { schema: { type: 'function', function: { name: 'update_event', description: 'Изменить существующее событие. Сначала обязательно вызови get_today_events ' + 'чтобы получить event_id и owner нужного события. Передавай только те поля ' + 'которые меняешь.', parameters: { type: 'object', properties: { event_id: { type: 'string' }, owner: { type: 'string', enum: ['daniil', 'sveta'], description: 'Чей календарь (из get_today_events)', }, title: { type: 'string' }, date: { type: 'string', description: 'YYYY-MM-DD' }, start_time: { type: 'string', description: 'HH:MM' }, end_time: { type: 'string', description: 'HH:MM' }, all_day: { type: 'boolean' }, }, required: ['event_id', 'owner'], }, }, }, async execute(args) { const event_id = String(args?.event_id || '').trim() const owner = String(args?.owner || '').trim() if (!event_id || !owner) return { error: 'event_id and owner required' } const payload: Record = { event_id, owner } for (const k of ['title', 'date', 'start_time', 'end_time', 'all_day']) { if (args?.[k] !== undefined) payload[k] = args[k] } return tabletJson('PUT', '/api/voice/tools/events', payload) }, } const deleteEvent: VoiceTool = { schema: { type: 'function', function: { name: 'delete_event', description: 'Удалить событие из календаря. Сначала вызови get_today_events чтобы найти ' + 'event_id и определить owner. Подтверди удаление с пользователем если событие ' + 'важное (встреча, врач, работа).', parameters: { type: 'object', properties: { event_id: { type: 'string' }, owner: { type: 'string', enum: ['daniil', 'sveta'] }, }, required: ['event_id', 'owner'], }, }, }, async execute(args) { const event_id = String(args?.event_id || '').trim() const owner = String(args?.owner || 'daniil').trim() if (!event_id) return { error: 'event_id required' } return tabletJson('DELETE', '/api/voice/tools/events', undefined, { event_id, owner }) }, } export const tools: VoiceTool[] = [getTodayEvents, createEvent, updateEvent, deleteEvent]