@aurora-foundation/obsidian-next 0.4.8 → 0.4.10

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 (61) hide show
  1. package/dist/chunk-2JWDGXTR.js +42 -0
  2. package/dist/chunk-3UCL6RYE.js +7272 -0
  3. package/dist/chunk-3VZGPA3N.js +42 -0
  4. package/dist/chunk-3XR3GZLX.js +7809 -0
  5. package/dist/chunk-6YJSTQKN.js +7817 -0
  6. package/dist/chunk-7XFP3ZUD.js +42 -0
  7. package/dist/chunk-ASDVTRIQ.js +7805 -0
  8. package/dist/chunk-BAKREPY2.js +439 -0
  9. package/dist/chunk-BFRO5BO2.js +42 -0
  10. package/dist/chunk-CHNVBJN3.js +7272 -0
  11. package/dist/chunk-DAR45YDV.js +42 -0
  12. package/dist/chunk-FNXAI27K.js +7812 -0
  13. package/dist/chunk-HKPL675M.js +42 -0
  14. package/dist/chunk-INEXRRON.js +42 -0
  15. package/dist/chunk-ISO6GNIB.js +429 -0
  16. package/dist/chunk-MGDY5JUY.js +581 -0
  17. package/dist/chunk-OFTKVOQ2.js +7828 -0
  18. package/dist/chunk-PD4ZKYTJ.js +7838 -0
  19. package/dist/chunk-PQSPCOJ7.js +7616 -0
  20. package/dist/chunk-QSEH5NXV.js +7807 -0
  21. package/dist/chunk-RUEIA6Z5.js +42 -0
  22. package/dist/chunk-S5IDXE2L.js +42 -0
  23. package/dist/chunk-UG3HWGIO.js +42 -0
  24. package/dist/chunk-UOESII6R.js +42 -0
  25. package/dist/chunk-VWMT4HCP.js +7668 -0
  26. package/dist/chunk-YFQI44IA.js +42 -0
  27. package/dist/chunk-ZR7MEF3B.js +7605 -0
  28. package/dist/context-NI6N46WG.js +10 -0
  29. package/dist/index.js +585 -345
  30. package/dist/memory-GXW2OA2T.js +13 -0
  31. package/dist/resume-EA6ISWW2.js +15 -0
  32. package/dist/resume-EIM5FN42.js +15 -0
  33. package/dist/resume-FBVK6NAI.js +15 -0
  34. package/dist/resume-H6J5PQIA.js +15 -0
  35. package/dist/resume-JDDVTMM4.js +15 -0
  36. package/dist/resume-JFYYR7DJ.js +15 -0
  37. package/dist/resume-KGFAZY34.js +15 -0
  38. package/dist/resume-MF5TM2ZB.js +15 -0
  39. package/dist/resume-O6PLICAA.js +15 -0
  40. package/dist/resume-PZU3PWCJ.js +15 -0
  41. package/dist/resume-YD76GI2J.js +15 -0
  42. package/dist/resume-YKAKOXWV.js +15 -0
  43. package/dist/session-37MDDCWV.js +14 -0
  44. package/dist/session-56ZI3GZV.js +14 -0
  45. package/dist/session-5OFIDWGU.js +14 -0
  46. package/dist/session-7LPACLRV.js +14 -0
  47. package/dist/session-CJ6HSKDI.js +14 -0
  48. package/dist/session-CUXGN26I.js +14 -0
  49. package/dist/session-DCGNGGMV.js +14 -0
  50. package/dist/session-LEVSW6JH.js +14 -0
  51. package/dist/session-MHZAYMLC.js +14 -0
  52. package/dist/session-NNU7OW5K.js +14 -0
  53. package/dist/session-R5UG5PZR.js +14 -0
  54. package/dist/session-T64DMDAU.js +14 -0
  55. package/dist/settings-4ALCRT5S.js +8 -0
  56. package/dist/skills/defaults/clipboard.mjs +46 -0
  57. package/dist/skills/defaults/notify.mjs +36 -0
  58. package/dist/skills/defaults/open_app.mjs +53 -0
  59. package/dist/skills/defaults/speak.mjs +47 -0
  60. package/dist/skills/defaults/spotify_control.mjs +187 -0
  61. package/package.json +7 -4
@@ -0,0 +1,13 @@
1
+ import {
2
+ MemoryManager,
3
+ memory
4
+ } from "./chunk-MGDY5JUY.js";
5
+ import "./chunk-BAKREPY2.js";
6
+ import "./chunk-G3CZKGYA.js";
7
+ import "./chunk-ISO6GNIB.js";
8
+ import "./chunk-WQM6FFSD.js";
9
+ import "./chunk-R6P2E2ZQ.js";
10
+ export {
11
+ MemoryManager,
12
+ memory
13
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-INEXRRON.js";
4
+ import "./chunk-VWMT4HCP.js";
5
+ import "./chunk-BAKREPY2.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-ISO6GNIB.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-UG3HWGIO.js";
4
+ import "./chunk-6YJSTQKN.js";
5
+ import "./chunk-BAKREPY2.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-ISO6GNIB.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-HKPL675M.js";
4
+ import "./chunk-FNXAI27K.js";
5
+ import "./chunk-BAKREPY2.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-ISO6GNIB.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-3VZGPA3N.js";
4
+ import "./chunk-PQSPCOJ7.js";
5
+ import "./chunk-BAKREPY2.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-ISO6GNIB.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-DAR45YDV.js";
4
+ import "./chunk-ZR7MEF3B.js";
5
+ import "./chunk-5OKGLNQW.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-LPGNO3PK.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-YFQI44IA.js";
4
+ import "./chunk-QSEH5NXV.js";
5
+ import "./chunk-BAKREPY2.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-ISO6GNIB.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-BFRO5BO2.js";
4
+ import "./chunk-3XR3GZLX.js";
5
+ import "./chunk-BAKREPY2.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-ISO6GNIB.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-S5IDXE2L.js";
4
+ import "./chunk-ASDVTRIQ.js";
5
+ import "./chunk-BAKREPY2.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-ISO6GNIB.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-RUEIA6Z5.js";
4
+ import "./chunk-PD4ZKYTJ.js";
5
+ import "./chunk-BAKREPY2.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-ISO6GNIB.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-7XFP3ZUD.js";
4
+ import "./chunk-OFTKVOQ2.js";
5
+ import "./chunk-BAKREPY2.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-ISO6GNIB.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-UOESII6R.js";
4
+ import "./chunk-CHNVBJN3.js";
5
+ import "./chunk-5OKGLNQW.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-LPGNO3PK.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ resumeCommand
3
+ } from "./chunk-2JWDGXTR.js";
4
+ import "./chunk-3UCL6RYE.js";
5
+ import "./chunk-5OKGLNQW.js";
6
+ import "./chunk-B77K6OQZ.js";
7
+ import "./chunk-YPMJD4YE.js";
8
+ import "./chunk-G3CZKGYA.js";
9
+ import "./chunk-S6GNETVE.js";
10
+ import "./chunk-LPGNO3PK.js";
11
+ import "./chunk-WQM6FFSD.js";
12
+ import "./chunk-R6P2E2ZQ.js";
13
+ export {
14
+ resumeCommand
15
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-PD4ZKYTJ.js";
4
+ import "./chunk-BAKREPY2.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-ISO6GNIB.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-3XR3GZLX.js";
4
+ import "./chunk-BAKREPY2.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-ISO6GNIB.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-PQSPCOJ7.js";
4
+ import "./chunk-BAKREPY2.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-ISO6GNIB.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-ASDVTRIQ.js";
4
+ import "./chunk-BAKREPY2.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-ISO6GNIB.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-OFTKVOQ2.js";
4
+ import "./chunk-BAKREPY2.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-ISO6GNIB.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-QSEH5NXV.js";
4
+ import "./chunk-BAKREPY2.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-ISO6GNIB.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-CHNVBJN3.js";
4
+ import "./chunk-5OKGLNQW.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-LPGNO3PK.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-6YJSTQKN.js";
4
+ import "./chunk-BAKREPY2.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-ISO6GNIB.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-FNXAI27K.js";
4
+ import "./chunk-BAKREPY2.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-ISO6GNIB.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-VWMT4HCP.js";
4
+ import "./chunk-BAKREPY2.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-ISO6GNIB.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-3UCL6RYE.js";
4
+ import "./chunk-5OKGLNQW.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-LPGNO3PK.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ session
3
+ } from "./chunk-ZR7MEF3B.js";
4
+ import "./chunk-5OKGLNQW.js";
5
+ import "./chunk-B77K6OQZ.js";
6
+ import "./chunk-YPMJD4YE.js";
7
+ import "./chunk-G3CZKGYA.js";
8
+ import "./chunk-S6GNETVE.js";
9
+ import "./chunk-LPGNO3PK.js";
10
+ import "./chunk-WQM6FFSD.js";
11
+ import "./chunk-R6P2E2ZQ.js";
12
+ export {
13
+ session
14
+ };
@@ -0,0 +1,8 @@
1
+ import {
2
+ SettingsSchema,
3
+ settings
4
+ } from "./chunk-ISO6GNIB.js";
5
+ export {
6
+ SettingsSchema,
7
+ settings
8
+ };
@@ -0,0 +1,46 @@
1
+ export default {
2
+ name: 'clipboard',
3
+ description: 'Read from or write to the system clipboard. Useful for sharing data between the agent and other apps.',
4
+ inputSchema: {
5
+ action: {
6
+ type: 'string',
7
+ description: 'Action: read (get clipboard contents) or write (set clipboard contents)'
8
+ },
9
+ content: {
10
+ type: 'string',
11
+ description: 'Content to write to clipboard (required for write action)'
12
+ }
13
+ },
14
+ requiredParams: ['action'],
15
+
16
+ async execute(args) {
17
+ const { execSync } = await import('child_process');
18
+ const action = (args.action || '').toLowerCase().trim();
19
+
20
+ try {
21
+ if (action === 'read') {
22
+ const content = execSync('pbpaste', { encoding: 'utf-8', timeout: 5000 });
23
+ if (!content.trim()) {
24
+ return { success: true, output: '[Clipboard is empty]' };
25
+ }
26
+ const truncated = content.length > 5000
27
+ ? content.slice(0, 5000) + `\n... [truncated ${content.length - 5000} chars]`
28
+ : content;
29
+ return { success: true, output: `Clipboard contents:\n${truncated}` };
30
+ }
31
+
32
+ if (action === 'write') {
33
+ const content = args.content || '';
34
+ if (!content) {
35
+ return { success: false, error: 'No content provided for write action' };
36
+ }
37
+ execSync(`echo -n ${JSON.stringify(content)} | pbcopy`, { timeout: 5000 });
38
+ return { success: true, output: `Copied ${content.length} chars to clipboard` };
39
+ }
40
+
41
+ return { success: false, error: `Unknown action: ${action}. Use "read" or "write".` };
42
+ } catch (error) {
43
+ return { success: false, error: `Clipboard error: ${error.message}` };
44
+ }
45
+ }
46
+ };
@@ -0,0 +1,36 @@
1
+ export default {
2
+ name: 'system_notify',
3
+ description: 'Send a macOS notification to the user. Useful for alerting when long tasks complete or important events occur.',
4
+ inputSchema: {
5
+ title: {
6
+ type: 'string',
7
+ description: 'Notification title'
8
+ },
9
+ message: {
10
+ type: 'string',
11
+ description: 'Notification body text'
12
+ },
13
+ sound: {
14
+ type: 'string',
15
+ description: 'Sound name (default: "default"). Options: Basso, Blow, Bottle, Frog, Funk, Glass, Hero, Morse, Ping, Pop, Purr, Sosumi, Submarine, Tink'
16
+ }
17
+ },
18
+ requiredParams: ['title', 'message'],
19
+
20
+ async execute(args) {
21
+ const { execSync } = await import('child_process');
22
+ const title = (args.title || 'Obsidian').replace(/"/g, '\\"');
23
+ const message = (args.message || '').replace(/"/g, '\\"');
24
+ const sound = args.sound || 'default';
25
+
26
+ try {
27
+ execSync(
28
+ `osascript -e 'display notification "${message}" with title "${title}" sound name "${sound}"'`,
29
+ { timeout: 5000 }
30
+ );
31
+ return { success: true, output: `Notification sent: ${title} - ${message}` };
32
+ } catch (error) {
33
+ return { success: false, error: `Notification failed: ${error.message}` };
34
+ }
35
+ }
36
+ };
@@ -0,0 +1,53 @@
1
+ export default {
2
+ name: 'open_app',
3
+ description: 'Open applications, URLs, or files on macOS. Can open apps by name, URLs in browser, or files with their default app.',
4
+ inputSchema: {
5
+ target: {
6
+ type: 'string',
7
+ description: 'App name ("Safari"), URL ("https://github.com"), or file path ("/path/to/file.pdf")'
8
+ },
9
+ args: {
10
+ type: 'string',
11
+ description: 'Optional arguments to pass to the app (e.g. a URL to open in a specific browser)'
12
+ }
13
+ },
14
+ requiredParams: ['target'],
15
+
16
+ async execute(args) {
17
+ const { execSync } = await import('child_process');
18
+ const target = (args.target || '').trim();
19
+ const extraArgs = args.args || '';
20
+
21
+ if (!target) {
22
+ return { success: false, error: 'No target specified. Provide an app name, URL, or file path.' };
23
+ }
24
+
25
+ try {
26
+ // URL - open in default browser
27
+ if (target.startsWith('http://') || target.startsWith('https://')) {
28
+ execSync(`open "${target}"`, { timeout: 5000 });
29
+ return { success: true, output: `Opened URL: ${target}` };
30
+ }
31
+
32
+ // File path - open with default app
33
+ if (target.startsWith('/') || target.startsWith('~') || target.startsWith('./')) {
34
+ execSync(`open "${target}"`, { timeout: 5000 });
35
+ return { success: true, output: `Opened file: ${target}` };
36
+ }
37
+
38
+ // App name with optional args
39
+ if (extraArgs) {
40
+ execSync(`open -a "${target}" "${extraArgs}"`, { timeout: 5000 });
41
+ return { success: true, output: `Opened ${target} with: ${extraArgs}` };
42
+ }
43
+
44
+ execSync(`open -a "${target}"`, { timeout: 5000 });
45
+ return { success: true, output: `Opened application: ${target}` };
46
+ } catch (error) {
47
+ return {
48
+ success: false,
49
+ error: `Failed to open "${target}": ${error.message}`
50
+ };
51
+ }
52
+ }
53
+ };
@@ -0,0 +1,47 @@
1
+ export default {
2
+ name: 'speak',
3
+ description: 'Speak text aloud using macOS text-to-speech (say command). Useful for notifications, alerts, or reading content to the user.',
4
+ inputSchema: {
5
+ text: {
6
+ type: 'string',
7
+ description: 'Text to speak aloud'
8
+ },
9
+ voice: {
10
+ type: 'string',
11
+ description: 'Voice name (default: system default). Options: Alex, Samantha, Daniel, Karen, Moira, Tessa, Veena'
12
+ },
13
+ rate: {
14
+ type: 'number',
15
+ description: 'Speech rate in words per minute (default: 200, range: 100-400)'
16
+ }
17
+ },
18
+ requiredParams: ['text'],
19
+
20
+ async execute(args) {
21
+ const { exec } = await import('child_process');
22
+ const { promisify } = await import('util');
23
+ const execAsync = promisify(exec);
24
+
25
+ const text = (args.text || '').replace(/'/g, "'\\''"); // Escape single quotes
26
+ const voice = args.voice || '';
27
+ const rate = Math.max(100, Math.min(400, parseInt(args.rate) || 200));
28
+
29
+ if (!text.trim()) {
30
+ return { success: false, error: 'No text provided to speak' };
31
+ }
32
+
33
+ try {
34
+ let cmd = `say -r ${rate}`;
35
+ if (voice) cmd += ` -v "${voice}"`;
36
+ cmd += ` '${text}'`;
37
+
38
+ await execAsync(cmd, { timeout: 30000 });
39
+ return { success: true, output: `Spoke: "${text.slice(0, 100)}${text.length > 100 ? '...' : ''}"` };
40
+ } catch (error) {
41
+ return {
42
+ success: false,
43
+ error: `Speech failed: ${error.message}`
44
+ };
45
+ }
46
+ }
47
+ };