@praveencs/agent 0.9.30 → 0.10.0

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 (236) hide show
  1. package/README.md +55 -9
  2. package/ROADMAP.md +42 -50
  3. package/agent-skills/README.md +192 -0
  4. package/agent-skills/plugins/aws/plugin.json +22 -0
  5. package/agent-skills/plugins/aws/skills/aws-manager.md +17 -0
  6. package/agent-skills/plugins/aws/tools/aws.js +152 -0
  7. package/agent-skills/plugins/discord/plugin.json +22 -0
  8. package/agent-skills/plugins/discord/skills/discord-manager.md +15 -0
  9. package/agent-skills/plugins/discord/tools/discord.js +150 -0
  10. package/agent-skills/plugins/docker/plugin.json +21 -0
  11. package/agent-skills/plugins/docker/skills/docker-manager.md +15 -0
  12. package/agent-skills/plugins/docker/tools/docker.js +135 -0
  13. package/agent-skills/plugins/firebase/plugin.json +22 -0
  14. package/agent-skills/plugins/firebase/skills/firebase-manager.md +14 -0
  15. package/agent-skills/plugins/firebase/tools/firebase.js +157 -0
  16. package/agent-skills/plugins/github/plugin.json +23 -0
  17. package/agent-skills/plugins/github/skills/github-manager.md +15 -0
  18. package/agent-skills/plugins/github/tools/github.js +133 -0
  19. package/agent-skills/plugins/huggingface/plugin.json +22 -0
  20. package/agent-skills/plugins/huggingface/skills/huggingface-manager.md +16 -0
  21. package/agent-skills/plugins/huggingface/tools/huggingface.js +149 -0
  22. package/agent-skills/plugins/linear/plugin.json +22 -0
  23. package/agent-skills/plugins/linear/skills/linear-manager.md +16 -0
  24. package/agent-skills/plugins/linear/tools/linear.js +199 -0
  25. package/agent-skills/plugins/mongodb/plugin.json +21 -0
  26. package/agent-skills/plugins/mongodb/skills/mongodb-manager.md +14 -0
  27. package/agent-skills/plugins/mongodb/tools/mongodb.js +123 -0
  28. package/agent-skills/plugins/notion/plugin.json +22 -0
  29. package/agent-skills/plugins/notion/skills/notion-manager.md +16 -0
  30. package/agent-skills/plugins/notion/tools/notion.js +158 -0
  31. package/agent-skills/plugins/openai/plugin.json +23 -0
  32. package/agent-skills/plugins/openai/skills/openai-manager.md +15 -0
  33. package/agent-skills/plugins/openai/tools/openai.js +137 -0
  34. package/agent-skills/plugins/resend/plugin.json +21 -0
  35. package/agent-skills/plugins/resend/skills/resend-manager.md +15 -0
  36. package/agent-skills/plugins/resend/tools/resend.js +102 -0
  37. package/agent-skills/plugins/slack/plugin.json +22 -0
  38. package/agent-skills/plugins/slack/skills/slack-manager.md +15 -0
  39. package/agent-skills/plugins/slack/tools/slack.js +168 -0
  40. package/agent-skills/plugins/stripe/plugin.json +22 -0
  41. package/agent-skills/plugins/stripe/skills/stripe-manager.md +16 -0
  42. package/agent-skills/plugins/stripe/tools/stripe.js +174 -0
  43. package/agent-skills/plugins/supabase/plugin.json +22 -0
  44. package/agent-skills/plugins/supabase/skills/supabase-manager.md +16 -0
  45. package/agent-skills/plugins/supabase/tools/supabase.js +153 -0
  46. package/agent-skills/plugins/telegram/plugin.json +21 -0
  47. package/agent-skills/plugins/telegram/skills/telegram-manager.md +14 -0
  48. package/agent-skills/plugins/telegram/tools/telegram.js +131 -0
  49. package/agent-skills/plugins/vercel/plugin.json +22 -0
  50. package/agent-skills/plugins/vercel/skills/vercel-manager.md +15 -0
  51. package/agent-skills/plugins/vercel/tools/vercel.js +145 -0
  52. package/agent-skills/registry.json +675 -0
  53. package/agent-skills/skills/api-tester/prompt.md +27 -0
  54. package/agent-skills/skills/api-tester/skill.json +16 -0
  55. package/agent-skills/skills/backup/prompt.md +12 -0
  56. package/agent-skills/skills/backup/skill.json +1 -0
  57. package/agent-skills/skills/code-review/prompt.md +29 -0
  58. package/agent-skills/skills/code-review/skill.json +18 -0
  59. package/agent-skills/skills/create-note/prompt.md +21 -0
  60. package/agent-skills/skills/create-note/skill.json +15 -0
  61. package/agent-skills/skills/cron-scheduler/prompt.md +25 -0
  62. package/agent-skills/skills/cron-scheduler/skill.json +1 -0
  63. package/agent-skills/skills/db-query/prompt.md +12 -0
  64. package/agent-skills/skills/db-query/skill.json +1 -0
  65. package/agent-skills/skills/docker-deploy/prompt.md +21 -0
  66. package/agent-skills/skills/docker-deploy/skill.json +16 -0
  67. package/agent-skills/skills/file-organizer/prompt.md +32 -0
  68. package/agent-skills/skills/file-organizer/skill.json +19 -0
  69. package/agent-skills/skills/git-commit/prompt.md +21 -0
  70. package/agent-skills/skills/git-commit/skill.json +17 -0
  71. package/agent-skills/skills/log-analyzer/prompt.md +16 -0
  72. package/agent-skills/skills/log-analyzer/skill.json +1 -0
  73. package/agent-skills/skills/npm-publish/prompt.md +24 -0
  74. package/agent-skills/skills/npm-publish/skill.json +20 -0
  75. package/agent-skills/skills/open-vscode/prompt.md +8 -0
  76. package/agent-skills/skills/open-vscode/skill.json +15 -0
  77. package/agent-skills/skills/project-scaffold/prompt.md +43 -0
  78. package/agent-skills/skills/project-scaffold/skill.json +17 -0
  79. package/agent-skills/skills/send-email/prompt.md +19 -0
  80. package/agent-skills/skills/send-email/send.js +60 -0
  81. package/agent-skills/skills/send-email/skill.json +16 -0
  82. package/agent-skills/skills/system-monitor/prompt.md +27 -0
  83. package/agent-skills/skills/system-monitor/skill.json +15 -0
  84. package/agent-skills/skills/web-search/prompt.md +26 -0
  85. package/agent-skills/skills/web-search/skill.json +16 -0
  86. package/dist/src/cli/commands/desktop.d.ts +3 -0
  87. package/dist/src/cli/commands/desktop.d.ts.map +1 -0
  88. package/dist/src/cli/commands/desktop.js +80 -0
  89. package/dist/src/cli/commands/desktop.js.map +1 -0
  90. package/dist/src/cli/commands/multimodal.d.ts +3 -0
  91. package/dist/src/cli/commands/multimodal.d.ts.map +1 -0
  92. package/dist/src/cli/commands/multimodal.js +78 -0
  93. package/dist/src/cli/commands/multimodal.js.map +1 -0
  94. package/dist/src/cli/commands/sandbox.d.ts +3 -0
  95. package/dist/src/cli/commands/sandbox.d.ts.map +1 -0
  96. package/dist/src/cli/commands/sandbox.js +89 -0
  97. package/dist/src/cli/commands/sandbox.js.map +1 -0
  98. package/dist/src/cli/commands/swarm.d.ts +3 -0
  99. package/dist/src/cli/commands/swarm.d.ts.map +1 -0
  100. package/dist/src/cli/commands/swarm.js +120 -0
  101. package/dist/src/cli/commands/swarm.js.map +1 -0
  102. package/dist/src/cli/index.d.ts.map +1 -1
  103. package/dist/src/cli/index.js +8 -0
  104. package/dist/src/cli/index.js.map +1 -1
  105. package/dist/src/config/defaults.d.ts.map +1 -1
  106. package/dist/src/config/defaults.js +42 -0
  107. package/dist/src/config/defaults.js.map +1 -1
  108. package/dist/src/config/schema.d.ts +261 -0
  109. package/dist/src/config/schema.d.ts.map +1 -1
  110. package/dist/src/config/schema.js +58 -0
  111. package/dist/src/config/schema.js.map +1 -1
  112. package/dist/src/desktop/engine.d.ts +42 -0
  113. package/dist/src/desktop/engine.d.ts.map +1 -0
  114. package/dist/src/desktop/engine.js +77 -0
  115. package/dist/src/desktop/engine.js.map +1 -0
  116. package/dist/src/desktop/index.d.ts +6 -0
  117. package/dist/src/desktop/index.d.ts.map +1 -0
  118. package/dist/src/desktop/index.js +6 -0
  119. package/dist/src/desktop/index.js.map +1 -0
  120. package/dist/src/desktop/input.d.ts +20 -0
  121. package/dist/src/desktop/input.d.ts.map +1 -0
  122. package/dist/src/desktop/input.js +160 -0
  123. package/dist/src/desktop/input.js.map +1 -0
  124. package/dist/src/desktop/screen.d.ts +17 -0
  125. package/dist/src/desktop/screen.d.ts.map +1 -0
  126. package/dist/src/desktop/screen.js +120 -0
  127. package/dist/src/desktop/screen.js.map +1 -0
  128. package/dist/src/desktop/types.d.ts +50 -0
  129. package/dist/src/desktop/types.d.ts.map +1 -0
  130. package/dist/src/desktop/types.js +10 -0
  131. package/dist/src/desktop/types.js.map +1 -0
  132. package/dist/src/multimodal/engine.d.ts +33 -0
  133. package/dist/src/multimodal/engine.d.ts.map +1 -0
  134. package/dist/src/multimodal/engine.js +63 -0
  135. package/dist/src/multimodal/engine.js.map +1 -0
  136. package/dist/src/multimodal/index.d.ts +7 -0
  137. package/dist/src/multimodal/index.d.ts.map +1 -0
  138. package/dist/src/multimodal/index.js +7 -0
  139. package/dist/src/multimodal/index.js.map +1 -0
  140. package/dist/src/multimodal/tts.d.ts +11 -0
  141. package/dist/src/multimodal/tts.d.ts.map +1 -0
  142. package/dist/src/multimodal/tts.js +48 -0
  143. package/dist/src/multimodal/tts.js.map +1 -0
  144. package/dist/src/multimodal/types.d.ts +55 -0
  145. package/dist/src/multimodal/types.d.ts.map +1 -0
  146. package/dist/src/multimodal/types.js +20 -0
  147. package/dist/src/multimodal/types.js.map +1 -0
  148. package/dist/src/multimodal/vision.d.ts +15 -0
  149. package/dist/src/multimodal/vision.d.ts.map +1 -0
  150. package/dist/src/multimodal/vision.js +98 -0
  151. package/dist/src/multimodal/vision.js.map +1 -0
  152. package/dist/src/multimodal/voice.d.ts +11 -0
  153. package/dist/src/multimodal/voice.d.ts.map +1 -0
  154. package/dist/src/multimodal/voice.js +43 -0
  155. package/dist/src/multimodal/voice.js.map +1 -0
  156. package/dist/src/plans/types.d.ts +18 -18
  157. package/dist/src/sandbox/docker.d.ts +42 -0
  158. package/dist/src/sandbox/docker.d.ts.map +1 -0
  159. package/dist/src/sandbox/docker.js +131 -0
  160. package/dist/src/sandbox/docker.js.map +1 -0
  161. package/dist/src/sandbox/engine.d.ts +50 -0
  162. package/dist/src/sandbox/engine.d.ts.map +1 -0
  163. package/dist/src/sandbox/engine.js +133 -0
  164. package/dist/src/sandbox/engine.js.map +1 -0
  165. package/dist/src/sandbox/index.d.ts +5 -0
  166. package/dist/src/sandbox/index.d.ts.map +1 -0
  167. package/dist/src/sandbox/index.js +5 -0
  168. package/dist/src/sandbox/index.js.map +1 -0
  169. package/dist/src/sandbox/types.d.ts +41 -0
  170. package/dist/src/sandbox/types.d.ts.map +1 -0
  171. package/dist/src/sandbox/types.js +12 -0
  172. package/dist/src/sandbox/types.js.map +1 -0
  173. package/dist/src/scripts/types.d.ts +2 -2
  174. package/dist/src/server/app.d.ts.map +1 -1
  175. package/dist/src/server/app.js +133 -0
  176. package/dist/src/server/app.js.map +1 -1
  177. package/dist/src/swarm/bus.d.ts +27 -0
  178. package/dist/src/swarm/bus.d.ts.map +1 -0
  179. package/dist/src/swarm/bus.js +64 -0
  180. package/dist/src/swarm/bus.js.map +1 -0
  181. package/dist/src/swarm/index.d.ts +6 -0
  182. package/dist/src/swarm/index.d.ts.map +1 -0
  183. package/dist/src/swarm/index.js +6 -0
  184. package/dist/src/swarm/index.js.map +1 -0
  185. package/dist/src/swarm/orchestrator.d.ts +79 -0
  186. package/dist/src/swarm/orchestrator.d.ts.map +1 -0
  187. package/dist/src/swarm/orchestrator.js +271 -0
  188. package/dist/src/swarm/orchestrator.js.map +1 -0
  189. package/dist/src/swarm/roles.d.ts +18 -0
  190. package/dist/src/swarm/roles.d.ts.map +1 -0
  191. package/dist/src/swarm/roles.js +83 -0
  192. package/dist/src/swarm/roles.js.map +1 -0
  193. package/dist/src/swarm/types.d.ts +58 -0
  194. package/dist/src/swarm/types.d.ts.map +1 -0
  195. package/dist/src/swarm/types.js +10 -0
  196. package/dist/src/swarm/types.js.map +1 -0
  197. package/dist/src/tools/core/cmd.d.ts.map +1 -1
  198. package/dist/src/tools/core/cmd.js +28 -0
  199. package/dist/src/tools/core/cmd.js.map +1 -1
  200. package/docs/DOCUMENTATION.md +137 -0
  201. package/package.json +3 -1
  202. package/studio/README.md +73 -0
  203. package/studio/eslint.config.js +23 -0
  204. package/studio/index.html +13 -0
  205. package/studio/package-lock.json +4350 -0
  206. package/studio/package.json +44 -0
  207. package/studio/postcss.config.js +6 -0
  208. package/studio/public/vite.svg +1 -0
  209. package/studio/src/App.tsx +243 -0
  210. package/studio/src/assets/react.svg +1 -0
  211. package/studio/src/components/Capabilities.tsx +80 -0
  212. package/studio/src/components/CommandsManager.tsx +94 -0
  213. package/studio/src/components/CostDashboard.tsx +182 -0
  214. package/studio/src/components/CredentialCapture.tsx +196 -0
  215. package/studio/src/components/CredentialsManager.tsx +257 -0
  216. package/studio/src/components/DaemonPanel.tsx +91 -0
  217. package/studio/src/components/DesktopPanel.tsx +118 -0
  218. package/studio/src/components/GoalTemplates.tsx +190 -0
  219. package/studio/src/components/GoalsPanel.tsx +235 -0
  220. package/studio/src/components/MemoryExplorer.tsx +152 -0
  221. package/studio/src/components/MultimodalPanel.tsx +150 -0
  222. package/studio/src/components/NotificationsPanel.tsx +175 -0
  223. package/studio/src/components/PluginsManager.tsx +60 -0
  224. package/studio/src/components/SandboxPanel.tsx +118 -0
  225. package/studio/src/components/ScriptsManager.tsx +269 -0
  226. package/studio/src/components/SkillsManager.tsx +123 -0
  227. package/studio/src/components/SwarmPanel.tsx +149 -0
  228. package/studio/src/components/TaskStreaming.tsx +189 -0
  229. package/studio/src/components/Terminal.tsx +200 -0
  230. package/studio/src/index.css +51 -0
  231. package/studio/src/main.tsx +13 -0
  232. package/studio/tailwind.config.js +47 -0
  233. package/studio/tsconfig.app.json +28 -0
  234. package/studio/tsconfig.json +7 -0
  235. package/studio/tsconfig.node.json +26 -0
  236. package/studio/vite.config.ts +7 -0
@@ -0,0 +1,15 @@
1
+ # Slack Manager
2
+
3
+ ## Description
4
+ This skill enables you to send messages, manage channels, search workspace history, and upload files to Slack.
5
+
6
+ ## Instructions
7
+ 1. When asked to send a Slack message, use the `slack` tool with `action: "send_message"`. You need the `channel` (use a channel ID like `C01ABCDEF` or a channel name like `#general`) and the `text`.
8
+ 2. For rich messages, use Slack's **mrkdwn** format: `*bold*`, `_italic_`, `~strikethrough~`, `` `code` ``, `> quote`. You can also pass `blocks` for Block Kit layouts.
9
+ 3. To find a channel ID, first call `action: "list_channels"` and look for the channel name in the results.
10
+ 4. To search message history, use `action: "search"` with a `query`. Slack search supports operators like `from:@user`, `in:#channel`, `before:2024-01-01`, `has:link`.
11
+ 5. To reply in a thread, use `action: "send_reply"` and provide the `thread_ts` from the parent message.
12
+ 6. If the tool returns an authentication error, inform the user they need to export `SLACK_BOT_TOKEN`. They can create a Slack App at https://api.slack.com/apps.
13
+
14
+ ## Input Variables
15
+ {{input}}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Slack automation tool.
3
+ * Provides messaging, channel management, and search via the Slack Web API.
4
+ */
5
+ export async function execute(params) {
6
+ const { action, ...args } = params;
7
+ const token = process.env.SLACK_BOT_TOKEN;
8
+
9
+ if (!token) {
10
+ throw new Error('SLACK_BOT_TOKEN environment variable is not set. Create a Slack App at https://api.slack.com/apps and add a Bot Token.');
11
+ }
12
+
13
+ const headers = {
14
+ 'Content-Type': 'application/json; charset=utf-8',
15
+ 'Authorization': `Bearer ${token}`
16
+ };
17
+
18
+ async function slackAPI(method, body = null) {
19
+ const url = `https://slack.com/api/${method}`;
20
+ const options = { method: 'POST', headers };
21
+ if (body) options.body = JSON.stringify(body);
22
+
23
+ const res = await fetch(url, options);
24
+ const data = await res.json();
25
+
26
+ if (!data.ok) {
27
+ throw new Error(`Slack API Error (${method}): ${data.error}`);
28
+ }
29
+ return data;
30
+ }
31
+
32
+ try {
33
+ switch (action) {
34
+ // --- MESSAGING ---
35
+ case 'send_message':
36
+ return await slackAPI('chat.postMessage', {
37
+ channel: args.channel,
38
+ text: args.text,
39
+ blocks: args.blocks || undefined
40
+ });
41
+
42
+ case 'send_reply':
43
+ return await slackAPI('chat.postMessage', {
44
+ channel: args.channel,
45
+ text: args.text,
46
+ thread_ts: args.thread_ts
47
+ });
48
+
49
+ case 'update_message':
50
+ return await slackAPI('chat.update', {
51
+ channel: args.channel,
52
+ ts: args.ts,
53
+ text: args.text
54
+ });
55
+
56
+ case 'delete_message':
57
+ return await slackAPI('chat.delete', {
58
+ channel: args.channel,
59
+ ts: args.ts
60
+ });
61
+
62
+ // --- CHANNELS ---
63
+ case 'list_channels':
64
+ return await slackAPI('conversations.list', {
65
+ types: args.types || 'public_channel,private_channel',
66
+ limit: args.limit || 100
67
+ });
68
+
69
+ case 'create_channel':
70
+ return await slackAPI('conversations.create', {
71
+ name: args.name,
72
+ is_private: args.is_private || false
73
+ });
74
+
75
+ case 'set_topic':
76
+ return await slackAPI('conversations.setTopic', {
77
+ channel: args.channel,
78
+ topic: args.topic
79
+ });
80
+
81
+ case 'invite_to_channel':
82
+ return await slackAPI('conversations.invite', {
83
+ channel: args.channel,
84
+ users: args.users // comma-separated user IDs
85
+ });
86
+
87
+ // --- SEARCH ---
88
+ case 'search':
89
+ return await slackAPI('search.messages', {
90
+ query: args.query,
91
+ count: args.count || 20,
92
+ sort: args.sort || 'timestamp'
93
+ });
94
+
95
+ // --- FILES ---
96
+ case 'upload_file':
97
+ // Use the v2 file upload
98
+ return await slackAPI('files.uploadV2', {
99
+ channel_id: args.channel,
100
+ content: args.content,
101
+ filename: args.filename,
102
+ title: args.title || args.filename
103
+ });
104
+
105
+ // --- USERS ---
106
+ case 'list_users':
107
+ return await slackAPI('users.list', {
108
+ limit: args.limit || 100
109
+ });
110
+
111
+ case 'user_info':
112
+ return await slackAPI('users.info', {
113
+ user: args.user
114
+ });
115
+
116
+ // --- REACTIONS ---
117
+ case 'add_reaction':
118
+ return await slackAPI('reactions.add', {
119
+ channel: args.channel,
120
+ timestamp: args.ts,
121
+ name: args.emoji
122
+ });
123
+
124
+ default:
125
+ throw new Error(`Unknown action: ${action}`);
126
+ }
127
+ } catch (err) {
128
+ return { error: err.message, stack: err.stack };
129
+ }
130
+ }
131
+
132
+ export const definition = {
133
+ name: 'slack',
134
+ description: 'Interact with Slack to send messages, manage channels, search history, and upload files. Requires SLACK_BOT_TOKEN.',
135
+ parameters: {
136
+ type: 'object',
137
+ required: ['action'],
138
+ properties: {
139
+ action: {
140
+ type: 'string',
141
+ description: 'The Slack operation to perform',
142
+ enum: [
143
+ 'send_message', 'send_reply', 'update_message', 'delete_message',
144
+ 'list_channels', 'create_channel', 'set_topic', 'invite_to_channel',
145
+ 'search', 'upload_file',
146
+ 'list_users', 'user_info',
147
+ 'add_reaction'
148
+ ]
149
+ },
150
+ channel: { type: 'string', description: 'Channel ID or name (e.g., "#general" or "C01ABCDEF")' },
151
+ text: { type: 'string', description: 'Message text (supports Slack mrkdwn formatting)' },
152
+ thread_ts: { type: 'string', description: 'Thread timestamp to reply to' },
153
+ ts: { type: 'string', description: 'Message timestamp (for update/delete/reaction)' },
154
+ name: { type: 'string', description: 'Channel name (for create_channel)' },
155
+ is_private: { type: 'boolean', description: 'Whether to create a private channel' },
156
+ topic: { type: 'string', description: 'Channel topic text' },
157
+ users: { type: 'string', description: 'Comma-separated user IDs (for invite)' },
158
+ query: { type: 'string', description: 'Search query string' },
159
+ content: { type: 'string', description: 'File content to upload' },
160
+ filename: { type: 'string', description: 'Filename for upload' },
161
+ title: { type: 'string', description: 'Title for uploaded file' },
162
+ user: { type: 'string', description: 'User ID for user_info' },
163
+ emoji: { type: 'string', description: 'Emoji name without colons (e.g., "thumbsup")' },
164
+ blocks: { type: 'array', description: 'Slack Block Kit blocks for rich messages' },
165
+ limit: { type: 'number', description: 'Max results to return' }
166
+ }
167
+ }
168
+ };
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "stripe",
3
+ "version": "1.0.0",
4
+ "description": "Manage customers, subscriptions, payments, and invoices on Stripe.",
5
+ "author": "Praveen",
6
+ "category": "Payments & Business",
7
+ "tags": [
8
+ "stripe",
9
+ "payments",
10
+ "billing",
11
+ "subscriptions",
12
+ "saas"
13
+ ],
14
+ "exports": {
15
+ "tools": [
16
+ "tools/stripe.js"
17
+ ],
18
+ "skills": [
19
+ "skills/stripe-manager.md"
20
+ ]
21
+ }
22
+ }
@@ -0,0 +1,16 @@
1
+ # Stripe Manager
2
+
3
+ ## Description
4
+ This skill enables you to manage customers, products, subscriptions, checkout sessions, invoices, and refunds on Stripe.
5
+
6
+ ## Instructions
7
+ 1. Stripe amounts are always in **cents**. $19.99 = `1999`. Always convert before passing to the tool.
8
+ 2. To set up a SaaS billing flow: first `create_product`, then `create_price` (with `interval` for recurring), then `create_checkout` or `create_subscription`.
9
+ 3. Customer IDs start with `cus_`, product IDs with `prod_`, price IDs with `price_`, subscription IDs with `sub_`.
10
+ 4. For checkout sessions, always provide `success_url` and `cancel_url` — these are where Stripe redirects after payment.
11
+ 5. To issue a partial refund, use `create_refund` with both `payment_intent` and `amount` (in cents).
12
+ 6. Use `get_balance` to check the current Stripe account balance.
13
+ 7. If the tool returns an authentication error, the user needs to export `STRIPE_SECRET_KEY` from https://dashboard.stripe.com/apikeys. Use **test mode keys** (`sk_test_...`) for development.
14
+
15
+ ## Input Variables
16
+ {{input}}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Stripe automation tool.
3
+ * Provides customer, subscription, payment, and invoice management via the Stripe REST API.
4
+ * Uses form-encoded requests as required by Stripe's API.
5
+ */
6
+ export async function execute(params) {
7
+ const { action, ...args } = params;
8
+ const key = process.env.STRIPE_SECRET_KEY;
9
+
10
+ if (!key) {
11
+ throw new Error('STRIPE_SECRET_KEY environment variable is not set. Find it at https://dashboard.stripe.com/apikeys');
12
+ }
13
+
14
+ const headers = {
15
+ 'Authorization': `Bearer ${key}`,
16
+ 'Content-Type': 'application/x-www-form-urlencoded'
17
+ };
18
+
19
+ /** Convert a flat object to URL-encoded form data (supports nested via bracket notation) */
20
+ function toForm(obj, prefix = '') {
21
+ const parts = [];
22
+ for (const [key, val] of Object.entries(obj)) {
23
+ if (val === undefined || val === null) continue;
24
+ const fullKey = prefix ? `${prefix}[${key}]` : key;
25
+ if (typeof val === 'object' && !Array.isArray(val)) {
26
+ parts.push(toForm(val, fullKey));
27
+ } else {
28
+ parts.push(`${encodeURIComponent(fullKey)}=${encodeURIComponent(val)}`);
29
+ }
30
+ }
31
+ return parts.join('&');
32
+ }
33
+
34
+ async function stripeFetch(method, endpoint, body = null) {
35
+ const url = `https://api.stripe.com/v1${endpoint}`;
36
+ const options = { method, headers };
37
+ if (body) options.body = toForm(body);
38
+
39
+ const res = await fetch(url, options);
40
+ const data = await res.json();
41
+
42
+ if (!res.ok) {
43
+ throw new Error(`Stripe API Error: ${data.error?.message || JSON.stringify(data)}`);
44
+ }
45
+ return data;
46
+ }
47
+
48
+ try {
49
+ switch (action) {
50
+ // --- CUSTOMERS ---
51
+ case 'create_customer':
52
+ return await stripeFetch('POST', '/customers', {
53
+ email: args.email,
54
+ name: args.name,
55
+ description: args.description,
56
+ metadata: args.metadata
57
+ });
58
+
59
+ case 'list_customers':
60
+ return await stripeFetch('GET', `/customers?limit=${args.limit || 10}`);
61
+
62
+ case 'get_customer':
63
+ return await stripeFetch('GET', `/customers/${args.customer_id}`);
64
+
65
+ case 'update_customer':
66
+ return await stripeFetch('POST', `/customers/${args.customer_id}`, args.data || {});
67
+
68
+ case 'delete_customer':
69
+ return await stripeFetch('DELETE', `/customers/${args.customer_id}`);
70
+
71
+ // --- PRODUCTS & PRICES ---
72
+ case 'create_product':
73
+ return await stripeFetch('POST', '/products', {
74
+ name: args.name,
75
+ description: args.description
76
+ });
77
+
78
+ case 'create_price':
79
+ return await stripeFetch('POST', '/prices', {
80
+ product: args.product_id,
81
+ unit_amount: args.amount, // in cents
82
+ currency: args.currency || 'usd',
83
+ recurring: args.interval ? { interval: args.interval } : undefined
84
+ });
85
+
86
+ case 'list_products':
87
+ return await stripeFetch('GET', `/products?limit=${args.limit || 10}&active=true`);
88
+
89
+ // --- SUBSCRIPTIONS ---
90
+ case 'create_subscription':
91
+ return await stripeFetch('POST', '/subscriptions', {
92
+ customer: args.customer_id,
93
+ 'items[0][price]': args.price_id
94
+ });
95
+
96
+ case 'list_subscriptions':
97
+ return await stripeFetch('GET', `/subscriptions?customer=${args.customer_id}&limit=${args.limit || 10}`);
98
+
99
+ case 'cancel_subscription':
100
+ return await stripeFetch('DELETE', `/subscriptions/${args.subscription_id}`);
101
+
102
+ // --- CHECKOUT ---
103
+ case 'create_checkout':
104
+ return await stripeFetch('POST', '/checkout/sessions', {
105
+ mode: args.mode || 'payment',
106
+ success_url: args.success_url,
107
+ cancel_url: args.cancel_url,
108
+ 'line_items[0][price]': args.price_id,
109
+ 'line_items[0][quantity]': args.quantity || 1,
110
+ customer_email: args.email
111
+ });
112
+
113
+ // --- INVOICES ---
114
+ case 'list_invoices':
115
+ return await stripeFetch('GET', `/invoices?customer=${args.customer_id || ''}&limit=${args.limit || 10}`);
116
+
117
+ // --- REFUNDS ---
118
+ case 'create_refund':
119
+ return await stripeFetch('POST', '/refunds', {
120
+ payment_intent: args.payment_intent,
121
+ amount: args.amount // partial refund in cents
122
+ });
123
+
124
+ // --- BALANCE ---
125
+ case 'get_balance':
126
+ return await stripeFetch('GET', '/balance');
127
+
128
+ default:
129
+ throw new Error(`Unknown action: ${action}`);
130
+ }
131
+ } catch (err) {
132
+ return { error: err.message, stack: err.stack };
133
+ }
134
+ }
135
+
136
+ export const definition = {
137
+ name: 'stripe',
138
+ description: 'Manage Stripe customers, products, subscriptions, checkout sessions, invoices, and refunds. Requires STRIPE_SECRET_KEY.',
139
+ parameters: {
140
+ type: 'object',
141
+ required: ['action'],
142
+ properties: {
143
+ action: {
144
+ type: 'string',
145
+ description: 'The Stripe operation to perform',
146
+ enum: [
147
+ 'create_customer', 'list_customers', 'get_customer', 'update_customer', 'delete_customer',
148
+ 'create_product', 'create_price', 'list_products',
149
+ 'create_subscription', 'list_subscriptions', 'cancel_subscription',
150
+ 'create_checkout',
151
+ 'list_invoices', 'create_refund', 'get_balance'
152
+ ]
153
+ },
154
+ customer_id: { type: 'string', description: 'Stripe customer ID (cus_xxx)' },
155
+ email: { type: 'string', description: 'Customer email' },
156
+ name: { type: 'string', description: 'Customer or product name' },
157
+ description: { type: 'string', description: 'Description text' },
158
+ product_id: { type: 'string', description: 'Stripe product ID (prod_xxx)' },
159
+ price_id: { type: 'string', description: 'Stripe price ID (price_xxx)' },
160
+ amount: { type: 'number', description: 'Amount in cents (e.g., 1999 = $19.99)' },
161
+ currency: { type: 'string', description: 'Currency code (default: usd)' },
162
+ interval: { type: 'string', description: 'Billing interval: month, year, week, day' },
163
+ subscription_id: { type: 'string', description: 'Stripe subscription ID (sub_xxx)' },
164
+ mode: { type: 'string', description: 'Checkout mode: payment, subscription, setup' },
165
+ success_url: { type: 'string', description: 'URL to redirect after successful checkout' },
166
+ cancel_url: { type: 'string', description: 'URL to redirect after cancelled checkout' },
167
+ quantity: { type: 'number', description: 'Quantity for checkout line item' },
168
+ payment_intent: { type: 'string', description: 'Payment intent ID for refunds (pi_xxx)' },
169
+ data: { type: 'object', description: 'Arbitrary update data for customer updates' },
170
+ metadata: { type: 'object', description: 'Key-value metadata for Stripe objects' },
171
+ limit: { type: 'number', description: 'Max results to return' }
172
+ }
173
+ }
174
+ };
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "supabase",
3
+ "version": "1.0.0",
4
+ "description": "Query Postgres databases, manage auth users, and interact with storage buckets on Supabase.",
5
+ "author": "Praveen",
6
+ "category": "Databases & Backend",
7
+ "tags": [
8
+ "supabase",
9
+ "postgres",
10
+ "database",
11
+ "auth",
12
+ "baas"
13
+ ],
14
+ "exports": {
15
+ "tools": [
16
+ "tools/supabase.js"
17
+ ],
18
+ "skills": [
19
+ "skills/supabase-manager.md"
20
+ ]
21
+ }
22
+ }
@@ -0,0 +1,16 @@
1
+ # Supabase Manager
2
+
3
+ ## Description
4
+ This skill enables you to query Postgres databases, manage auth users, and interact with storage buckets on Supabase.
5
+
6
+ ## Instructions
7
+ 1. To query data, use `action: "select"` with `table` and optionally `columns` and `filter`. Filters use PostgREST syntax: `"status=eq.active"`, `"age=gt.18"`, `"name=like.*john*"`.
8
+ 2. To insert data, use `action: "insert"` with `table` and `data` (a JSON object matching the table columns).
9
+ 3. To update data, use `action: "update"` with `table`, `filter` (to select rows), and `data` (fields to update). **Always include a filter** to avoid updating all rows.
10
+ 4. To call a Postgres function, use `action: "rpc"` with `function_name` and `params`.
11
+ 5. Auth management (list/create/delete users) requires `SUPABASE_SERVICE_KEY` (the service role key, not the anon key).
12
+ 6. PostgREST filter operators: `eq`, `neq`, `gt`, `gte`, `lt`, `lte`, `like`, `ilike`, `in`, `is`, `not`.
13
+ 7. If the tool returns an error, ensure `SUPABASE_URL` and `SUPABASE_KEY` are exported. Find them in the Supabase dashboard under Settings > API.
14
+
15
+ ## Input Variables
16
+ {{input}}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Supabase automation tool.
3
+ * Provides database queries, auth management, and storage via the Supabase REST API.
4
+ */
5
+ export async function execute(params) {
6
+ const { action, ...args } = params;
7
+ const url = process.env.SUPABASE_URL;
8
+ const key = process.env.SUPABASE_KEY;
9
+
10
+ if (!url || !key) {
11
+ throw new Error('SUPABASE_URL and SUPABASE_KEY environment variables must be set. Find them in your Supabase project settings.');
12
+ }
13
+
14
+ const headers = {
15
+ 'Content-Type': 'application/json',
16
+ 'apikey': key,
17
+ 'Authorization': `Bearer ${key}`
18
+ };
19
+
20
+ async function supaFetch(method, endpoint, body = null, extraHeaders = {}) {
21
+ const fullUrl = `${url}${endpoint}`;
22
+ const options = { method, headers: { ...headers, ...extraHeaders } };
23
+ if (body) options.body = JSON.stringify(body);
24
+
25
+ const res = await fetch(fullUrl, options);
26
+ if (res.status === 204) return { success: true };
27
+
28
+ let data;
29
+ try {
30
+ data = await res.json();
31
+ } catch {
32
+ data = await res.text();
33
+ }
34
+
35
+ if (!res.ok) {
36
+ throw new Error(`Supabase API Error (${res.status}): ${JSON.stringify(data)}`);
37
+ }
38
+ return data;
39
+ }
40
+
41
+ try {
42
+ switch (action) {
43
+ // --- DATABASE (PostgREST) ---
44
+ case 'select':
45
+ // args.table, args.columns (default "*"), args.filter (PostgREST query string)
46
+ return await supaFetch('GET',
47
+ `/rest/v1/${args.table}?select=${args.columns || '*'}${args.filter ? '&' + args.filter : ''}`,
48
+ null,
49
+ { 'Range': `0-${(args.limit || 100) - 1}` }
50
+ );
51
+
52
+ case 'insert':
53
+ return await supaFetch('POST', `/rest/v1/${args.table}`, args.data, {
54
+ 'Prefer': 'return=representation'
55
+ });
56
+
57
+ case 'update':
58
+ // args.filter is required, e.g. "id=eq.123"
59
+ return await supaFetch('PATCH',
60
+ `/rest/v1/${args.table}?${args.filter}`,
61
+ args.data,
62
+ { 'Prefer': 'return=representation' }
63
+ );
64
+
65
+ case 'delete':
66
+ return await supaFetch('DELETE',
67
+ `/rest/v1/${args.table}?${args.filter}`
68
+ );
69
+
70
+ case 'rpc':
71
+ // Call a Postgres function
72
+ return await supaFetch('POST', `/rest/v1/rpc/${args.function_name}`, args.params || {});
73
+
74
+ // --- AUTH ---
75
+ case 'list_users':
76
+ return await supaFetch('GET', '/auth/v1/admin/users', null, {
77
+ 'Authorization': `Bearer ${process.env.SUPABASE_SERVICE_KEY || key}`
78
+ });
79
+
80
+ case 'create_user':
81
+ return await supaFetch('POST', '/auth/v1/admin/users', {
82
+ email: args.email,
83
+ password: args.password,
84
+ email_confirm: args.email_confirm !== false
85
+ }, {
86
+ 'Authorization': `Bearer ${process.env.SUPABASE_SERVICE_KEY || key}`
87
+ });
88
+
89
+ case 'delete_user':
90
+ return await supaFetch('DELETE', `/auth/v1/admin/users/${args.user_id}`, null, {
91
+ 'Authorization': `Bearer ${process.env.SUPABASE_SERVICE_KEY || key}`
92
+ });
93
+
94
+ // --- STORAGE ---
95
+ case 'list_buckets':
96
+ return await supaFetch('GET', '/storage/v1/bucket');
97
+
98
+ case 'create_bucket':
99
+ return await supaFetch('POST', '/storage/v1/bucket', {
100
+ name: args.bucket_name,
101
+ public: args.public || false
102
+ });
103
+
104
+ case 'list_files':
105
+ return await supaFetch('POST', `/storage/v1/object/list/${args.bucket_name}`, {
106
+ prefix: args.prefix || '',
107
+ limit: args.limit || 100
108
+ });
109
+
110
+ case 'delete_file':
111
+ return await supaFetch('DELETE', `/storage/v1/object/${args.bucket_name}/${args.path}`);
112
+
113
+ default:
114
+ throw new Error(`Unknown action: ${action}`);
115
+ }
116
+ } catch (err) {
117
+ return { error: err.message, stack: err.stack };
118
+ }
119
+ }
120
+
121
+ export const definition = {
122
+ name: 'supabase',
123
+ description: 'Interact with Supabase for database queries (PostgREST), auth user management, and storage. Requires SUPABASE_URL and SUPABASE_KEY.',
124
+ parameters: {
125
+ type: 'object',
126
+ required: ['action'],
127
+ properties: {
128
+ action: {
129
+ type: 'string',
130
+ description: 'The Supabase operation to perform',
131
+ enum: [
132
+ 'select', 'insert', 'update', 'delete', 'rpc',
133
+ 'list_users', 'create_user', 'delete_user',
134
+ 'list_buckets', 'create_bucket', 'list_files', 'delete_file'
135
+ ]
136
+ },
137
+ table: { type: 'string', description: 'Database table name' },
138
+ columns: { type: 'string', description: 'Columns to select (default: "*")' },
139
+ filter: { type: 'string', description: 'PostgREST filter string (e.g., "status=eq.active&age=gt.18")' },
140
+ data: { type: 'object', description: 'Data object for insert/update' },
141
+ function_name: { type: 'string', description: 'Postgres function name (for RPC calls)' },
142
+ params: { type: 'object', description: 'Parameters for RPC function calls' },
143
+ email: { type: 'string', description: 'Email for user creation' },
144
+ password: { type: 'string', description: 'Password for user creation' },
145
+ user_id: { type: 'string', description: 'User UUID (for deletion)' },
146
+ bucket_name: { type: 'string', description: 'Storage bucket name' },
147
+ path: { type: 'string', description: 'File path within the bucket' },
148
+ prefix: { type: 'string', description: 'File prefix filter for listing' },
149
+ public: { type: 'boolean', description: 'Whether the bucket is public' },
150
+ limit: { type: 'number', description: 'Max results to return' }
151
+ }
152
+ }
153
+ };
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "telegram",
3
+ "version": "1.0.0",
4
+ "description": "Send messages, manage groups, and interact with Telegram bots via the Bot API.",
5
+ "author": "Praveen",
6
+ "category": "Communication",
7
+ "tags": [
8
+ "telegram",
9
+ "messaging",
10
+ "bot",
11
+ "chat"
12
+ ],
13
+ "exports": {
14
+ "tools": [
15
+ "tools/telegram.js"
16
+ ],
17
+ "skills": [
18
+ "skills/telegram-manager.md"
19
+ ]
20
+ }
21
+ }
@@ -0,0 +1,14 @@
1
+ # Telegram Manager
2
+
3
+ ## Description
4
+ This skill enables you to send messages, photos, documents, polls, and manage groups via Telegram bots.
5
+
6
+ ## Instructions
7
+ 1. Messages support **HTML** formatting by default: `<b>bold</b>`, `<i>italic</i>`, `<code>code</code>`, `<a href="url">link</a>`.
8
+ 2. Chat IDs can be numeric IDs or `@username` for public groups/channels.
9
+ 3. To send a file by URL, use `action: "send_photo"` or `"send_document"` with the URL as the `photo`/`document` value.
10
+ 4. Use `action: "get_updates"` to see recent incoming messages to the bot.
11
+ 5. Requires `TELEGRAM_BOT_TOKEN` from @BotFather on Telegram.
12
+
13
+ ## Input Variables
14
+ {{input}}