Files
smart-home-tablet/lib/tools/calendar.ts
Cosmo 7b5f76576f
All checks were successful
Deploy / deploy (push) Successful in 1m25s
refactor: tool plugin registry - each tool in separate file
2026-04-30 20:58:11 +00:00

157 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<string, any> = {
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<string, any> = { 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]