75 lines
2.9 KiB
TypeScript
75 lines
2.9 KiB
TypeScript
import { z } from 'zod';
|
|
import type { ToolDef } from '../tool-registry.js';
|
|
|
|
export const shiftTools: ToolDef[] = [
|
|
{
|
|
name: 'shifts_list',
|
|
description:
|
|
'List volunteer shifts. Returns upcoming and past shifts with signup counts, ' +
|
|
'cut assignments, and capacity info. Use to check volunteer scheduling.',
|
|
inputSchema: {
|
|
page: z.coerce.number().int().positive().default(1).describe('Page number'),
|
|
limit: z.coerce.number().int().positive().max(100).default(20).describe('Items per page'),
|
|
upcoming: z.coerce.boolean().optional().describe('Filter to upcoming shifts only'),
|
|
},
|
|
method: 'GET',
|
|
path: '/api/map/shifts',
|
|
tier: 1,
|
|
},
|
|
{
|
|
name: 'shifts_get',
|
|
description: 'Get full details of a single shift by ID, including signups.',
|
|
inputSchema: {
|
|
id: z.string().describe('Shift ID'),
|
|
},
|
|
method: 'GET',
|
|
path: '/api/map/shifts/:id',
|
|
tier: 1,
|
|
},
|
|
{
|
|
name: 'shifts_create',
|
|
description:
|
|
'Create a new volunteer shift. Specify date/time, location description, ' +
|
|
'and optionally assign to a cut (map polygon) for canvassing.',
|
|
inputSchema: {
|
|
title: z.string().min(1).max(200).describe('Shift title'),
|
|
description: z.string().max(2000).optional().describe('Shift description'),
|
|
startTime: z.string().describe('Start time (ISO 8601 datetime)'),
|
|
endTime: z.string().describe('End time (ISO 8601 datetime)'),
|
|
location: z.string().max(500).optional().describe('Meeting location description'),
|
|
maxVolunteers: z.number().int().positive().optional().describe('Maximum volunteer capacity'),
|
|
cutId: z.number().int().positive().optional().describe('Assign to a map cut for canvassing'),
|
|
},
|
|
method: 'POST',
|
|
path: '/api/map/shifts',
|
|
tier: 1,
|
|
},
|
|
{
|
|
name: 'shifts_update',
|
|
description: 'Update an existing shift. Only provided fields are changed.',
|
|
inputSchema: {
|
|
id: z.string().describe('Shift ID'),
|
|
title: z.string().min(1).max(200).optional().describe('Shift title'),
|
|
description: z.string().max(2000).optional().describe('Shift description'),
|
|
startTime: z.string().optional().describe('Start time (ISO 8601)'),
|
|
endTime: z.string().optional().describe('End time (ISO 8601)'),
|
|
location: z.string().max(500).optional().describe('Meeting location'),
|
|
maxVolunteers: z.number().int().positive().optional().describe('Max volunteer capacity'),
|
|
cutId: z.number().int().positive().nullable().optional().describe('Assigned map cut'),
|
|
},
|
|
method: 'PUT',
|
|
path: '/api/map/shifts/:id',
|
|
tier: 1,
|
|
},
|
|
{
|
|
name: 'canvass_dashboard',
|
|
description:
|
|
'Get canvassing dashboard stats: total sessions, visits recorded, ' +
|
|
'outcome breakdowns (home, not-home, refused, etc.), volunteer activity.',
|
|
inputSchema: {},
|
|
method: 'GET',
|
|
path: '/api/map/canvass/admin/dashboard',
|
|
tier: 1,
|
|
},
|
|
];
|