@heznpc/imcp 0.1.0 → 0.6.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.
- package/LICENSE +21 -0
- package/README.ko.md +225 -57
- package/README.md +222 -30
- package/dist/calendar/prompts.d.ts +2 -0
- package/dist/calendar/prompts.js +43 -0
- package/dist/calendar/prompts.js.map +1 -0
- package/dist/calendar/scripts.d.ts +20 -0
- package/dist/calendar/scripts.js +283 -0
- package/dist/calendar/scripts.js.map +1 -0
- package/dist/calendar/tools.d.ts +3 -0
- package/dist/calendar/tools.js +252 -0
- package/dist/calendar/tools.js.map +1 -0
- package/dist/contacts/scripts.d.ts +22 -0
- package/dist/contacts/scripts.js +220 -0
- package/dist/contacts/scripts.js.map +1 -0
- package/dist/contacts/tools.d.ts +3 -0
- package/dist/contacts/tools.js +173 -0
- package/dist/contacts/tools.js.map +1 -0
- package/dist/cross/prompts.d.ts +2 -0
- package/dist/cross/prompts.js +177 -0
- package/dist/cross/prompts.js.map +1 -0
- package/dist/finder/scripts.d.ts +8 -0
- package/dist/finder/scripts.js +127 -0
- package/dist/finder/scripts.js.map +1 -0
- package/dist/finder/tools.d.ts +3 -0
- package/dist/finder/tools.js +134 -0
- package/dist/finder/tools.js.map +1 -0
- package/dist/index.js +38 -1
- package/dist/index.js.map +1 -1
- package/dist/intelligence/tools.d.ts +3 -0
- package/dist/intelligence/tools.js +74 -0
- package/dist/intelligence/tools.js.map +1 -0
- package/dist/mail/scripts.d.ts +9 -0
- package/dist/mail/scripts.js +214 -0
- package/dist/mail/scripts.js.map +1 -0
- package/dist/mail/tools.d.ts +3 -0
- package/dist/mail/tools.js +145 -0
- package/dist/mail/tools.js.map +1 -0
- package/dist/music/scripts.d.ts +9 -0
- package/dist/music/scripts.js +180 -0
- package/dist/music/scripts.js.map +1 -0
- package/dist/music/tools.d.ts +3 -0
- package/dist/music/tools.js +143 -0
- package/dist/music/tools.js.map +1 -0
- package/dist/notes/prompts.js +1 -6
- package/dist/notes/prompts.js.map +1 -1
- package/dist/notes/scripts.js +1 -11
- package/dist/notes/scripts.js.map +1 -1
- package/dist/notes/tools.js +1 -11
- package/dist/notes/tools.js.map +1 -1
- package/dist/photos/scripts.d.ts +7 -0
- package/dist/photos/scripts.js +142 -0
- package/dist/photos/scripts.js.map +1 -0
- package/dist/photos/tools.d.ts +3 -0
- package/dist/photos/tools.js +158 -0
- package/dist/photos/tools.js.map +1 -0
- package/dist/reminders/prompts.d.ts +2 -0
- package/dist/reminders/prompts.js +40 -0
- package/dist/reminders/prompts.js.map +1 -0
- package/dist/reminders/scripts.d.ts +21 -0
- package/dist/reminders/scripts.js +202 -0
- package/dist/reminders/scripts.js.map +1 -0
- package/dist/reminders/tools.d.ts +3 -0
- package/dist/reminders/tools.js +267 -0
- package/dist/reminders/tools.js.map +1 -0
- package/dist/safari/scripts.d.ts +8 -0
- package/dist/safari/scripts.js +120 -0
- package/dist/safari/scripts.js.map +1 -0
- package/dist/safari/tools.d.ts +3 -0
- package/dist/safari/tools.js +129 -0
- package/dist/safari/tools.js.map +1 -0
- package/dist/shared/esc.d.ts +10 -0
- package/dist/shared/esc.js +35 -0
- package/dist/shared/esc.js.map +1 -0
- package/dist/shared/jxa.js +1 -1
- package/dist/shared/jxa.js.map +1 -1
- package/dist/shared/prompt.d.ts +11 -0
- package/dist/shared/prompt.js +8 -0
- package/dist/shared/prompt.js.map +1 -0
- package/dist/shared/resources.d.ts +5 -0
- package/dist/shared/resources.js +81 -0
- package/dist/shared/resources.js.map +1 -0
- package/dist/shared/result.d.ts +15 -0
- package/dist/shared/result.js +14 -0
- package/dist/shared/result.js.map +1 -0
- package/dist/shared/setup.d.ts +2 -0
- package/dist/shared/setup.js +44 -0
- package/dist/shared/setup.js.map +1 -0
- package/dist/shared/swift.d.ts +2 -0
- package/dist/shared/swift.js +73 -0
- package/dist/shared/swift.js.map +1 -0
- package/dist/shortcuts/scripts.d.ts +4 -0
- package/dist/shortcuts/scripts.js +47 -0
- package/dist/shortcuts/scripts.js.map +1 -0
- package/dist/shortcuts/tools.d.ts +3 -0
- package/dist/shortcuts/tools.js +66 -0
- package/dist/shortcuts/tools.js.map +1 -0
- package/dist/system/scripts.d.ts +9 -0
- package/dist/system/scripts.js +124 -0
- package/dist/system/scripts.js.map +1 -0
- package/dist/system/tools.d.ts +3 -0
- package/dist/system/tools.js +179 -0
- package/dist/system/tools.js.map +1 -0
- package/package.json +39 -5
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// JXA scripts for Finder automation (file search, tags, info).
|
|
2
|
+
import { esc, escJxaShell } from "../shared/esc.js";
|
|
3
|
+
export function searchFilesScript(folder, query, limit) {
|
|
4
|
+
return `
|
|
5
|
+
const app = Application.currentApplication();
|
|
6
|
+
app.includeStandardAdditions = true;
|
|
7
|
+
const results = app.doShellScript('mdfind -onlyin "${escJxaShell(folder)}" "${escJxaShell(query)}" | head -${limit}');
|
|
8
|
+
const paths = results.split('\\n').filter(p => p.length > 0);
|
|
9
|
+
const Finder = Application('Finder');
|
|
10
|
+
const result = paths.map(p => {
|
|
11
|
+
try {
|
|
12
|
+
const item = Finder.items.whose({url: 'file://' + encodeURI(p)})()[0];
|
|
13
|
+
if (!item) return {path: p, name: p.split('/').pop()};
|
|
14
|
+
return {
|
|
15
|
+
path: p,
|
|
16
|
+
name: item.name(),
|
|
17
|
+
kind: item.kind(),
|
|
18
|
+
size: item.size(),
|
|
19
|
+
modificationDate: item.modificationDate().toISOString()
|
|
20
|
+
};
|
|
21
|
+
} catch(e) {
|
|
22
|
+
return {path: p, name: p.split('/').pop()};
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
JSON.stringify({total: paths.length, files: result});
|
|
26
|
+
`;
|
|
27
|
+
}
|
|
28
|
+
export function getFileInfoScript(path) {
|
|
29
|
+
return `
|
|
30
|
+
const app = Application.currentApplication();
|
|
31
|
+
app.includeStandardAdditions = true;
|
|
32
|
+
const Finder = Application('Finder');
|
|
33
|
+
const posixFile = Path('${esc(path)}');
|
|
34
|
+
const item = Finder.items[posixFile.toString()];
|
|
35
|
+
const tags = (function() {
|
|
36
|
+
try {
|
|
37
|
+
const output = app.doShellScript('mdls -name kMDItemUserTags -raw "${escJxaShell(path)}"');
|
|
38
|
+
if (output.includes('null')) return [];
|
|
39
|
+
return output.replace(/[()\\n\\t]/g, '').split(',').map(t => t.trim().replace(/"/g, '')).filter(t => t);
|
|
40
|
+
} catch(e) { return []; }
|
|
41
|
+
})();
|
|
42
|
+
JSON.stringify({
|
|
43
|
+
path: '${esc(path)}',
|
|
44
|
+
name: item.name(),
|
|
45
|
+
kind: item.kind(),
|
|
46
|
+
size: item.size(),
|
|
47
|
+
creationDate: item.creationDate().toISOString(),
|
|
48
|
+
modificationDate: item.modificationDate().toISOString(),
|
|
49
|
+
tags: tags
|
|
50
|
+
});
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
export function setTagsScript(path, tags) {
|
|
54
|
+
const tagArgs = tags.map((t) => `'${esc(t)}'`).join(", ");
|
|
55
|
+
return `
|
|
56
|
+
const app = Application.currentApplication();
|
|
57
|
+
app.includeStandardAdditions = true;
|
|
58
|
+
ObjC.import('Foundation');
|
|
59
|
+
const url = $.NSURL.fileURLWithPath('${esc(path)}');
|
|
60
|
+
const tagArray = $.NSArray.arrayWithArray([${tagArgs}]);
|
|
61
|
+
url.setResourceValueForKeyError(tagArray, 'NSURLTagNamesKey', null);
|
|
62
|
+
JSON.stringify({path: '${esc(path)}', tags: [${tagArgs}]});
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
export function recentFilesScript(folder, days, limit) {
|
|
66
|
+
return `
|
|
67
|
+
const app = Application.currentApplication();
|
|
68
|
+
app.includeStandardAdditions = true;
|
|
69
|
+
const dateStr = new Date(Date.now() - ${days} * 86400000).toISOString().split('T')[0];
|
|
70
|
+
const results = app.doShellScript('mdfind -onlyin "${escJxaShell(folder)}" "kMDItemContentModificationDate >= $time.iso(' + dateStr + ')" | head -${limit}');
|
|
71
|
+
const paths = results.split('\\n').filter(p => p.length > 0);
|
|
72
|
+
const result = paths.map(p => ({path: p, name: p.split('/').pop()}));
|
|
73
|
+
JSON.stringify({total: paths.length, files: result});
|
|
74
|
+
`;
|
|
75
|
+
}
|
|
76
|
+
export function listDirectoryScript(path, limit) {
|
|
77
|
+
return `
|
|
78
|
+
const app = Application.currentApplication();
|
|
79
|
+
app.includeStandardAdditions = true;
|
|
80
|
+
const output = app.doShellScript('ls -1 "${escJxaShell(path)}" | head -${limit}');
|
|
81
|
+
const names = output.split('\\n').filter(n => n.length > 0);
|
|
82
|
+
const Finder = Application('Finder');
|
|
83
|
+
const result = names.map(name => {
|
|
84
|
+
try {
|
|
85
|
+
const fullPath = '${esc(path)}' + '/' + name;
|
|
86
|
+
const posixFile = Path(fullPath);
|
|
87
|
+
const item = Finder.items[posixFile.toString()];
|
|
88
|
+
return {
|
|
89
|
+
name: name,
|
|
90
|
+
kind: item.kind(),
|
|
91
|
+
size: item.size(),
|
|
92
|
+
modificationDate: item.modificationDate().toISOString()
|
|
93
|
+
};
|
|
94
|
+
} catch(e) {
|
|
95
|
+
return {name: name, kind: 'unknown'};
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
JSON.stringify({total: names.length, returned: result.length, items: result});
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
export function moveFileScript(source, destination) {
|
|
102
|
+
return `
|
|
103
|
+
const app = Application.currentApplication();
|
|
104
|
+
app.includeStandardAdditions = true;
|
|
105
|
+
app.doShellScript('mv "${escJxaShell(source)}" "${escJxaShell(destination)}"');
|
|
106
|
+
JSON.stringify({moved: true, source: '${esc(source)}', destination: '${esc(destination)}'});
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
export function trashFileScript(path) {
|
|
110
|
+
return `
|
|
111
|
+
const Finder = Application('Finder');
|
|
112
|
+
const posixFile = Path('${esc(path)}');
|
|
113
|
+
const item = Finder.items[posixFile.toString()];
|
|
114
|
+
const name = item.name();
|
|
115
|
+
Finder.delete(item);
|
|
116
|
+
JSON.stringify({trashed: true, name: name, path: '${esc(path)}'});
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
export function createFolderScript(path) {
|
|
120
|
+
return `
|
|
121
|
+
const app = Application.currentApplication();
|
|
122
|
+
app.includeStandardAdditions = true;
|
|
123
|
+
app.doShellScript('mkdir -p "${escJxaShell(path)}"');
|
|
124
|
+
JSON.stringify({created: true, path: '${esc(path)}'});
|
|
125
|
+
`;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/finder/scripts.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAE/D,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,KAAa,EAAE,KAAa;IAC5E,OAAO;;;yDAGgD,WAAW,CAAC,MAAM,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,aAAa,KAAK;;;;;;;;;;;;;;;;;;;GAmBnH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO;;;;8BAIqB,GAAG,CAAC,IAAI,CAAC;;;;6EAIsC,WAAW,CAAC,IAAI,CAAC;;;;;;eAM/E,GAAG,CAAC,IAAI,CAAC;;;;;;;;GAQrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,IAAc;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO;;;;2CAIkC,GAAG,CAAC,IAAI,CAAC;iDACH,OAAO;;6BAE3B,GAAG,CAAC,IAAI,CAAC,aAAa,OAAO;GACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,IAAY,EAAE,KAAa;IAC3E,OAAO;;;4CAGmC,IAAI;yDACS,WAAW,CAAC,MAAM,CAAC,4EAA4E,KAAK;;;;GAI1J,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,KAAa;IAC7D,OAAO;;;+CAGsC,WAAW,CAAC,IAAI,CAAC,aAAa,KAAK;;;;;4BAKtD,GAAG,CAAC,IAAI,CAAC;;;;;;;;;;;;;;GAclC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,WAAmB;IAChE,OAAO;;;6BAGoB,WAAW,CAAC,MAAM,CAAC,MAAM,WAAW,CAAC,WAAW,CAAC;4CAClC,GAAG,CAAC,MAAM,CAAC,oBAAoB,GAAG,CAAC,WAAW,CAAC;GACxF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO;;8BAEqB,GAAG,CAAC,IAAI,CAAC;;;;wDAIiB,GAAG,CAAC,IAAI,CAAC;GAC9D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO;;;mCAG0B,WAAW,CAAC,IAAI,CAAC;4CACR,GAAG,CAAC,IAAI,CAAC;GAClD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { runJxa } from "../shared/jxa.js";
|
|
3
|
+
import { ok, err } from "../shared/result.js";
|
|
4
|
+
import { searchFilesScript, getFileInfoScript, setTagsScript, recentFilesScript, listDirectoryScript, moveFileScript, trashFileScript, createFolderScript, } from "./scripts.js";
|
|
5
|
+
export function registerFinderTools(server, _config) {
|
|
6
|
+
server.registerTool("search_files", {
|
|
7
|
+
title: "Search Files",
|
|
8
|
+
description: "Search files using Spotlight (mdfind). Searches file names and content.",
|
|
9
|
+
inputSchema: {
|
|
10
|
+
query: z.string().describe("Search query (Spotlight syntax)"),
|
|
11
|
+
folder: z.string().optional().default("~").describe("Folder to search in (default: home)"),
|
|
12
|
+
limit: z.number().int().min(1).max(200).optional().default(50).describe("Max results (default: 50)"),
|
|
13
|
+
},
|
|
14
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
15
|
+
}, async ({ query, folder, limit }) => {
|
|
16
|
+
try {
|
|
17
|
+
return ok(await runJxa(searchFilesScript(folder, query, limit)));
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
return err(`Failed to search files: ${e instanceof Error ? e.message : String(e)}`);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
server.registerTool("get_file_info", {
|
|
24
|
+
title: "Get File Info",
|
|
25
|
+
description: "Get detailed file information including size, dates, kind, and tags.",
|
|
26
|
+
inputSchema: {
|
|
27
|
+
path: z.string().describe("Absolute file path"),
|
|
28
|
+
},
|
|
29
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
30
|
+
}, async ({ path }) => {
|
|
31
|
+
try {
|
|
32
|
+
return ok(await runJxa(getFileInfoScript(path)));
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
return err(`Failed to get file info: ${e instanceof Error ? e.message : String(e)}`);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
server.registerTool("set_file_tags", {
|
|
39
|
+
title: "Set File Tags",
|
|
40
|
+
description: "Set Finder tags on a file. Replaces all existing tags.",
|
|
41
|
+
inputSchema: {
|
|
42
|
+
path: z.string().describe("Absolute file path"),
|
|
43
|
+
tags: z.array(z.string()).describe("Array of tag names to set"),
|
|
44
|
+
},
|
|
45
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
46
|
+
}, async ({ path, tags }) => {
|
|
47
|
+
try {
|
|
48
|
+
return ok(await runJxa(setTagsScript(path, tags)));
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
return err(`Failed to set tags: ${e instanceof Error ? e.message : String(e)}`);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
server.registerTool("recent_files", {
|
|
55
|
+
title: "Recent Files",
|
|
56
|
+
description: "Find recently modified files in a folder using Spotlight.",
|
|
57
|
+
inputSchema: {
|
|
58
|
+
folder: z.string().optional().default("~").describe("Folder to search (default: home)"),
|
|
59
|
+
days: z.number().int().min(1).max(365).optional().default(7).describe("Modified within N days (default: 7)"),
|
|
60
|
+
limit: z.number().int().min(1).max(200).optional().default(30).describe("Max results (default: 30)"),
|
|
61
|
+
},
|
|
62
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
63
|
+
}, async ({ folder, days, limit }) => {
|
|
64
|
+
try {
|
|
65
|
+
return ok(await runJxa(recentFilesScript(folder, days, limit)));
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
return err(`Failed to find recent files: ${e instanceof Error ? e.message : String(e)}`);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
server.registerTool("list_directory", {
|
|
72
|
+
title: "List Directory",
|
|
73
|
+
description: "List files and folders in a directory with metadata (kind, size, modification date).",
|
|
74
|
+
inputSchema: {
|
|
75
|
+
path: z.string().describe("Absolute directory path"),
|
|
76
|
+
limit: z.number().int().min(1).max(500).optional().default(100).describe("Max items to return (default: 100)"),
|
|
77
|
+
},
|
|
78
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
79
|
+
}, async ({ path, limit }) => {
|
|
80
|
+
try {
|
|
81
|
+
return ok(await runJxa(listDirectoryScript(path, limit)));
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
return err(`Failed to list directory: ${e instanceof Error ? e.message : String(e)}`);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
server.registerTool("move_file", {
|
|
88
|
+
title: "Move File",
|
|
89
|
+
description: "Move or rename a file or folder to a new location.",
|
|
90
|
+
inputSchema: {
|
|
91
|
+
source: z.string().describe("Absolute path of the file or folder to move"),
|
|
92
|
+
destination: z.string().describe("Absolute destination path"),
|
|
93
|
+
},
|
|
94
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
|
|
95
|
+
}, async ({ source, destination }) => {
|
|
96
|
+
try {
|
|
97
|
+
return ok(await runJxa(moveFileScript(source, destination)));
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
return err(`Failed to move file: ${e instanceof Error ? e.message : String(e)}`);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
server.registerTool("trash_file", {
|
|
104
|
+
title: "Trash File",
|
|
105
|
+
description: "Move a file or folder to the Trash using Finder.",
|
|
106
|
+
inputSchema: {
|
|
107
|
+
path: z.string().describe("Absolute path of the file or folder to trash"),
|
|
108
|
+
},
|
|
109
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
110
|
+
}, async ({ path }) => {
|
|
111
|
+
try {
|
|
112
|
+
return ok(await runJxa(trashFileScript(path)));
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
return err(`Failed to trash file: ${e instanceof Error ? e.message : String(e)}`);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
server.registerTool("create_folder", {
|
|
119
|
+
title: "Create Folder",
|
|
120
|
+
description: "Create a new folder (and intermediate directories if needed).",
|
|
121
|
+
inputSchema: {
|
|
122
|
+
path: z.string().describe("Absolute path of the folder to create"),
|
|
123
|
+
},
|
|
124
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
125
|
+
}, async ({ path }) => {
|
|
126
|
+
try {
|
|
127
|
+
return ok(await runJxa(createFolderScript(path)));
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
return err(`Failed to create folder: ${e instanceof Error ? e.message : String(e)}`);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/finder/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,14 +3,51 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
4
|
import { registerNoteTools } from "./notes/tools.js";
|
|
5
5
|
import { registerNotePrompts } from "./notes/prompts.js";
|
|
6
|
+
import { registerReminderTools } from "./reminders/tools.js";
|
|
7
|
+
import { registerReminderPrompts } from "./reminders/prompts.js";
|
|
8
|
+
import { registerCalendarTools } from "./calendar/tools.js";
|
|
9
|
+
import { registerCalendarPrompts } from "./calendar/prompts.js";
|
|
10
|
+
import { registerContactTools } from "./contacts/tools.js";
|
|
11
|
+
import { registerMailTools } from "./mail/tools.js";
|
|
12
|
+
import { registerMusicTools } from "./music/tools.js";
|
|
13
|
+
import { registerFinderTools } from "./finder/tools.js";
|
|
14
|
+
import { registerSafariTools } from "./safari/tools.js";
|
|
15
|
+
import { registerSystemTools } from "./system/tools.js";
|
|
16
|
+
import { registerPhotosTools } from "./photos/tools.js";
|
|
17
|
+
import { registerShortcutsTools } from "./shortcuts/tools.js";
|
|
18
|
+
import { registerIntelligenceTools } from "./intelligence/tools.js";
|
|
19
|
+
import { registerCrossPrompts } from "./cross/prompts.js";
|
|
20
|
+
import { registerResources } from "./shared/resources.js";
|
|
21
|
+
import { registerSetupTools } from "./shared/setup.js";
|
|
6
22
|
import { parseConfig } from "./shared/config.js";
|
|
7
23
|
const config = parseConfig();
|
|
8
24
|
const server = new McpServer({
|
|
9
25
|
name: "imcp",
|
|
10
|
-
version: "0.
|
|
26
|
+
version: "0.6.0",
|
|
11
27
|
});
|
|
28
|
+
// Apple Apps
|
|
12
29
|
registerNoteTools(server, config);
|
|
13
30
|
registerNotePrompts(server);
|
|
31
|
+
registerReminderTools(server, config);
|
|
32
|
+
registerReminderPrompts(server);
|
|
33
|
+
registerCalendarTools(server, config);
|
|
34
|
+
registerCalendarPrompts(server);
|
|
35
|
+
registerContactTools(server, config);
|
|
36
|
+
registerMailTools(server, config);
|
|
37
|
+
registerMusicTools(server, config);
|
|
38
|
+
registerFinderTools(server, config);
|
|
39
|
+
registerSafariTools(server, config);
|
|
40
|
+
registerSystemTools(server, config);
|
|
41
|
+
registerPhotosTools(server, config);
|
|
42
|
+
registerShortcutsTools(server, config);
|
|
43
|
+
// Apple Intelligence
|
|
44
|
+
registerIntelligenceTools(server, config);
|
|
45
|
+
// Cross-module workflows
|
|
46
|
+
registerCrossPrompts(server);
|
|
47
|
+
// MCP Resources
|
|
48
|
+
registerResources(server);
|
|
49
|
+
// Setup & diagnostics
|
|
50
|
+
registerSetupTools(server);
|
|
14
51
|
async function main() {
|
|
15
52
|
const transport = new StdioServerTransport();
|
|
16
53
|
await server.connect(transport);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;AAE7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAClC,mBAAmB,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ok, err } from "../shared/result.js";
|
|
3
|
+
import { runSwift } from "../shared/swift.js";
|
|
4
|
+
export function registerIntelligenceTools(server, _config) {
|
|
5
|
+
server.registerTool("summarize_text", {
|
|
6
|
+
title: "Summarize Text",
|
|
7
|
+
description: "Summarize text using Apple Intelligence (on-device Foundation Models). Requires macOS 26+ with Apple Silicon.",
|
|
8
|
+
inputSchema: {
|
|
9
|
+
text: z.string().describe("Text to summarize"),
|
|
10
|
+
},
|
|
11
|
+
annotations: {
|
|
12
|
+
readOnlyHint: true,
|
|
13
|
+
destructiveHint: false,
|
|
14
|
+
idempotentHint: true,
|
|
15
|
+
openWorldHint: false,
|
|
16
|
+
},
|
|
17
|
+
}, async ({ text }) => {
|
|
18
|
+
try {
|
|
19
|
+
const result = await runSwift("summarize", JSON.stringify({ text }));
|
|
20
|
+
return ok(result);
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
return err(`Failed to summarize: ${e instanceof Error ? e.message : String(e)}`);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
server.registerTool("rewrite_text", {
|
|
27
|
+
title: "Rewrite Text",
|
|
28
|
+
description: "Rewrite text in a specified tone using Apple Intelligence (on-device Foundation Models). Requires macOS 26+ with Apple Silicon.",
|
|
29
|
+
inputSchema: {
|
|
30
|
+
text: z.string().describe("Text to rewrite"),
|
|
31
|
+
tone: z
|
|
32
|
+
.enum(["professional", "friendly", "concise"])
|
|
33
|
+
.optional()
|
|
34
|
+
.default("professional")
|
|
35
|
+
.describe("Target tone (default: professional)"),
|
|
36
|
+
},
|
|
37
|
+
annotations: {
|
|
38
|
+
readOnlyHint: true,
|
|
39
|
+
destructiveHint: false,
|
|
40
|
+
idempotentHint: false,
|
|
41
|
+
openWorldHint: false,
|
|
42
|
+
},
|
|
43
|
+
}, async ({ text, tone }) => {
|
|
44
|
+
try {
|
|
45
|
+
const result = await runSwift("rewrite", JSON.stringify({ text, tone }));
|
|
46
|
+
return ok(result);
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
return err(`Failed to rewrite: ${e instanceof Error ? e.message : String(e)}`);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
server.registerTool("proofread_text", {
|
|
53
|
+
title: "Proofread Text",
|
|
54
|
+
description: "Proofread and correct grammar/spelling using Apple Intelligence (on-device Foundation Models). Requires macOS 26+ with Apple Silicon.",
|
|
55
|
+
inputSchema: {
|
|
56
|
+
text: z.string().describe("Text to proofread"),
|
|
57
|
+
},
|
|
58
|
+
annotations: {
|
|
59
|
+
readOnlyHint: true,
|
|
60
|
+
destructiveHint: false,
|
|
61
|
+
idempotentHint: false,
|
|
62
|
+
openWorldHint: false,
|
|
63
|
+
},
|
|
64
|
+
}, async ({ text }) => {
|
|
65
|
+
try {
|
|
66
|
+
const result = await runSwift("proofread", JSON.stringify({ text }));
|
|
67
|
+
return ok(result);
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
return err(`Failed to proofread: ${e instanceof Error ? e.message : String(e)}`);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/intelligence/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function listMailboxesScript(): string;
|
|
2
|
+
export declare function listMessagesScript(mailbox: string, limit: number, account?: string): string;
|
|
3
|
+
export declare function readMessageScript(id: string, maxLength: number): string;
|
|
4
|
+
export declare function searchMessagesScript(query: string, mailbox: string, limit: number): string;
|
|
5
|
+
export declare function markReadScript(id: string, read: boolean): string;
|
|
6
|
+
export declare function flagMessageScript(id: string, flagged: boolean): string;
|
|
7
|
+
export declare function getUnreadCountScript(): string;
|
|
8
|
+
export declare function moveMessageScript(id: string, targetMailbox: string, targetAccount?: string): string;
|
|
9
|
+
export declare function listAccountsScript(): string;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// JXA scripts for Apple Mail automation.
|
|
2
|
+
import { esc } from "../shared/esc.js";
|
|
3
|
+
export function listMailboxesScript() {
|
|
4
|
+
return `
|
|
5
|
+
const Mail = Application('Mail');
|
|
6
|
+
const accounts = Mail.accounts();
|
|
7
|
+
const result = [];
|
|
8
|
+
for (const acct of accounts) {
|
|
9
|
+
const aName = acct.name();
|
|
10
|
+
const boxes = acct.mailboxes();
|
|
11
|
+
for (const box of boxes) {
|
|
12
|
+
result.push({
|
|
13
|
+
name: box.name(),
|
|
14
|
+
account: aName,
|
|
15
|
+
unreadCount: box.unreadCount()
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
JSON.stringify(result);
|
|
20
|
+
`;
|
|
21
|
+
}
|
|
22
|
+
export function listMessagesScript(mailbox, limit, account) {
|
|
23
|
+
const acctFilter = account
|
|
24
|
+
? `const accts = Mail.accounts.whose({name: '${esc(account)}'})(); if (accts.length === 0) throw new Error('Account not found: ${esc(account)}'); const acct = accts[0];`
|
|
25
|
+
: `const acct = Mail.accounts()[0];`;
|
|
26
|
+
return `
|
|
27
|
+
const Mail = Application('Mail');
|
|
28
|
+
${acctFilter}
|
|
29
|
+
const boxes = acct.mailboxes.whose({name: '${esc(mailbox)}'})();
|
|
30
|
+
if (boxes.length === 0) throw new Error('Mailbox not found: ${esc(mailbox)}');
|
|
31
|
+
const box = boxes[0];
|
|
32
|
+
const msgs = box.messages();
|
|
33
|
+
const count = Math.min(msgs.length, ${limit});
|
|
34
|
+
const result = [];
|
|
35
|
+
for (let i = 0; i < count; i++) {
|
|
36
|
+
const m = msgs[i];
|
|
37
|
+
result.push({
|
|
38
|
+
id: m.id(),
|
|
39
|
+
subject: m.subject(),
|
|
40
|
+
sender: m.sender(),
|
|
41
|
+
dateReceived: m.dateReceived().toISOString(),
|
|
42
|
+
read: m.readStatus(),
|
|
43
|
+
flagged: m.flaggedStatus()
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
JSON.stringify({total: msgs.length, returned: count, messages: result});
|
|
47
|
+
`;
|
|
48
|
+
}
|
|
49
|
+
export function readMessageScript(id, maxLength) {
|
|
50
|
+
return `
|
|
51
|
+
const Mail = Application('Mail');
|
|
52
|
+
const accounts = Mail.accounts();
|
|
53
|
+
let found = null;
|
|
54
|
+
for (const acct of accounts) {
|
|
55
|
+
const boxes = acct.mailboxes();
|
|
56
|
+
for (const box of boxes) {
|
|
57
|
+
const msgs = box.messages.whose({id: Number('${esc(id)}')})();
|
|
58
|
+
if (msgs.length > 0) {
|
|
59
|
+
const m = msgs[0];
|
|
60
|
+
const toRecips = m.toRecipients();
|
|
61
|
+
const ccRecips = m.ccRecipients();
|
|
62
|
+
found = {
|
|
63
|
+
id: m.id(),
|
|
64
|
+
subject: m.subject(),
|
|
65
|
+
sender: m.sender(),
|
|
66
|
+
to: toRecips.map(r => ({name: r.name(), address: r.address()})),
|
|
67
|
+
cc: ccRecips.map(r => ({name: r.name(), address: r.address()})),
|
|
68
|
+
dateReceived: m.dateReceived().toISOString(),
|
|
69
|
+
dateSent: m.dateSent() ? m.dateSent().toISOString() : null,
|
|
70
|
+
read: m.readStatus(),
|
|
71
|
+
flagged: m.flaggedStatus(),
|
|
72
|
+
content: m.content().substring(0, ${maxLength}),
|
|
73
|
+
mailbox: box.name(),
|
|
74
|
+
account: acct.name()
|
|
75
|
+
};
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (found) break;
|
|
80
|
+
}
|
|
81
|
+
if (!found) throw new Error('Message not found');
|
|
82
|
+
JSON.stringify(found);
|
|
83
|
+
`;
|
|
84
|
+
}
|
|
85
|
+
export function searchMessagesScript(query, mailbox, limit) {
|
|
86
|
+
return `
|
|
87
|
+
const Mail = Application('Mail');
|
|
88
|
+
const accounts = Mail.accounts();
|
|
89
|
+
const q = '${esc(query)}'.toLowerCase();
|
|
90
|
+
const result = [];
|
|
91
|
+
for (const acct of accounts) {
|
|
92
|
+
const boxes = acct.mailboxes.whose({name: '${esc(mailbox)}'})();
|
|
93
|
+
if (boxes.length === 0) continue;
|
|
94
|
+
const msgs = boxes[0].messages();
|
|
95
|
+
for (let i = 0; i < msgs.length && result.length < ${limit}; i++) {
|
|
96
|
+
const subj = msgs[i].subject() || '';
|
|
97
|
+
const sender = msgs[i].sender() || '';
|
|
98
|
+
if (subj.toLowerCase().includes(q) || sender.toLowerCase().includes(q)) {
|
|
99
|
+
result.push({
|
|
100
|
+
id: msgs[i].id(),
|
|
101
|
+
subject: subj,
|
|
102
|
+
sender: sender,
|
|
103
|
+
dateReceived: msgs[i].dateReceived().toISOString(),
|
|
104
|
+
read: msgs[i].readStatus()
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (result.length >= ${limit}) break;
|
|
109
|
+
}
|
|
110
|
+
JSON.stringify({returned: result.length, messages: result});
|
|
111
|
+
`;
|
|
112
|
+
}
|
|
113
|
+
export function markReadScript(id, read) {
|
|
114
|
+
return `
|
|
115
|
+
const Mail = Application('Mail');
|
|
116
|
+
const accounts = Mail.accounts();
|
|
117
|
+
let foundId = null;
|
|
118
|
+
for (const acct of accounts) {
|
|
119
|
+
if (foundId) break;
|
|
120
|
+
const boxes = acct.mailboxes();
|
|
121
|
+
for (const box of boxes) {
|
|
122
|
+
const msgs = box.messages.whose({id: Number('${esc(id)}')})();
|
|
123
|
+
if (msgs.length > 0) {
|
|
124
|
+
msgs[0].readStatus = ${read};
|
|
125
|
+
foundId = msgs[0].id();
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!foundId) throw new Error('Message not found');
|
|
131
|
+
JSON.stringify({id: foundId, read: ${read}});
|
|
132
|
+
`;
|
|
133
|
+
}
|
|
134
|
+
export function flagMessageScript(id, flagged) {
|
|
135
|
+
return `
|
|
136
|
+
const Mail = Application('Mail');
|
|
137
|
+
const accounts = Mail.accounts();
|
|
138
|
+
let foundId = null;
|
|
139
|
+
for (const acct of accounts) {
|
|
140
|
+
if (foundId) break;
|
|
141
|
+
const boxes = acct.mailboxes();
|
|
142
|
+
for (const box of boxes) {
|
|
143
|
+
const msgs = box.messages.whose({id: Number('${esc(id)}')})();
|
|
144
|
+
if (msgs.length > 0) {
|
|
145
|
+
msgs[0].flaggedStatus = ${flagged};
|
|
146
|
+
foundId = msgs[0].id();
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (!foundId) throw new Error('Message not found');
|
|
152
|
+
JSON.stringify({id: foundId, flagged: ${flagged}});
|
|
153
|
+
`;
|
|
154
|
+
}
|
|
155
|
+
export function getUnreadCountScript() {
|
|
156
|
+
return `
|
|
157
|
+
const Mail = Application('Mail');
|
|
158
|
+
const accounts = Mail.accounts();
|
|
159
|
+
const result = [];
|
|
160
|
+
let total = 0;
|
|
161
|
+
for (const acct of accounts) {
|
|
162
|
+
const aName = acct.name();
|
|
163
|
+
const boxes = acct.mailboxes();
|
|
164
|
+
for (const box of boxes) {
|
|
165
|
+
const count = box.unreadCount();
|
|
166
|
+
if (count > 0) {
|
|
167
|
+
result.push({account: aName, mailbox: box.name(), unread: count});
|
|
168
|
+
total += count;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
JSON.stringify({totalUnread: total, mailboxes: result});
|
|
173
|
+
`;
|
|
174
|
+
}
|
|
175
|
+
export function moveMessageScript(id, targetMailbox, targetAccount) {
|
|
176
|
+
const targetFilter = targetAccount
|
|
177
|
+
? `const tAccts = Mail.accounts.whose({name: '${esc(targetAccount)}'})(); if (tAccts.length === 0) throw new Error('Target account not found'); const tBoxes = tAccts[0].mailboxes.whose({name: '${esc(targetMailbox)}'})();`
|
|
178
|
+
: `let tBoxes = []; for (const a of Mail.accounts()) { const b = a.mailboxes.whose({name: '${esc(targetMailbox)}'})(); if (b.length > 0) { tBoxes = b; break; } }`;
|
|
179
|
+
return `
|
|
180
|
+
const Mail = Application('Mail');
|
|
181
|
+
${targetFilter}
|
|
182
|
+
if (tBoxes.length === 0) throw new Error('Target mailbox not found: ${esc(targetMailbox)}');
|
|
183
|
+
const target = tBoxes[0];
|
|
184
|
+
const accounts = Mail.accounts();
|
|
185
|
+
let moved = false;
|
|
186
|
+
for (const acct of accounts) {
|
|
187
|
+
if (moved) break;
|
|
188
|
+
const boxes = acct.mailboxes();
|
|
189
|
+
for (const box of boxes) {
|
|
190
|
+
const msgs = box.messages.whose({id: Number('${esc(id)}')})();
|
|
191
|
+
if (msgs.length > 0) {
|
|
192
|
+
Mail.move(msgs[0], {to: target});
|
|
193
|
+
moved = true;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (!moved) throw new Error('Message not found');
|
|
199
|
+
JSON.stringify({moved: true, id: Number('${esc(id)}'), targetMailbox: '${esc(targetMailbox)}'});
|
|
200
|
+
`;
|
|
201
|
+
}
|
|
202
|
+
export function listAccountsScript() {
|
|
203
|
+
return `
|
|
204
|
+
const Mail = Application('Mail');
|
|
205
|
+
const accounts = Mail.accounts();
|
|
206
|
+
const result = accounts.map(a => ({
|
|
207
|
+
name: a.name(),
|
|
208
|
+
fullName: a.fullName(),
|
|
209
|
+
emailAddresses: a.emailAddresses()
|
|
210
|
+
}));
|
|
211
|
+
JSON.stringify(result);
|
|
212
|
+
`;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/mail/scripts.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAEzC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;GAgBN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAe,EACf,KAAa,EACb,OAAgB;IAEhB,MAAM,UAAU,GAAG,OAAO;QACxB,CAAC,CAAC,6CAA6C,GAAG,CAAC,OAAO,CAAC,sEAAsE,GAAG,CAAC,OAAO,CAAC,4BAA4B;QACzK,CAAC,CAAC,kCAAkC,CAAC;IACvC,OAAO;;MAEH,UAAU;iDACiC,GAAG,CAAC,OAAO,CAAC;kEACK,GAAG,CAAC,OAAO,CAAC;;;0CAGpC,KAAK;;;;;;;;;;;;;;GAc5C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAU,EAAE,SAAiB;IAC7D,OAAO;;;;;;;uDAO8C,GAAG,CAAC,EAAE,CAAC;;;;;;;;;;;;;;;gDAed,SAAS;;;;;;;;;;;GAWtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAa,EACb,OAAe,EACf,KAAa;IAEb,OAAO;;;iBAGQ,GAAG,CAAC,KAAK,CAAC;;;mDAGwB,GAAG,CAAC,OAAO,CAAC;;;2DAGJ,KAAK;;;;;;;;;;;;;6BAanC,KAAK;;;GAG/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,IAAa;IACtD,OAAO;;;;;;;;uDAQ8C,GAAG,CAAC,EAAE,CAAC;;iCAE7B,IAAI;;;;;;;yCAOI,IAAI;GAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAU,EAAE,OAAgB;IAC5D,OAAO;;;;;;;;uDAQ8C,GAAG,CAAC,EAAE,CAAC;;oCAE1B,OAAO;;;;;;;4CAOC,OAAO;GAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;;;;;;;;;;;;GAiBN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAU,EAAE,aAAqB,EAAE,aAAsB;IACzF,MAAM,YAAY,GAAG,aAAa;QAChC,CAAC,CAAC,8CAA8C,GAAG,CAAC,aAAa,CAAC,iIAAiI,GAAG,CAAC,aAAa,CAAC,QAAQ;QAC7N,CAAC,CAAC,2FAA2F,GAAG,CAAC,aAAa,CAAC,mDAAmD,CAAC;IACrK,OAAO;;MAEH,YAAY;0EACwD,GAAG,CAAC,aAAa,CAAC;;;;;;;;uDAQrC,GAAG,CAAC,EAAE,CAAC;;;;;;;;;+CASf,GAAG,CAAC,EAAE,CAAC,uBAAuB,GAAG,CAAC,aAAa,CAAC;GAC5F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;GASN,CAAC;AACJ,CAAC"}
|