social-mcp 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +41 -22
  2. package/dist/index.js +67 -25
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/config.d.ts +1 -0
  5. package/dist/lib/config.js +5 -3
  6. package/dist/lib/config.js.map +1 -1
  7. package/dist/lib/errors.d.ts +3 -0
  8. package/dist/lib/errors.js +7 -0
  9. package/dist/lib/errors.js.map +1 -0
  10. package/dist/services/discord-service.d.ts +8 -0
  11. package/dist/services/discord-service.js +25 -5
  12. package/dist/services/discord-service.js.map +1 -1
  13. package/dist/services/facebook-service.d.ts +10 -1
  14. package/dist/services/facebook-service.js +33 -6
  15. package/dist/services/facebook-service.js.map +1 -1
  16. package/dist/services/instagram-service.d.ts +10 -0
  17. package/dist/services/instagram-service.js +33 -7
  18. package/dist/services/instagram-service.js.map +1 -1
  19. package/dist/services/slack-service.d.ts +12 -0
  20. package/dist/services/slack-service.js +39 -3
  21. package/dist/services/slack-service.js.map +1 -1
  22. package/dist/services/telegram-service.d.ts +3 -0
  23. package/dist/services/telegram-service.js +34 -1
  24. package/dist/services/telegram-service.js.map +1 -1
  25. package/dist/services/twitter-service.d.ts +11 -0
  26. package/dist/services/twitter-service.js +50 -7
  27. package/dist/services/twitter-service.js.map +1 -1
  28. package/dist/services/whatsapp-service.d.ts +3 -17
  29. package/dist/services/whatsapp-service.js +25 -20
  30. package/dist/services/whatsapp-service.js.map +1 -1
  31. package/dist/tools/discord-tools/get-messages.d.ts +16 -0
  32. package/dist/tools/discord-tools/get-messages.js +36 -0
  33. package/dist/tools/discord-tools/get-messages.js.map +1 -0
  34. package/dist/tools/discord-tools/send-message.js +7 -18
  35. package/dist/tools/discord-tools/send-message.js.map +1 -1
  36. package/dist/tools/facebook-tools/create-post.js +7 -17
  37. package/dist/tools/facebook-tools/create-post.js.map +1 -1
  38. package/dist/tools/facebook-tools/get-posts.d.ts +16 -0
  39. package/dist/tools/facebook-tools/get-posts.js +36 -0
  40. package/dist/tools/facebook-tools/get-posts.js.map +1 -0
  41. package/dist/tools/instagram-tools/create-post.d.ts +3 -3
  42. package/dist/tools/instagram-tools/create-post.js +9 -18
  43. package/dist/tools/instagram-tools/create-post.js.map +1 -1
  44. package/dist/tools/instagram-tools/get-posts.d.ts +16 -0
  45. package/dist/tools/instagram-tools/get-posts.js +36 -0
  46. package/dist/tools/instagram-tools/get-posts.js.map +1 -0
  47. package/dist/tools/slack-tools/get-messages.d.ts +16 -0
  48. package/dist/tools/slack-tools/get-messages.js +36 -0
  49. package/dist/tools/slack-tools/get-messages.js.map +1 -0
  50. package/dist/tools/slack-tools/list-channels.d.ts +14 -0
  51. package/dist/tools/slack-tools/list-channels.js +35 -0
  52. package/dist/tools/slack-tools/list-channels.js.map +1 -0
  53. package/dist/tools/slack-tools/send-message.js +7 -17
  54. package/dist/tools/slack-tools/send-message.js.map +1 -1
  55. package/dist/tools/telegram-tools/delete-message.d.ts +16 -0
  56. package/dist/tools/telegram-tools/delete-message.js +26 -0
  57. package/dist/tools/telegram-tools/delete-message.js.map +1 -0
  58. package/dist/tools/telegram-tools/edit-message.d.ts +18 -0
  59. package/dist/tools/telegram-tools/edit-message.js +27 -0
  60. package/dist/tools/telegram-tools/edit-message.js.map +1 -0
  61. package/dist/tools/telegram-tools/forward-message.d.ts +2 -4
  62. package/dist/tools/telegram-tools/forward-message.js +9 -24
  63. package/dist/tools/telegram-tools/forward-message.js.map +1 -1
  64. package/dist/tools/telegram-tools/get-channel-info.d.ts +1 -1
  65. package/dist/tools/telegram-tools/get-channel-info.js +8 -22
  66. package/dist/tools/telegram-tools/get-channel-info.js.map +1 -1
  67. package/dist/tools/telegram-tools/get-channel-members.d.ts +1 -1
  68. package/dist/tools/telegram-tools/get-channel-members.js +13 -29
  69. package/dist/tools/telegram-tools/get-channel-members.js.map +1 -1
  70. package/dist/tools/telegram-tools/pin-message.d.ts +1 -1
  71. package/dist/tools/telegram-tools/pin-message.js +8 -22
  72. package/dist/tools/telegram-tools/pin-message.js.map +1 -1
  73. package/dist/tools/telegram-tools/send-message.d.ts +1 -1
  74. package/dist/tools/telegram-tools/send-message.js +8 -20
  75. package/dist/tools/telegram-tools/send-message.js.map +1 -1
  76. package/dist/tools/twitter-tools/delete-tweet.d.ts +14 -0
  77. package/dist/tools/twitter-tools/delete-tweet.js +23 -0
  78. package/dist/tools/twitter-tools/delete-tweet.js.map +1 -0
  79. package/dist/tools/twitter-tools/get-user-info.d.ts +2 -2
  80. package/dist/tools/twitter-tools/get-user-info.js +13 -25
  81. package/dist/tools/twitter-tools/get-user-info.js.map +1 -1
  82. package/dist/tools/twitter-tools/like-tweet.d.ts +14 -0
  83. package/dist/tools/twitter-tools/like-tweet.js +23 -0
  84. package/dist/tools/twitter-tools/like-tweet.js.map +1 -0
  85. package/dist/tools/twitter-tools/reply-tweet.d.ts +16 -0
  86. package/dist/tools/twitter-tools/reply-tweet.js +28 -0
  87. package/dist/tools/twitter-tools/reply-tweet.js.map +1 -0
  88. package/dist/tools/twitter-tools/search-tweets.d.ts +1 -1
  89. package/dist/tools/twitter-tools/search-tweets.js +11 -24
  90. package/dist/tools/twitter-tools/search-tweets.js.map +1 -1
  91. package/dist/tools/twitter-tools/send-tweet.d.ts +1 -1
  92. package/dist/tools/twitter-tools/send-tweet.js +8 -18
  93. package/dist/tools/twitter-tools/send-tweet.js.map +1 -1
  94. package/dist/tools/whatsapp-tools/get-messages.d.ts +0 -13
  95. package/dist/tools/whatsapp-tools/get-messages.js +1 -39
  96. package/dist/tools/whatsapp-tools/get-messages.js.map +1 -1
  97. package/dist/tools/whatsapp-tools/send-message.d.ts +1 -1
  98. package/dist/tools/whatsapp-tools/send-message.js +11 -19
  99. package/dist/tools/whatsapp-tools/send-message.js.map +1 -1
  100. package/package.json +9 -6
  101. package/dist/constants.d.ts +0 -2
  102. package/dist/constants.js +0 -4
  103. package/dist/constants.js.map +0 -1
  104. package/dist/run_tools_discord.d.ts +0 -19
  105. package/dist/run_tools_discord.js +0 -49
  106. package/dist/run_tools_discord.js.map +0 -1
  107. package/dist/run_tools_facebook.d.ts +0 -19
  108. package/dist/run_tools_facebook.js +0 -49
  109. package/dist/run_tools_facebook.js.map +0 -1
  110. package/dist/run_tools_instagram.d.ts +0 -20
  111. package/dist/run_tools_instagram.js +0 -54
  112. package/dist/run_tools_instagram.js.map +0 -1
  113. package/dist/run_tools_slack.d.ts +0 -19
  114. package/dist/run_tools_slack.js +0 -49
  115. package/dist/run_tools_slack.js.map +0 -1
  116. package/dist/run_tools_telegram.d.ts +0 -20
  117. package/dist/run_tools_telegram.js +0 -107
  118. package/dist/run_tools_telegram.js.map +0 -1
  119. package/dist/run_tools_twitter.d.ts +0 -23
  120. package/dist/run_tools_twitter.js +0 -74
  121. package/dist/run_tools_twitter.js.map +0 -1
  122. package/dist/run_tools_whatsapp.d.ts +0 -20
  123. package/dist/run_tools_whatsapp.js +0 -58
  124. package/dist/run_tools_whatsapp.js.map +0 -1
  125. package/dist/types.d.ts +0 -4
  126. package/dist/types.js +0 -4
  127. package/dist/types.js.map +0 -1
package/README.md CHANGED
@@ -6,13 +6,13 @@ An MCP (Model Context Protocol) server that lets AI assistants post and interact
6
6
 
7
7
  | Platform | Tools |
8
8
  |-----------|-------|
9
- | Telegram | Send message, get channel info, forward message, pin message, get channel administrators |
10
- | Twitter/X | Send tweet, get user info, search tweets |
11
- | Discord | Send message |
12
- | WhatsApp | Send message, get messages |
13
- | Facebook | Create post |
14
- | Instagram | Create post |
15
- | Slack | Send message |
9
+ | Telegram | Send message, get channel info, forward message, pin message, get channel administrators, edit message, delete message |
10
+ | Twitter/X | Send tweet, reply to tweet, like tweet, delete tweet, get user info, search tweets |
11
+ | Discord | Send message, get messages |
12
+ | WhatsApp | Send message |
13
+ | Facebook | Create post, get posts |
14
+ | Instagram | Create post, get posts |
15
+ | Slack | Send message, get messages, list channels |
16
16
 
17
17
  ## Quick Start
18
18
 
@@ -75,7 +75,7 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
75
75
  }
76
76
  ```
77
77
 
78
- Only include env vars for the platforms you actually use — unused platforms are simply ignored.
78
+ Only include env vars for the platforms you actually use — unconfigured platforms are reported at startup but do not prevent the server from running.
79
79
 
80
80
  ## Environment Variables
81
81
 
@@ -97,7 +97,7 @@ Copy `example.env` to `.env` and fill in the credentials for the platforms you w
97
97
  ### Discord
98
98
  | Variable | Description |
99
99
  |----------|-------------|
100
- | `DISCORD_BOT_TOKEN` | Bot token from the [Discord Developer Portal](https://discord.com/developers/applications) — bot must have Send Messages permission |
100
+ | `DISCORD_BOT_TOKEN` | Bot token from the [Discord Developer Portal](https://discord.com/developers/applications) — bot must have Send Messages and Read Message History permissions |
101
101
 
102
102
  ### WhatsApp Business
103
103
  | Variable | Description |
@@ -118,46 +118,65 @@ Copy `example.env` to `.env` and fill in the credentials for the platforms you w
118
118
  ### Slack
119
119
  | Variable | Description |
120
120
  |----------|-------------|
121
- | `SLACK_BOT_TOKEN` | Bot token from [api.slack.com](https://api.slack.com/apps) — requires `chat:write` scope |
121
+ | `SLACK_BOT_TOKEN` | Bot token from [api.slack.com](https://api.slack.com/apps) — requires `chat:write`, `channels:history`, `channels:read` scopes |
122
122
 
123
123
  ## Available Tools
124
124
 
125
125
  ### Telegram
126
- - **SEND_MESSAGE** — Send a message to a chat or channel (`chatId`, `text`)
127
- - **GET_CHANNEL_INFO** — Get channel metadata (`channelId`)
128
- - **FORWARD_MESSAGE** — Forward a message between chats (`fromChatId`, `toChatId`, `messageId`)
129
- - **PIN_MESSAGE** — Pin a message in a chat (`chatId`, `messageId`)
130
- - **GET_CHANNEL_MEMBERS** — List channel administrators (`channelId`, `limit`)
126
+ - **TELEGRAM_SEND_MESSAGE** — Send a message to a chat or channel (`chatId`, `text`)
127
+ - **TELEGRAM_GET_CHANNEL_INFO** — Get channel metadata (`channelId`)
128
+ - **TELEGRAM_FORWARD_MESSAGE** — Forward a message between chats (`fromChatId`, `toChatId`, `messageId`)
129
+ - **TELEGRAM_PIN_MESSAGE** — Pin a message in a chat (`chatId`, `messageId`)
130
+ - **TELEGRAM_GET_CHANNEL_MEMBERS** — List channel administrators (`channelId`, `limit`)
131
+ - **TELEGRAM_EDIT_MESSAGE** — Edit the text of a message (`chatId`, `messageId`, `text`)
132
+ - **TELEGRAM_DELETE_MESSAGE** — Delete a message (`chatId`, `messageId`)
131
133
 
132
134
  ### Twitter / X
133
135
  - **SEND_TWEET** — Post a tweet (`text`, max 280 chars)
134
- - **GET_USER_INFO** — Get a user's profile and metrics (`username`)
136
+ - **REPLY_TWEET** — Reply to a tweet (`tweetId`, `text`)
137
+ - **LIKE_TWEET** — Like a tweet (`tweetId`)
138
+ - **DELETE_TWEET** — Delete a tweet (`tweetId`)
139
+ - **GET_TWITTER_USER_INFO** — Get a user's profile and metrics (`username`)
135
140
  - **SEARCH_TWEETS** — Search recent tweets (`query`, `maxResults`)
136
141
 
137
142
  ### Discord
138
143
  - **SEND_DISCORD_MESSAGE** — Send a message to a channel (`channelId`, `content`)
144
+ - **GET_DISCORD_MESSAGES** — Retrieve recent messages from a channel (`channelId`, `limit`)
139
145
 
140
146
  ### WhatsApp
141
147
  - **SEND_WHATSAPP_MESSAGE** — Send a message to a phone number in E.164 format (`to`, `text`)
142
- - **GET_WHATSAPP_MESSAGES** — Retrieve recent messages (`limit`)
148
+
149
+ > **Note:** WhatsApp message retrieval requires webhook setup and cannot be polled via the API.
143
150
 
144
151
  ### Facebook
145
152
  - **CREATE_FACEBOOK_POST** — Create a post on a Facebook page (`pageId`, `message`)
153
+ - **GET_FACEBOOK_POSTS** — Retrieve recent posts from a page (`pageId`, `limit`)
146
154
 
147
155
  ### Instagram
148
- - **CREATE_INSTAGRAM_POST** — Publish an image post (`userId`, `imageUrl`, `message`)
156
+ - **CREATE_INSTAGRAM_POST** — Publish an image post (`userId`, `imageUrl`, `caption`)
157
+ - **GET_INSTAGRAM_POSTS** — Retrieve recent posts from an account (`userId`, `limit`)
149
158
 
150
159
  ### Slack
151
160
  - **SEND_SLACK_MESSAGE** — Send a message to a channel (`channelId`, `text`)
161
+ - **GET_SLACK_MESSAGES** — Retrieve recent messages from a channel (`channelId`, `limit`)
162
+ - **LIST_SLACK_CHANNELS** — List public channels in the workspace (`limit`)
152
163
 
153
164
  ## Development
154
165
 
155
166
  ```bash
156
167
  pnpm install
157
- pnpm run build # compile TypeScript
158
- pnpm run watch # watch mode
159
- pnpm run lint # lint with Biome
160
- pnpm run format # format with Biome
168
+ pnpm run build # compile TypeScript
169
+ pnpm run clean # remove dist/
170
+ pnpm run watch # watch mode
171
+ pnpm run test # run tests
172
+ pnpm run lint # lint with Biome
173
+ pnpm run format # format with Biome
174
+ ```
175
+
176
+ For a clean rebuild:
177
+
178
+ ```bash
179
+ pnpm run clean && pnpm run build
161
180
  ```
162
181
 
163
182
  ## License
package/dist/index.js CHANGED
@@ -1,54 +1,96 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
2
3
  import { FastMCP } from "fastmcp";
4
+ import { CredentialsError } from "./lib/errors.js";
5
+ import { getDiscordService } from "./services/discord-service.js";
6
+ import { getFacebookService } from "./services/facebook-service.js";
7
+ import { getInstagramService } from "./services/instagram-service.js";
8
+ import { getSlackService } from "./services/slack-service.js";
9
+ import { getTelegramService } from "./services/telegram-service.js";
10
+ import { getTwitterService } from "./services/twitter-service.js";
11
+ import { getWhatsappService } from "./services/whatsapp-service.js";
12
+ import { getMessagesTool as discordGetMessagesTool } from "./tools/discord-tools/get-messages.js";
13
+ import { sendMessageTool as discordSendMessageTool } from "./tools/discord-tools/send-message.js";
14
+ import { createPostTool as facebookCreatePostTool } from "./tools/facebook-tools/create-post.js";
15
+ import { getPostsTool as facebookGetPostsTool } from "./tools/facebook-tools/get-posts.js";
16
+ import { createPostTool as instagramCreatePostTool } from "./tools/instagram-tools/create-post.js";
17
+ import { getPostsTool as instagramGetPostsTool } from "./tools/instagram-tools/get-posts.js";
18
+ import { getMessagesTool as slackGetMessagesTool } from "./tools/slack-tools/get-messages.js";
19
+ import { listChannelsTool as slackListChannelsTool } from "./tools/slack-tools/list-channels.js";
20
+ import { sendMessageTool as slackSendMessageTool } from "./tools/slack-tools/send-message.js";
21
+ import { deleteMessageTool } from "./tools/telegram-tools/delete-message.js";
22
+ import { editMessageTool } from "./tools/telegram-tools/edit-message.js";
3
23
  import { forwardMessageTool } from "./tools/telegram-tools/forward-message.js";
4
24
  import { getChannelInfoTool } from "./tools/telegram-tools/get-channel-info.js";
5
25
  import { getChannelMembersTool } from "./tools/telegram-tools/get-channel-members.js";
6
26
  import { pinMessageTool } from "./tools/telegram-tools/pin-message.js";
7
27
  import { sendMessageTool } from "./tools/telegram-tools/send-message.js";
28
+ import { deleteTweetTool } from "./tools/twitter-tools/delete-tweet.js";
8
29
  import { getUserInfoTool } from "./tools/twitter-tools/get-user-info.js";
30
+ import { likeTweetTool } from "./tools/twitter-tools/like-tweet.js";
31
+ import { replyTweetTool } from "./tools/twitter-tools/reply-tweet.js";
9
32
  import { searchTweetsTool } from "./tools/twitter-tools/search-tweets.js";
10
33
  import { sendTweetTool } from "./tools/twitter-tools/send-tweet.js";
11
- // Discord tools
12
- import { sendMessageTool as discordSendMessageTool } from "./tools/discord-tools/send-message.js";
13
- // WhatsApp tools
14
34
  import { sendMessageTool as whatsappSendMessageTool } from "./tools/whatsapp-tools/send-message.js";
15
- import { getMessagesTool as whatsappGetMessagesTool } from "./tools/whatsapp-tools/get-messages.js";
16
- // Facebook tools
17
- import { createPostTool as facebookCreatePostTool } from "./tools/facebook-tools/create-post.js";
18
- // Instagram tools
19
- import { createPostTool as instagramCreatePostTool } from "./tools/instagram-tools/create-post.js";
20
- // Slack tools
21
- import { sendMessageTool as slackSendMessageTool } from "./tools/slack-tools/send-message.js";
35
+ const require = createRequire(import.meta.url);
36
+ const { version } = require("../package.json");
37
+ function checkPlatform(name, init) {
38
+ try {
39
+ init();
40
+ console.error(` [ok] ${name}`);
41
+ }
42
+ catch (err) {
43
+ if (err instanceof CredentialsError) {
44
+ console.error(` [--] ${name}: ${err.message}`);
45
+ }
46
+ else {
47
+ console.error(` [!!] ${name}: ${err instanceof Error ? err.message : String(err)}`);
48
+ }
49
+ }
50
+ }
22
51
  async function main() {
23
- const server = new FastMCP({
24
- name: "Social MCP Server",
25
- version: "1.2.0",
26
- });
27
- // Add Telegram tools
52
+ console.error("Social MCP Server platform availability:");
53
+ checkPlatform("Telegram", getTelegramService);
54
+ checkPlatform("Twitter/X", getTwitterService);
55
+ checkPlatform("Discord", getDiscordService);
56
+ checkPlatform("WhatsApp", getWhatsappService);
57
+ checkPlatform("Facebook", getFacebookService);
58
+ checkPlatform("Instagram", getInstagramService);
59
+ checkPlatform("Slack", getSlackService);
60
+ console.error("");
61
+ const server = new FastMCP({ name: "Social MCP Server", version });
62
+ // Telegram
28
63
  server.addTool(sendMessageTool);
29
64
  server.addTool(getChannelInfoTool);
30
65
  server.addTool(forwardMessageTool);
31
66
  server.addTool(pinMessageTool);
32
67
  server.addTool(getChannelMembersTool);
33
- // Add Twitter tools
68
+ server.addTool(deleteMessageTool);
69
+ server.addTool(editMessageTool);
70
+ // Twitter
34
71
  server.addTool(sendTweetTool);
35
72
  server.addTool(getUserInfoTool);
36
73
  server.addTool(searchTweetsTool);
37
- // Add Discord tools
74
+ server.addTool(replyTweetTool);
75
+ server.addTool(likeTweetTool);
76
+ server.addTool(deleteTweetTool);
77
+ // Discord
38
78
  server.addTool(discordSendMessageTool);
39
- // Add WhatsApp tools
79
+ server.addTool(discordGetMessagesTool);
80
+ // WhatsApp
40
81
  server.addTool(whatsappSendMessageTool);
41
- server.addTool(whatsappGetMessagesTool);
42
- // Add Facebook tools
82
+ // Facebook
43
83
  server.addTool(facebookCreatePostTool);
44
- // Add Instagram tools
84
+ server.addTool(facebookGetPostsTool);
85
+ // Instagram
45
86
  server.addTool(instagramCreatePostTool);
46
- // Add Slack tools
87
+ server.addTool(instagramGetPostsTool);
88
+ // Slack
47
89
  server.addTool(slackSendMessageTool);
90
+ server.addTool(slackGetMessagesTool);
91
+ server.addTool(slackListChannelsTool);
48
92
  try {
49
- await server.start({
50
- transportType: "stdio",
51
- });
93
+ await server.start({ transportType: "stdio" });
52
94
  }
53
95
  catch (error) {
54
96
  console.error("Failed to start Social MCP Server:", error);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEpE,gBAAgB;AAChB,OAAO,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAElG,iBAAiB;AACjB,OAAO,EAAE,eAAe,IAAI,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACpG,OAAO,EAAE,eAAe,IAAI,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEpG,iBAAiB;AACjB,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAEjG,kBAAkB;AAClB,OAAO,EAAE,cAAc,IAAI,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEnG,cAAc;AACd,OAAO,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE9F,KAAK,UAAU,IAAI;IAClB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC;QAC1B,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,OAAO;KAChB,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEtC,oBAAoB;IACpB,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEjC,oBAAoB;IACpB,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEvC,qBAAqB;IACrB,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAExC,qBAAqB;IACrB,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEvC,sBAAsB;IACtB,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAExC,kBAAkB;IAClB,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAErC,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,KAAK,CAAC;YAClB,aAAa,EAAE,OAAO;SACtB,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACtB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,cAAc,IAAI,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACnG,OAAO,EAAE,YAAY,IAAI,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7F,OAAO,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC9F,OAAO,EAAE,gBAAgB,IAAI,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AACjG,OAAO,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,eAAe,IAAI,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEpG,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAE5C,CAAC;AAEF,SAAS,aAAa,CAAC,IAAY,EAAE,IAAmB;IACvD,IAAI,CAAC;QACJ,IAAI,EAAE,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,KAAK,CACZ,UAAU,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC;AAED,KAAK,UAAU,IAAI;IAClB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC5D,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAC9C,aAAa,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC5C,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAChD,aAAa,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACxC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAElB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,CAAC;IAEnE,WAAW;IACX,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACtC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhC,UAAU;IACV,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhC,UAAU;IACV,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEvC,WAAW;IACX,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAExC,WAAW;IACX,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAErC,YAAY;IACZ,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEtC,QAAQ;IACR,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEtC,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACtB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
@@ -1,3 +1,4 @@
1
+ export declare const META_API_VERSION = "v21.0";
1
2
  export declare const config: {
2
3
  discord: {
3
4
  baseUrl: string;
@@ -1,19 +1,21 @@
1
+ export const META_API_VERSION = "v21.0";
2
+ const META_BASE = `https://graph.facebook.com/${META_API_VERSION}`;
1
3
  export const config = {
2
4
  discord: {
3
5
  baseUrl: "https://discord.com/api/v10",
4
6
  botToken: process.env.DISCORD_BOT_TOKEN || "",
5
7
  },
6
8
  whatsapp: {
7
- baseUrl: "https://graph.facebook.com/v21.0",
9
+ baseUrl: META_BASE,
8
10
  accessToken: process.env.WHATSAPP_ACCESS_TOKEN || "",
9
11
  phoneNumberId: process.env.WHATSAPP_PHONE_NUMBER_ID || "",
10
12
  },
11
13
  facebook: {
12
- baseUrl: "https://graph.facebook.com/v21.0",
14
+ baseUrl: META_BASE,
13
15
  accessToken: process.env.FACEBOOK_ACCESS_TOKEN || "",
14
16
  },
15
17
  instagram: {
16
- baseUrl: "https://graph.facebook.com/v21.0",
18
+ baseUrl: META_BASE,
17
19
  accessToken: process.env.INSTAGRAM_ACCESS_TOKEN || "",
18
20
  },
19
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE;QACP,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;KAC9C;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,kCAAkC;QAC3C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;QACpD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE;KAC1D;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,kCAAkC;QAC3C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACrD;IACD,SAAS,EAAE;QACT,OAAO,EAAE,kCAAkC;QAC3C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE;KACtD;CACF,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,SAAS,GAAG,8BAA8B,gBAAgB,EAAE,CAAC;AAEnE,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,OAAO,EAAE;QACR,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;KAC7C;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;QACpD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE;KACzD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;IACD,SAAS,EAAE;QACV,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE;KACrD;CACD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare class CredentialsError extends Error {
2
+ constructor(platform: string, missingVars: string[]);
3
+ }
@@ -0,0 +1,7 @@
1
+ export class CredentialsError extends Error {
2
+ constructor(platform, missingVars) {
3
+ super(`${platform} credentials not configured. Please set: ${missingVars.join(", ")}`);
4
+ this.name = "CredentialsError";
5
+ }
6
+ }
7
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAC1C,YAAY,QAAgB,EAAE,WAAqB;QAClD,KAAK,CACJ,GAAG,QAAQ,4CAA4C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IAChC,CAAC;CACD"}
@@ -1,10 +1,18 @@
1
1
  export declare class DiscordService {
2
2
  private baseUrl;
3
3
  private headers;
4
+ constructor();
4
5
  sendMessage(channelId: string, content: string): Promise<{
5
6
  id: string;
6
7
  channel_id: string;
7
8
  content: string;
8
9
  timestamp: string;
9
10
  }>;
11
+ getMessages(channelId: string, limit?: number): Promise<{
12
+ id: string;
13
+ channel_id: string;
14
+ content: string;
15
+ timestamp: string;
16
+ }[]>;
10
17
  }
18
+ export declare function getDiscordService(): DiscordService;
@@ -1,18 +1,26 @@
1
1
  import { z } from "zod";
2
- import { fetchJson } from "../lib/http.js";
3
2
  import { config } from "../lib/config.js";
3
+ import { CredentialsError } from "../lib/errors.js";
4
+ import { fetchJson } from "../lib/http.js";
4
5
  const discordMessageSchema = z.object({
5
6
  id: z.string(),
6
7
  channel_id: z.string(),
7
8
  content: z.string(),
8
9
  timestamp: z.string(),
9
10
  });
11
+ const discordMessagesSchema = z.array(discordMessageSchema);
10
12
  export class DiscordService {
11
13
  baseUrl = config.discord.baseUrl;
12
- headers = {
13
- "Content-Type": "application/json",
14
- Authorization: `Bot ${config.discord.botToken}`,
15
- };
14
+ headers;
15
+ constructor() {
16
+ if (!config.discord.botToken) {
17
+ throw new CredentialsError("Discord", ["DISCORD_BOT_TOKEN"]);
18
+ }
19
+ this.headers = {
20
+ "Content-Type": "application/json",
21
+ Authorization: `Bot ${config.discord.botToken}`,
22
+ };
23
+ }
16
24
  async sendMessage(channelId, content) {
17
25
  return fetchJson(`${this.baseUrl}/channels/${channelId}/messages`, {
18
26
  method: "POST",
@@ -20,5 +28,17 @@ export class DiscordService {
20
28
  body: JSON.stringify({ content }),
21
29
  }, discordMessageSchema);
22
30
  }
31
+ async getMessages(channelId, limit = 50) {
32
+ return fetchJson(`${this.baseUrl}/channels/${channelId}/messages?limit=${limit}`, {
33
+ method: "GET",
34
+ headers: this.headers,
35
+ }, discordMessagesSchema);
36
+ }
37
+ }
38
+ let _instance;
39
+ export function getDiscordService() {
40
+ if (!_instance)
41
+ _instance = new DiscordService();
42
+ return _instance;
23
43
  }
24
44
  //# sourceMappingURL=discord-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"discord-service.js","sourceRoot":"","sources":["../../src/services/discord-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,OAAO,cAAc;IACjB,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;IACjC,OAAO,GAAG;QAChB,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;KAChD,CAAC;IAEF,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,OAAe;QAClD,OAAO,SAAS,CACd,GAAG,IAAI,CAAC,OAAO,aAAa,SAAS,WAAW,EAChD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,EACD,oBAAoB,CACrB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"discord-service.js","sourceRoot":"","sources":["../../src/services/discord-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE5D,MAAM,OAAO,cAAc;IAClB,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;IACjC,OAAO,CAAyB;IAExC;QACC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,gBAAgB,CAAC,SAAS,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,OAAO,GAAG;YACd,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;SAC/C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,OAAe;QACnD,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,aAAa,SAAS,WAAW,EAChD;YACC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SACjC,EACD,oBAAoB,CACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,KAAK,GAAG,EAAE;QAC9C,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,aAAa,SAAS,mBAAmB,KAAK,EAAE,EAC/D;YACC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,EACD,qBAAqB,CACrB,CAAC;IACH,CAAC;CACD;AAED,IAAI,SAAqC,CAAC;AAC1C,MAAM,UAAU,iBAAiB;IAChC,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;IACjD,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -1,8 +1,17 @@
1
1
  export declare class FacebookService {
2
2
  private baseUrl;
3
3
  private headers;
4
+ constructor();
4
5
  createPost(pageId: string, message: string): Promise<{
5
6
  id: string;
6
- post_id: string;
7
+ post_id?: string | undefined;
8
+ }>;
9
+ getPosts(pageId: string, limit?: number): Promise<{
10
+ data: {
11
+ id: string;
12
+ created_time: string;
13
+ message?: string | undefined;
14
+ }[];
7
15
  }>;
8
16
  }
17
+ export declare function getFacebookService(): FacebookService;
@@ -1,16 +1,31 @@
1
1
  import { z } from "zod";
2
- import { fetchJson } from "../lib/http.js";
3
2
  import { config } from "../lib/config.js";
3
+ import { CredentialsError } from "../lib/errors.js";
4
+ import { fetchJson } from "../lib/http.js";
4
5
  const facebookPostSchema = z.object({
5
6
  id: z.string(),
6
- post_id: z.string(),
7
+ post_id: z.string().optional(),
8
+ });
9
+ const facebookPostDetailSchema = z.object({
10
+ id: z.string(),
11
+ message: z.string().optional(),
12
+ created_time: z.string(),
13
+ });
14
+ const facebookPostsResponseSchema = z.object({
15
+ data: z.array(facebookPostDetailSchema),
7
16
  });
8
17
  export class FacebookService {
9
18
  baseUrl = config.facebook.baseUrl;
10
- headers = {
11
- "Content-Type": "application/json",
12
- Authorization: `Bearer ${config.facebook.accessToken}`,
13
- };
19
+ headers;
20
+ constructor() {
21
+ if (!config.facebook.accessToken) {
22
+ throw new CredentialsError("Facebook", ["FACEBOOK_ACCESS_TOKEN"]);
23
+ }
24
+ this.headers = {
25
+ "Content-Type": "application/json",
26
+ Authorization: `Bearer ${config.facebook.accessToken}`,
27
+ };
28
+ }
14
29
  async createPost(pageId, message) {
15
30
  return fetchJson(`${this.baseUrl}/${pageId}/feed`, {
16
31
  method: "POST",
@@ -18,5 +33,17 @@ export class FacebookService {
18
33
  body: JSON.stringify({ message }),
19
34
  }, facebookPostSchema);
20
35
  }
36
+ async getPosts(pageId, limit = 10) {
37
+ return fetchJson(`${this.baseUrl}/${pageId}/posts?fields=id,message,created_time&limit=${limit}`, {
38
+ method: "GET",
39
+ headers: this.headers,
40
+ }, facebookPostsResponseSchema);
41
+ }
42
+ }
43
+ let _instance;
44
+ export function getFacebookService() {
45
+ if (!_instance)
46
+ _instance = new FacebookService();
47
+ return _instance;
21
48
  }
22
49
  //# sourceMappingURL=facebook-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"facebook-service.js","sourceRoot":"","sources":["../../src/services/facebook-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,OAAO,eAAe;IAClB,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;IAClC,OAAO,GAAG;QAChB,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,UAAU,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE;KACvD,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,OAAe;QAC9C,OAAO,SAAS,CACd,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,OAAO,EAChC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,EACD,kBAAkB,CACnB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"facebook-service.js","sourceRoot":"","sources":["../../src/services/facebook-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;CACxB,CAAC,CAAC;AAEH,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,OAAO,eAAe;IACnB,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;IAClC,OAAO,CAAyB;IAExC;QACC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,gBAAgB,CAAC,UAAU,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,GAAG;YACd,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE;SACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,OAAe;QAC/C,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,OAAO,EAChC;YACC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SACjC,EACD,kBAAkB,CAClB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,KAAK,GAAG,EAAE;QACxC,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,+CAA+C,KAAK,EAAE,EAC/E;YACC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,EACD,2BAA2B,CAC3B,CAAC;IACH,CAAC;CACD;AAED,IAAI,SAAsC,CAAC;AAC3C,MAAM,UAAU,kBAAkB;IACjC,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IAClD,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -1,7 +1,17 @@
1
1
  export declare class InstagramService {
2
2
  private baseUrl;
3
3
  private headers;
4
+ constructor();
4
5
  createPost(userId: string, imageUrl: string, caption: string): Promise<{
5
6
  id: string;
6
7
  }>;
8
+ getPosts(userId: string, limit?: number): Promise<{
9
+ data: {
10
+ id: string;
11
+ media_type: string;
12
+ timestamp: string;
13
+ caption?: string | undefined;
14
+ }[];
15
+ }>;
7
16
  }
17
+ export declare function getInstagramService(): InstagramService;
@@ -1,28 +1,54 @@
1
1
  import { z } from "zod";
2
- import { fetchJson } from "../lib/http.js";
3
2
  import { config } from "../lib/config.js";
3
+ import { CredentialsError } from "../lib/errors.js";
4
+ import { fetchJson } from "../lib/http.js";
4
5
  const instagramMediaSchema = z.object({
5
6
  id: z.string(),
6
7
  });
8
+ const instagramMediaDetailSchema = z.object({
9
+ id: z.string(),
10
+ caption: z.string().optional(),
11
+ media_type: z.string(),
12
+ timestamp: z.string(),
13
+ });
14
+ const instagramMediaListSchema = z.object({
15
+ data: z.array(instagramMediaDetailSchema),
16
+ });
7
17
  export class InstagramService {
8
18
  baseUrl = config.instagram.baseUrl;
9
- headers = {
10
- "Content-Type": "application/json",
11
- Authorization: `Bearer ${config.instagram.accessToken}`,
12
- };
19
+ headers;
20
+ constructor() {
21
+ if (!config.instagram.accessToken) {
22
+ throw new CredentialsError("Instagram", ["INSTAGRAM_ACCESS_TOKEN"]);
23
+ }
24
+ this.headers = {
25
+ "Content-Type": "application/json",
26
+ Authorization: `Bearer ${config.instagram.accessToken}`,
27
+ };
28
+ }
13
29
  async createPost(userId, imageUrl, caption) {
14
- // First, create the media container
15
30
  const containerResponse = await fetchJson(`${this.baseUrl}/${userId}/media`, {
16
31
  method: "POST",
17
32
  headers: this.headers,
18
33
  body: JSON.stringify({ image_url: imageUrl, caption }),
19
34
  }, z.object({ id: z.string() }));
20
- // Then, publish the media
21
35
  return fetchJson(`${this.baseUrl}/${userId}/media_publish`, {
22
36
  method: "POST",
23
37
  headers: this.headers,
24
38
  body: JSON.stringify({ creation_id: containerResponse.id }),
25
39
  }, instagramMediaSchema);
26
40
  }
41
+ async getPosts(userId, limit = 10) {
42
+ return fetchJson(`${this.baseUrl}/${userId}/media?fields=id,caption,media_type,timestamp&limit=${limit}`, {
43
+ method: "GET",
44
+ headers: this.headers,
45
+ }, instagramMediaListSchema);
46
+ }
47
+ }
48
+ let _instance;
49
+ export function getInstagramService() {
50
+ if (!_instance)
51
+ _instance = new InstagramService();
52
+ return _instance;
27
53
  }
28
54
  //# sourceMappingURL=instagram-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instagram-service.js","sourceRoot":"","sources":["../../src/services/instagram-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;CACf,CAAC,CAAC;AAEH,MAAM,OAAO,gBAAgB;IACnB,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;IACnC,OAAO,GAAG;QAChB,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,UAAU,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;KACxD,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,QAAgB,EAAE,OAAe;QAChE,oCAAoC;QACpC,MAAM,iBAAiB,GAAG,MAAM,SAAS,CACvC,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,QAAQ,EACjC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;SACvD,EACD,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC7B,CAAC;QAEF,0BAA0B;QAC1B,OAAO,SAAS,CACd,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,gBAAgB,EACzC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC;SAC5D,EACD,oBAAoB,CACrB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"instagram-service.js","sourceRoot":"","sources":["../../src/services/instagram-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,OAAO,gBAAgB;IACpB,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;IACnC,OAAO,CAAyB;IAExC;QACC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,OAAO,GAAG;YACd,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;SACvD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,QAAgB,EAAE,OAAe;QACjE,MAAM,iBAAiB,GAAG,MAAM,SAAS,CACxC,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,QAAQ,EACjC;YACC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;SACtD,EACD,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC5B,CAAC;QACF,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,gBAAgB,EACzC;YACC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC;SAC3D,EACD,oBAAoB,CACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,KAAK,GAAG,EAAE;QACxC,OAAO,SAAS,CACf,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,uDAAuD,KAAK,EAAE,EACvF;YACC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,EACD,wBAAwB,CACxB,CAAC;IACH,CAAC;CACD;AAED,IAAI,SAAuC,CAAC;AAC5C,MAAM,UAAU,mBAAmB;IAClC,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACnD,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -6,4 +6,16 @@ export declare class SlackService {
6
6
  channelId: string | undefined;
7
7
  text: string;
8
8
  }>;
9
+ getMessages(channelId: string, limit?: number): Promise<{
10
+ ts: string | undefined;
11
+ userId: string | undefined;
12
+ text: string | undefined;
13
+ }[]>;
14
+ listChannels(limit?: number): Promise<{
15
+ id: string | undefined;
16
+ name: string | undefined;
17
+ isPrivate: boolean | undefined;
18
+ memberCount: number | undefined;
19
+ }[]>;
9
20
  }
21
+ export declare function getSlackService(): SlackService;