src / toolsProvider.ts
import { tool, ToolsProviderController } from "@lmstudio/sdk";
import { z } from "zod";
import { addReminder, getAllReminders, deleteReminder, deleteAllReminders, updateReminder } from "./database.js";
import { parseDateTime } from "./datetimeHelper.js";
export async function toolsProvider(ctl: ToolsProviderController) {
// Add reminder
const addTool = tool({
name: "reminder_add",
description: "Log an event reminder. Eg: 'tomorrow 10am dentist', '19/04/2026 0800 meeting'",
parameters: {
dateTime: z.string(),
message: z.string()
},
implementation: async ({ dateTime, message }) => {
const now = new Date();
const parsed = parseDateTime(dateTime, now);
if (!parsed.isValid) return { success: false, message: `Invalid: ${dateTime}` };
const id = await addReminder(parsed.dateTime, message, 0);
return { success: true, id, datetime: parsed.dateTime, message };
}
});
// List all
const listTool = tool({
name: "reminder_list",
description: "Show all logged reminders",
parameters: {},
implementation: async () => {
const r = await getAllReminders();
if (!r.length) return { reminders: [], message: "No reminders logged" };
return {
reminders: r.map(x => ({ id: x.id, datetime: x.datetime, message: x.message })),
count: r.length,
message: `${r.length} reminder(s) logged`
};
}
});
// Delete by ID
const deleteTool = tool({
name: "reminder_delete",
description: "Delete reminder by ID",
parameters: { id: z.number() },
implementation: async ({ id }) => {
const ok = await deleteReminder(id);
return ok ? { success: true, message: `Deleted ${id}` } : { success: false, message: `Not found ${id}` };
}
});
// Delete all
const deleteAllTool = tool({
name: "reminder_delete_all",
description: "Delete all reminders",
parameters: {},
implementation: async () => ({ success: true, message: `Deleted ${await deleteAllReminders()}` })
});
// Get current time
const timeTool = tool({
name: "reminder_datetime",
description: "Get current time",
parameters: {},
implementation: async () => {
const now = new Date();
return {
local: `${now.getFullYear()}-${String(now.getMonth()+1).padStart(2,'0')}-${String(now.getDate()).padStart(2,'0')} ${String(now.getHours()).padStart(2,'0')}:${String(now.getMinutes()).padStart(2,'0')}`,
formatted: `${String(now.getDate()).padStart(2,'0')}/${String(now.getMonth()+1).padStart(2,'0')}/${now.getFullYear()} ${String(now.getHours()).padStart(2,'0')}:${String(now.getMinutes()).padStart(2,'0')}`
};
}
});
// Update reminder
const updateTool = tool({
name: "reminder_update",
description: "Update reminder datetime or message by ID",
parameters: {
id: z.number(),
dateTime: z.string().optional(),
message: z.string().optional()
},
implementation: async ({ id, dateTime, message }) => {
let parsedDt: string | undefined;
if (dateTime) {
parsedDt = parseDateTime(dateTime, new Date());
if (!parsedDt.isValid) return { success: false, message: `Invalid datetime: ${dateTime}` };
parsedDt = parsedDt.dateTime;
}
const ok = await updateReminder(id, parsedDt, message);
return ok ? { success: true, message: `Updated ${id}` } : { success: false, message: `Not found ${id}` };
}
});
return [addTool, listTool, deleteTool, deleteAllTool, timeTool, updateTool];
}