feat: split OpenAPI schema into Mail + Social for ChatGPT

- Hermes Mail: 9 ops (Obsidian + Email)
- Hermes Social: 25 ops (LinkedIn, TikTok, Instagram, FB, Twitter, Telegram, WhatsApp, Discord)
- Full schema still available at /openapi.json
This commit is contained in:
Garfield
2026-05-11 22:23:37 -04:00
parent ecdf332b78
commit c6b0697e8c
6 changed files with 359 additions and 4 deletions

View File

@@ -720,6 +720,80 @@ export function getOpenApiSpec(serverUrl: string) {
};
}
const MAIL_PATHS = new Set([
'/api/obsidian/search',
'/api/obsidian/note',
'/api/obsidian/note/append',
'/api/obsidian/sync',
'/api/email/profile',
'/api/email/search',
'/api/email/read',
'/api/email/send',
]);
const SOCIAL_PATHS = new Set([
'/api/whatsapp/send',
'/api/linkedin/profile',
'/api/linkedin/post',
'/api/linkedin/video',
'/api/telegram/message',
'/api/telegram/updates',
'/api/discord/guilds',
'/api/discord/message',
'/api/discord/messages',
'/api/instagram/profile',
'/api/instagram/media',
'/api/instagram/post',
'/api/instagram/reel',
'/api/facebook/page',
'/api/facebook/posts',
'/api/facebook/post',
'/api/facebook/photo',
'/api/facebook/video',
'/api/twitter/search',
'/api/twitter/user',
'/api/twitter/tweets',
'/api/twitter/video',
'/api/tiktok/profile',
'/api/tiktok/videos',
'/api/tiktok/video',
]);
function filterPaths(fullSpec: Record<string, unknown>, allowed: Set<string>): Record<string, unknown> {
const paths = fullSpec.paths as Record<string, unknown>;
const filtered: Record<string, unknown> = {};
for (const [key, value] of Object.entries(paths)) {
if (allowed.has(key)) filtered[key] = value;
}
return filtered;
}
export function getOpenApiSpecMail(serverUrl: string) {
const full = getOpenApiSpec(serverUrl);
return {
...full,
info: {
...full.info,
title: 'Hermes Mail',
description: 'Email operations across multiple accounts and Obsidian vault access (search, read, append, update notes).',
},
paths: filterPaths(full, MAIL_PATHS),
};
}
export function getOpenApiSpecSocial(serverUrl: string) {
const full = getOpenApiSpec(serverUrl);
return {
...full,
info: {
...full.info,
title: 'Hermes Social',
description: 'Social media publishing and analytics: LinkedIn, TikTok, Instagram, Facebook, Twitter/X, Telegram, WhatsApp, Discord.',
},
paths: filterPaths(full, SOCIAL_PATHS),
};
}
const ACCOUNT_PARAM_SCHEMA = {
account: {
type: 'string',