refactor: tool plugin registry - each tool in separate file
All checks were successful
Deploy / deploy (push) Successful in 1m25s
All checks were successful
Deploy / deploy (push) Successful in 1m25s
This commit is contained in:
156
lib/tools/calendar.ts
Normal file
156
lib/tools/calendar.ts
Normal file
@@ -0,0 +1,156 @@
|
||||
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]
|
||||
Reference in New Issue
Block a user