merlyn/server/utils/agents/aibitat/plugins/gmail/search/gmail-get-inbox.js
Timothy Carambat cec67d77f2
GMail Agent Skill (#5400)
* wip

* remove label tech

* ask to read attachments

* update skills

* Skill ready and tested

* report dynamic citations and generic get mailbox util

* norm translations

* translations

* remove dead code, remove connector in multiUser

* simple refactor - dont ask for drafts

* refactor filesize helper

* norm translations, remove read_messages skill
2026-04-10 14:14:12 -07:00

105 lines
3.6 KiB
JavaScript

const gmailLib = require("../lib.js");
module.exports.GmailGetInbox = {
name: "gmail-get-inbox",
plugin: function () {
return {
name: "gmail-get-inbox",
setup(aibitat) {
aibitat.function({
super: aibitat,
name: this.name,
description:
"Get the inbox emails from Gmail. Returns the inbox emails with the details of the email. " +
"Supports optional query and limit parameters to filter the emails.",
examples: [
{
prompt: "What's in my inbox?",
call: JSON.stringify({
query: "",
limit: 10,
}),
},
{
prompt: "Check my inbox for any emails from John Doe",
call: JSON.stringify({
query: "from:john.doe@example.com",
limit: 10,
}),
},
{
prompt: "Get my 5 most recent unread emails",
call: JSON.stringify({
query: "is:unread newer_than:1d",
limit: 5,
}),
},
],
parameters: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
query: {
type: "string",
description:
"Optional Gmail search query. Use Gmail query syntax like 'is:inbox', 'is:unread', 'from:email', 'subject:keyword', etc.",
},
limit: {
type: "number",
description:
"Optional maximum number of results to return (1-50). Defaults to 10.",
default: 10,
},
},
required: [],
additionalProperties: false,
},
handler: async function ({ query = "", limit = 10 }) {
try {
this.super.handlerProps.log(`Using the gmail-get-inbox tool.`);
this.super.introspect(
`${this.caller}: Searching Gmail with query "${query}"`
);
let searchQuery = `is:inbox`;
if (query) searchQuery += ` ${query}`;
const result = await gmailLib.search(searchQuery, limit);
if (!result.success) {
this.super.introspect(
`${this.caller}: Gmail get inbox failed - ${result.error}`
);
return `Error getting inbox from Gmail: ${result.error}`;
}
const { threads, resultCount } = result.data;
this.super.introspect(
`${this.caller}: Found ${resultCount} emails in inbox`
);
if (resultCount === 0) {
return `No emails found in inbox.`;
}
const summary = threads
.map(
(t, i) =>
`${i + 1}. [${t.isUnread ? "UNREAD" : "READ"}] "${t.subject}" (ID: ${t.id}, ${t.messageCount} messages, Last: ${new Date(t.lastMessageDate).toLocaleString()})`
)
.join("\n");
return `Found ${resultCount} email threads:\n\n${summary}\n\nUse the thread ID with gmail-read-thread to read the full conversation.`;
} catch (e) {
this.super.handlerProps.log(
`gmail-get-inbox error: ${e.message}`
);
this.super.introspect(`Error: ${e.message}`);
return `Error getting inbox from Gmail: ${e.message}`;
}
},
});
},
};
},
};