@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,123 @@
1
+ /**
2
+ * MongoDB automation tool.
3
+ * Uses the MongoDB Atlas Data API for zero-dependency database operations.
4
+ */
5
+ export async function execute(params) {
6
+ const { action, ...args } = params;
7
+ const apiKey = process.env.MONGODB_API_KEY;
8
+ const appId = process.env.MONGODB_APP_ID;
9
+ const cluster = args.cluster || process.env.MONGODB_CLUSTER || 'Cluster0';
10
+ const database = args.database || process.env.MONGODB_DATABASE;
11
+
12
+ if (!apiKey || !appId) {
13
+ throw new Error('MONGODB_API_KEY and MONGODB_APP_ID are required. Enable the Data API at https://cloud.mongodb.com');
14
+ }
15
+
16
+ async function mongoFetch(endpoint, body) {
17
+ const url = `https://data.mongodb-api.com/app/${appId}/endpoint/data/v1/action/${endpoint}`;
18
+ const res = await fetch(url, {
19
+ method: 'POST',
20
+ headers: {
21
+ 'Content-Type': 'application/json',
22
+ 'api-key': apiKey
23
+ },
24
+ body: JSON.stringify({
25
+ dataSource: cluster,
26
+ database: database,
27
+ collection: args.collection,
28
+ ...body
29
+ })
30
+ });
31
+
32
+ const data = await res.json();
33
+ if (!res.ok) throw new Error(`MongoDB API Error: ${JSON.stringify(data)}`);
34
+ return data;
35
+ }
36
+
37
+ try {
38
+ switch (action) {
39
+ case 'find':
40
+ return await mongoFetch('find', {
41
+ filter: args.filter || {},
42
+ projection: args.projection,
43
+ sort: args.sort,
44
+ limit: args.limit || 20
45
+ });
46
+
47
+ case 'find_one':
48
+ return await mongoFetch('findOne', {
49
+ filter: args.filter || {}
50
+ });
51
+
52
+ case 'insert_one':
53
+ return await mongoFetch('insertOne', {
54
+ document: args.document
55
+ });
56
+
57
+ case 'insert_many':
58
+ return await mongoFetch('insertMany', {
59
+ documents: args.documents
60
+ });
61
+
62
+ case 'update_one':
63
+ return await mongoFetch('updateOne', {
64
+ filter: args.filter,
65
+ update: args.update,
66
+ upsert: args.upsert || false
67
+ });
68
+
69
+ case 'update_many':
70
+ return await mongoFetch('updateMany', {
71
+ filter: args.filter,
72
+ update: args.update
73
+ });
74
+
75
+ case 'delete_one':
76
+ return await mongoFetch('deleteOne', {
77
+ filter: args.filter
78
+ });
79
+
80
+ case 'delete_many':
81
+ return await mongoFetch('deleteMany', {
82
+ filter: args.filter
83
+ });
84
+
85
+ case 'aggregate':
86
+ return await mongoFetch('aggregate', {
87
+ pipeline: args.pipeline
88
+ });
89
+
90
+ default:
91
+ throw new Error(`Unknown action: ${action}`);
92
+ }
93
+ } catch (err) {
94
+ return { error: err.message, stack: err.stack };
95
+ }
96
+ }
97
+
98
+ export const definition = {
99
+ name: 'mongodb',
100
+ description: 'Query and manage MongoDB collections via the Atlas Data API. Requires MONGODB_API_KEY and MONGODB_APP_ID.',
101
+ parameters: {
102
+ type: 'object',
103
+ required: ['action'],
104
+ properties: {
105
+ action: {
106
+ type: 'string',
107
+ enum: ['find', 'find_one', 'insert_one', 'insert_many', 'update_one', 'update_many', 'delete_one', 'delete_many', 'aggregate']
108
+ },
109
+ collection: { type: 'string', description: 'Collection name' },
110
+ database: { type: 'string', description: 'Database name (override MONGODB_DATABASE)' },
111
+ cluster: { type: 'string', description: 'Cluster name (default: Cluster0)' },
112
+ filter: { type: 'object', description: 'MongoDB filter object (e.g., {"status": "active"})' },
113
+ document: { type: 'object', description: 'Document to insert' },
114
+ documents: { type: 'array', description: 'Array of documents to insert' },
115
+ update: { type: 'object', description: 'Update operations (e.g., {"$set": {"name": "new"}})' },
116
+ projection: { type: 'object', description: 'Fields to include/exclude' },
117
+ sort: { type: 'object', description: 'Sort order (e.g., {"createdAt": -1})' },
118
+ pipeline: { type: 'array', description: 'Aggregation pipeline stages' },
119
+ upsert: { type: 'boolean', description: 'Insert if no match found' },
120
+ limit: { type: 'number', description: 'Max documents to return' }
121
+ }
122
+ }
123
+ };
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "notion",
3
+ "version": "1.0.0",
4
+ "description": "Create and manage Notion pages, databases, and blocks for project documentation and knowledge management.",
5
+ "author": "Praveen",
6
+ "category": "Productivity",
7
+ "tags": [
8
+ "notion",
9
+ "docs",
10
+ "wiki",
11
+ "project-management",
12
+ "knowledge-base"
13
+ ],
14
+ "exports": {
15
+ "tools": [
16
+ "tools/notion.js"
17
+ ],
18
+ "skills": [
19
+ "skills/notion-manager.md"
20
+ ]
21
+ }
22
+ }
@@ -0,0 +1,16 @@
1
+ # Notion Manager
2
+
3
+ ## Description
4
+ This skill enables you to create and manage Notion pages, query databases, manage content blocks, and search across a Notion workspace.
5
+
6
+ ## Instructions
7
+ 1. When asked to create a Notion page, use the `notion` tool with `action: "create_page"`. Provide either a `database_id` (to add a row to a database) or `parent_page_id` (to create a sub-page).
8
+ 2. For simple pages, just provide `title` and `content`. For database entries, construct a `properties` object matching the database schema.
9
+ 3. To query a Notion database, use `action: "query_database"` with the `database_id`. Use `filter` for conditions (e.g., `{ "property": "Status", "select": { "equals": "Done" } }`) and `sorts` for ordering.
10
+ 4. To add content to an existing page, use `action: "append_blocks"` with the `page_id` and either plain `content` text or structured `children` blocks.
11
+ 5. Use `action: "search"` to find pages and databases across the workspace. The query searches titles and content.
12
+ 6. Notion IDs are UUIDs (32 hex chars). They appear in page URLs after the workspace name: `notion.so/workspace/Page-Title-<ID>`.
13
+ 7. If the tool returns an authentication error, the user needs to export `NOTION_API_KEY`. They must also share target pages/databases with the integration.
14
+
15
+ ## Input Variables
16
+ {{input}}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Notion automation tool.
3
+ * Provides page/database CRUD via the Notion API (2022-06-28).
4
+ */
5
+ export async function execute(params) {
6
+ const { action, ...args } = params;
7
+ const token = process.env.NOTION_API_KEY;
8
+
9
+ if (!token) {
10
+ throw new Error('NOTION_API_KEY environment variable is not set. Create an integration at https://www.notion.so/my-integrations');
11
+ }
12
+
13
+ const headers = {
14
+ 'Content-Type': 'application/json',
15
+ 'Authorization': `Bearer ${token}`,
16
+ 'Notion-Version': '2022-06-28'
17
+ };
18
+
19
+ async function notionFetch(method, endpoint, body = null) {
20
+ const url = `https://api.notion.com/v1${endpoint}`;
21
+ const options = { method, headers };
22
+ if (body) options.body = JSON.stringify(body);
23
+
24
+ const res = await fetch(url, options);
25
+ const data = await res.json();
26
+
27
+ if (!res.ok) {
28
+ throw new Error(`Notion API Error (${res.status}): ${data.message || JSON.stringify(data)}`);
29
+ }
30
+ return data;
31
+ }
32
+
33
+ /** Helper to build rich text array from plain string */
34
+ function richText(text) {
35
+ return [{ type: 'text', text: { content: text } }];
36
+ }
37
+
38
+ try {
39
+ switch (action) {
40
+ // --- PAGES ---
41
+ case 'create_page':
42
+ return await notionFetch('POST', '/pages', {
43
+ parent: args.database_id
44
+ ? { database_id: args.database_id }
45
+ : { page_id: args.parent_page_id },
46
+ properties: args.properties || {
47
+ title: { title: richText(args.title || 'Untitled') }
48
+ },
49
+ children: args.children || (args.content ? [
50
+ {
51
+ object: 'block',
52
+ type: 'paragraph',
53
+ paragraph: { rich_text: richText(args.content) }
54
+ }
55
+ ] : [])
56
+ });
57
+
58
+ case 'update_page':
59
+ return await notionFetch('PATCH', `/pages/${args.page_id}`, {
60
+ properties: args.properties || {}
61
+ });
62
+
63
+ case 'get_page':
64
+ return await notionFetch('GET', `/pages/${args.page_id}`);
65
+
66
+ case 'archive_page':
67
+ return await notionFetch('PATCH', `/pages/${args.page_id}`, {
68
+ archived: true
69
+ });
70
+
71
+ // --- BLOCKS (Page Content) ---
72
+ case 'get_blocks':
73
+ return await notionFetch('GET', `/blocks/${args.block_id || args.page_id}/children?page_size=${args.page_size || 100}`);
74
+
75
+ case 'append_blocks':
76
+ return await notionFetch('PATCH', `/blocks/${args.page_id}/children`, {
77
+ children: args.children || [
78
+ {
79
+ object: 'block',
80
+ type: 'paragraph',
81
+ paragraph: { rich_text: richText(args.content || '') }
82
+ }
83
+ ]
84
+ });
85
+
86
+ case 'delete_block':
87
+ return await notionFetch('DELETE', `/blocks/${args.block_id}`);
88
+
89
+ // --- DATABASES ---
90
+ case 'query_database':
91
+ return await notionFetch('POST', `/databases/${args.database_id}/query`, {
92
+ filter: args.filter || undefined,
93
+ sorts: args.sorts || undefined,
94
+ page_size: args.page_size || 100
95
+ });
96
+
97
+ case 'create_database':
98
+ return await notionFetch('POST', '/databases', {
99
+ parent: { page_id: args.parent_page_id },
100
+ title: richText(args.title || 'New Database'),
101
+ properties: args.properties || {
102
+ Name: { title: {} }
103
+ }
104
+ });
105
+
106
+ // --- SEARCH ---
107
+ case 'search':
108
+ return await notionFetch('POST', '/search', {
109
+ query: args.query || '',
110
+ filter: args.filter || undefined,
111
+ sort: args.sort || { direction: 'descending', timestamp: 'last_edited_time' },
112
+ page_size: args.page_size || 20
113
+ });
114
+
115
+ // --- USERS ---
116
+ case 'list_users':
117
+ return await notionFetch('GET', '/users');
118
+
119
+ default:
120
+ throw new Error(`Unknown action: ${action}`);
121
+ }
122
+ } catch (err) {
123
+ return { error: err.message, stack: err.stack };
124
+ }
125
+ }
126
+
127
+ export const definition = {
128
+ name: 'notion',
129
+ description: 'Interact with Notion to create/update pages, query databases, manage blocks, and search workspace content. Requires NOTION_API_KEY.',
130
+ parameters: {
131
+ type: 'object',
132
+ required: ['action'],
133
+ properties: {
134
+ action: {
135
+ type: 'string',
136
+ description: 'The Notion operation to perform',
137
+ enum: [
138
+ 'create_page', 'update_page', 'get_page', 'archive_page',
139
+ 'get_blocks', 'append_blocks', 'delete_block',
140
+ 'query_database', 'create_database',
141
+ 'search', 'list_users'
142
+ ]
143
+ },
144
+ page_id: { type: 'string', description: 'Notion page ID' },
145
+ parent_page_id: { type: 'string', description: 'Parent page ID (for creating sub-pages or databases)' },
146
+ database_id: { type: 'string', description: 'Notion database ID' },
147
+ block_id: { type: 'string', description: 'Notion block ID' },
148
+ title: { type: 'string', description: 'Title for pages or databases' },
149
+ content: { type: 'string', description: 'Text content to add as a paragraph block' },
150
+ properties: { type: 'object', description: 'Notion properties object (for pages or databases)' },
151
+ children: { type: 'array', description: 'Array of Notion block objects to add' },
152
+ filter: { type: 'object', description: 'Notion filter object (for database queries or search)' },
153
+ sorts: { type: 'array', description: 'Notion sorts array (for database queries)' },
154
+ query: { type: 'string', description: 'Search query text' },
155
+ page_size: { type: 'number', description: 'Max results per page (default: 100)' }
156
+ }
157
+ }
158
+ };
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "openai",
3
+ "version": "1.0.0",
4
+ "description": "Direct access to OpenAI APIs: GPT chat, DALL-E image generation, Whisper transcription, and TTS.",
5
+ "author": "Praveen",
6
+ "category": "AI & Specialized",
7
+ "tags": [
8
+ "openai",
9
+ "gpt",
10
+ "dalle",
11
+ "whisper",
12
+ "tts",
13
+ "ai"
14
+ ],
15
+ "exports": {
16
+ "tools": [
17
+ "tools/openai.js"
18
+ ],
19
+ "skills": [
20
+ "skills/openai-manager.md"
21
+ ]
22
+ }
23
+ }
@@ -0,0 +1,15 @@
1
+ # OpenAI Manager
2
+
3
+ ## Description
4
+ This skill gives you direct access to OpenAI's APIs for chat completions, image generation, speech transcription, text-to-speech, and embeddings.
5
+
6
+ ## Instructions
7
+ 1. For chat completions, use `action: "chat"` with either a simple `prompt` string or a full `messages` array for multi-turn conversations.
8
+ 2. For image generation, use `action: "generate_image"` with a descriptive `prompt`. DALL-E 3 supports sizes: `1024x1024`, `1792x1024` (landscape), `1024x1792` (portrait).
9
+ 3. For text-to-speech, use `action: "text_to_speech"` with `input` text and a `voice` (alloy, echo, fable, onyx, nova, shimmer).
10
+ 4. Use `json_mode: true` in chat to force the model to return valid JSON. Useful for structured data extraction.
11
+ 5. For embeddings, use `action: "embed"` with `input` text. Returns a vector for semantic search.
12
+ 6. If the tool returns an auth error, the user needs to export `OPENAI_API_KEY` from https://platform.openai.com/api-keys.
13
+
14
+ ## Input Variables
15
+ {{input}}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * OpenAI automation tool.
3
+ * Provides direct access to GPT chat completions, DALL-E, Whisper, and TTS via the OpenAI REST API.
4
+ */
5
+ export async function execute(params) {
6
+ const { action, ...args } = params;
7
+ const apiKey = process.env.OPENAI_API_KEY;
8
+
9
+ if (!apiKey) {
10
+ throw new Error('OPENAI_API_KEY environment variable is not set. Get one at https://platform.openai.com/api-keys');
11
+ }
12
+
13
+ const headers = {
14
+ 'Content-Type': 'application/json',
15
+ 'Authorization': `Bearer ${apiKey}`
16
+ };
17
+
18
+ async function oaiFetch(method, endpoint, body = null, isFormData = false) {
19
+ const url = `https://api.openai.com/v1${endpoint}`;
20
+ const options = { method };
21
+ if (isFormData) {
22
+ options.headers = { 'Authorization': `Bearer ${apiKey}` };
23
+ options.body = body; // FormData
24
+ } else {
25
+ options.headers = headers;
26
+ if (body) options.body = JSON.stringify(body);
27
+ }
28
+
29
+ const res = await fetch(url, options);
30
+ const contentType = res.headers.get('content-type') || '';
31
+
32
+ if (contentType.includes('audio')) {
33
+ // TTS returns audio bytes
34
+ const buffer = await res.arrayBuffer();
35
+ return { success: true, audioBytes: buffer.byteLength, note: 'Audio data returned (write to file to play)' };
36
+ }
37
+
38
+ const data = await res.json();
39
+ if (!res.ok) {
40
+ throw new Error(`OpenAI API Error: ${data.error?.message || JSON.stringify(data)}`);
41
+ }
42
+ return data;
43
+ }
44
+
45
+ try {
46
+ switch (action) {
47
+ // --- CHAT COMPLETIONS ---
48
+ case 'chat':
49
+ return await oaiFetch('POST', '/chat/completions', {
50
+ model: args.model || 'gpt-4o-mini',
51
+ messages: args.messages || [{ role: 'user', content: args.prompt }],
52
+ temperature: args.temperature ?? 0.7,
53
+ max_tokens: args.max_tokens || 1024,
54
+ response_format: args.json_mode ? { type: 'json_object' } : undefined
55
+ });
56
+
57
+ // --- IMAGE GENERATION (DALL-E) ---
58
+ case 'generate_image':
59
+ return await oaiFetch('POST', '/images/generations', {
60
+ model: args.model || 'dall-e-3',
61
+ prompt: args.prompt,
62
+ n: args.n || 1,
63
+ size: args.size || '1024x1024',
64
+ quality: args.quality || 'standard',
65
+ style: args.style || 'vivid'
66
+ });
67
+
68
+ // --- SPEECH TO TEXT (WHISPER) ---
69
+ case 'transcribe': {
70
+ // Note: requires audio file content — in practice the agent would
71
+ // read a file and pass its path for the host to handle
72
+ return await oaiFetch('POST', '/audio/transcriptions', {
73
+ model: 'whisper-1',
74
+ file: args.file,
75
+ language: args.language
76
+ });
77
+ }
78
+
79
+ // --- TEXT TO SPEECH ---
80
+ case 'text_to_speech':
81
+ return await oaiFetch('POST', '/audio/speech', {
82
+ model: args.model || 'tts-1',
83
+ input: args.input || args.text,
84
+ voice: args.voice || 'alloy',
85
+ response_format: args.format || 'mp3'
86
+ });
87
+
88
+ // --- EMBEDDINGS ---
89
+ case 'embed':
90
+ return await oaiFetch('POST', '/embeddings', {
91
+ model: args.model || 'text-embedding-3-small',
92
+ input: args.input || args.text
93
+ });
94
+
95
+ // --- MODELS ---
96
+ case 'list_models':
97
+ return await oaiFetch('GET', '/models');
98
+
99
+ default:
100
+ throw new Error(`Unknown action: ${action}`);
101
+ }
102
+ } catch (err) {
103
+ return { error: err.message, stack: err.stack };
104
+ }
105
+ }
106
+
107
+ export const definition = {
108
+ name: 'openai',
109
+ description: 'Direct access to OpenAI APIs: GPT chat, DALL-E image generation, Whisper transcription, TTS, and embeddings. Requires OPENAI_API_KEY.',
110
+ parameters: {
111
+ type: 'object',
112
+ required: ['action'],
113
+ properties: {
114
+ action: {
115
+ type: 'string',
116
+ description: 'The OpenAI operation to perform',
117
+ enum: ['chat', 'generate_image', 'transcribe', 'text_to_speech', 'embed', 'list_models']
118
+ },
119
+ prompt: { type: 'string', description: 'Text prompt for chat or image generation' },
120
+ messages: { type: 'array', description: 'Array of chat messages [{role, content}]' },
121
+ model: { type: 'string', description: 'Model to use (gpt-4o, gpt-4o-mini, dall-e-3, tts-1, whisper-1)' },
122
+ temperature: { type: 'number', description: 'Creativity (0-2, default 0.7)' },
123
+ max_tokens: { type: 'number', description: 'Max output tokens (default 1024)' },
124
+ json_mode: { type: 'boolean', description: 'Enable JSON response format for chat' },
125
+ n: { type: 'number', description: 'Number of images to generate (DALL-E)' },
126
+ size: { type: 'string', description: 'Image size: 1024x1024, 1792x1024, 1024x1792' },
127
+ quality: { type: 'string', description: 'Image quality: standard or hd' },
128
+ style: { type: 'string', description: 'Image style: vivid or natural' },
129
+ input: { type: 'string', description: 'Text input for TTS or embeddings' },
130
+ text: { type: 'string', description: 'Alias for input/prompt' },
131
+ voice: { type: 'string', description: 'TTS voice: alloy, echo, fable, onyx, nova, shimmer' },
132
+ format: { type: 'string', description: 'Audio format: mp3, opus, aac, flac' },
133
+ file: { type: 'string', description: 'Audio file path for transcription' },
134
+ language: { type: 'string', description: 'Language code for transcription (e.g., en, es)' }
135
+ }
136
+ }
137
+ };
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "resend",
3
+ "version": "1.0.0",
4
+ "description": "Send transactional and marketing emails via the Resend API.",
5
+ "author": "Praveen",
6
+ "category": "Communication",
7
+ "tags": [
8
+ "resend",
9
+ "email",
10
+ "smtp",
11
+ "transactional"
12
+ ],
13
+ "exports": {
14
+ "tools": [
15
+ "tools/resend.js"
16
+ ],
17
+ "skills": [
18
+ "skills/resend-manager.md"
19
+ ]
20
+ }
21
+ }
@@ -0,0 +1,15 @@
1
+ # Resend Manager
2
+
3
+ ## Description
4
+ This skill enables you to send transactional and marketing emails, manage domains, and track delivery via Resend.
5
+
6
+ ## Instructions
7
+ 1. To send an email, use `action: "send_email"` with `from`, `to`, `subject`, and either `html` or `text`.
8
+ 2. The `from` field must use a verified domain (e.g., `"Agent <noreply@yourdomain.com>"`). For testing, use `onboarding@resend.dev`.
9
+ 3. For batch sending, use `action: "send_batch"` with `emails` as an array of email objects.
10
+ 4. Use `action: "get_email"` with `email_id` to check delivery status of a sent email.
11
+ 5. Before using a custom domain, add it with `add_domain` then verify with `verify_domain`.
12
+ 6. Requires `RESEND_API_KEY` from https://resend.com/api-keys.
13
+
14
+ ## Input Variables
15
+ {{input}}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Resend email automation tool.
3
+ * Modern email API for transactional and marketing emails.
4
+ */
5
+ export async function execute(params) {
6
+ const { action, ...args } = params;
7
+ const apiKey = process.env.RESEND_API_KEY;
8
+
9
+ if (!apiKey) {
10
+ throw new Error('RESEND_API_KEY environment variable is not set. Get one at https://resend.com/api-keys');
11
+ }
12
+
13
+ const headers = {
14
+ 'Content-Type': 'application/json',
15
+ 'Authorization': `Bearer ${apiKey}`
16
+ };
17
+
18
+ async function resendFetch(method, endpoint, body = null) {
19
+ const url = `https://api.resend.com${endpoint}`;
20
+ const options = { method, headers };
21
+ if (body) options.body = JSON.stringify(body);
22
+
23
+ const res = await fetch(url, options);
24
+ if (res.status === 204) return { success: true };
25
+ const data = await res.json();
26
+ if (!res.ok) throw new Error(`Resend API Error: ${JSON.stringify(data)}`);
27
+ return data;
28
+ }
29
+
30
+ try {
31
+ switch (action) {
32
+ case 'send_email':
33
+ return await resendFetch('POST', '/emails', {
34
+ from: args.from,
35
+ to: Array.isArray(args.to) ? args.to : [args.to],
36
+ subject: args.subject,
37
+ html: args.html,
38
+ text: args.text,
39
+ cc: args.cc,
40
+ bcc: args.bcc,
41
+ reply_to: args.reply_to,
42
+ tags: args.tags
43
+ });
44
+
45
+ case 'send_batch':
46
+ return await resendFetch('POST', '/emails/batch', args.emails);
47
+
48
+ case 'get_email':
49
+ return await resendFetch('GET', `/emails/${args.email_id}`);
50
+
51
+ case 'list_domains':
52
+ return await resendFetch('GET', '/domains');
53
+
54
+ case 'add_domain':
55
+ return await resendFetch('POST', '/domains', {
56
+ name: args.domain
57
+ });
58
+
59
+ case 'verify_domain':
60
+ return await resendFetch('POST', `/domains/${args.domain_id}/verify`);
61
+
62
+ case 'delete_domain':
63
+ return await resendFetch('DELETE', `/domains/${args.domain_id}`);
64
+
65
+ case 'list_api_keys':
66
+ return await resendFetch('GET', '/api-keys');
67
+
68
+ default:
69
+ throw new Error(`Unknown action: ${action}`);
70
+ }
71
+ } catch (err) {
72
+ return { error: err.message, stack: err.stack };
73
+ }
74
+ }
75
+
76
+ export const definition = {
77
+ name: 'resend',
78
+ description: 'Send emails, manage domains, and track delivery via the Resend API. Requires RESEND_API_KEY.',
79
+ parameters: {
80
+ type: 'object',
81
+ required: ['action'],
82
+ properties: {
83
+ action: {
84
+ type: 'string',
85
+ enum: ['send_email', 'send_batch', 'get_email', 'list_domains', 'add_domain', 'verify_domain', 'delete_domain', 'list_api_keys']
86
+ },
87
+ from: { type: 'string', description: 'Sender email (e.g., "Acme <noreply@acme.com>")' },
88
+ to: { type: 'string', description: 'Recipient email(s) — string or array' },
89
+ subject: { type: 'string', description: 'Email subject line' },
90
+ html: { type: 'string', description: 'HTML email body' },
91
+ text: { type: 'string', description: 'Plain text email body' },
92
+ cc: { type: 'array', items: { type: 'string' }, description: 'CC recipients' },
93
+ bcc: { type: 'array', items: { type: 'string' }, description: 'BCC recipients' },
94
+ reply_to: { type: 'string', description: 'Reply-to address' },
95
+ tags: { type: 'array', description: 'Email tags for tracking [{name, value}]' },
96
+ emails: { type: 'array', description: 'Array of email objects for batch send' },
97
+ email_id: { type: 'string', description: 'Email ID for status lookup' },
98
+ domain: { type: 'string', description: 'Domain name to add' },
99
+ domain_id: { type: 'string', description: 'Domain ID for verification/deletion' }
100
+ }
101
+ }
102
+ };
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "slack",
3
+ "version": "1.0.0",
4
+ "description": "Send messages, manage channels, search history, and upload files to Slack workspaces.",
5
+ "author": "Praveen",
6
+ "category": "Communication",
7
+ "tags": [
8
+ "slack",
9
+ "messaging",
10
+ "chat",
11
+ "notifications",
12
+ "team"
13
+ ],
14
+ "exports": {
15
+ "tools": [
16
+ "tools/slack.js"
17
+ ],
18
+ "skills": [
19
+ "skills/slack-manager.md"
20
+ ]
21
+ }
22
+ }