merlyn/server/utils/agents/aibitat/plugins/google-calendar/events/gcal-set-my-status.js
Timothy Carambat 1cea4df8e6
Google calendar skill (#5442)
* Google Calendar Agent

* forgot files

* Translations (#5443)
2026-04-14 16:39:36 -07:00

126 lines
4.3 KiB
JavaScript

const googleCalendarLib = require("../lib.js");
module.exports.GCalSetMyStatus = {
name: "gcal-set-my-status",
plugin: function () {
return {
name: "gcal-set-my-status",
setup(aibitat) {
aibitat.function({
super: aibitat,
name: this.name,
description:
"Set your RSVP status for a calendar event. " +
"Use this to accept, decline, or tentatively accept meeting invitations.",
examples: [
{
prompt: "Accept the meeting invitation for event abc123",
call: JSON.stringify({ eventId: "abc123", status: "YES" }),
},
{
prompt: "Decline event xyz789",
call: JSON.stringify({ eventId: "xyz789", status: "NO" }),
},
{
prompt: "Mark myself as maybe for event def456",
call: JSON.stringify({ eventId: "def456", status: "MAYBE" }),
},
],
parameters: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
eventId: {
type: "string",
description: "The ID of the event to RSVP to.",
},
status: {
type: "string",
enum: ["YES", "NO", "MAYBE", "INVITED"],
description:
"Your RSVP status: YES (accept), NO (decline), MAYBE (tentative), or INVITED (reset to invited).",
},
calendarId: {
type: "string",
description:
"Optional calendar ID. If omitted, uses the primary calendar.",
},
},
required: ["eventId", "status"],
additionalProperties: false,
},
handler: async function ({ eventId, status, calendarId }) {
try {
this.super.handlerProps.log(`Using the gcal-set-my-status tool.`);
const statusActions = {
YES: "accept",
NO: "decline",
MAYBE: "tentatively accept",
INVITED: "reset to invited",
};
if (this.super.requestToolApproval) {
const approval = await this.super.requestToolApproval({
skillName: this.name,
payload: {
eventId,
status,
},
description: `Set RSVP status to ${status} (${statusActions[status] || status}) for event ${eventId}`,
});
if (!approval.approved) {
this.super.introspect(
`${this.caller}: User rejected the ${this.name} request.`
);
return approval.message;
}
}
this.super.introspect(
`${this.caller}: Setting RSVP status to ${status} for event ${eventId}...`
);
const result = await googleCalendarLib.setMyStatus(
eventId,
status,
calendarId
);
if (!result.success) {
this.super.introspect(
`${this.caller}: Failed to set status - ${result.error}`
);
return `Error setting RSVP status: ${result.error}`;
}
this.super.introspect(
`${this.caller}: RSVP status set to ${result.data.newStatus}`
);
const statusMessages = {
YES: "accepted",
NO: "declined",
MAYBE: "marked as tentative",
INVITED: "reset to invited",
};
return (
`RSVP status updated!\n\n` +
`Event ID: ${result.data.eventId}\n` +
`Status: ${result.data.newStatus} (${statusMessages[result.data.newStatus] || result.data.newStatus})`
);
} catch (e) {
this.super.handlerProps.log(
`gcal-set-my-status error: ${e.message}`
);
this.super.introspect(`Error: ${e.message}`);
return `Error setting RSVP status: ${e.message}`;
}
},
});
},
};
},
};