@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 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/reminders/scripts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { runJxa } from "../shared/jxa.js";
|
|
3
|
+
import { runSwift } from "../shared/swift.js";
|
|
4
|
+
import { ok, err } from "../shared/result.js";
|
|
5
|
+
import { listReminderListsScript, listRemindersScript, readReminderScript, createReminderScript, updateReminderScript, completeReminderScript, deleteReminderScript, searchRemindersScript, createReminderListScript, deleteReminderListScript, } from "./scripts.js";
|
|
6
|
+
export function registerReminderTools(server, _config) {
|
|
7
|
+
server.registerTool("list_reminder_lists", {
|
|
8
|
+
title: "List Reminder Lists",
|
|
9
|
+
description: "List all reminder lists with reminder counts.",
|
|
10
|
+
inputSchema: {},
|
|
11
|
+
annotations: {
|
|
12
|
+
readOnlyHint: true,
|
|
13
|
+
destructiveHint: false,
|
|
14
|
+
idempotentHint: true,
|
|
15
|
+
openWorldHint: false,
|
|
16
|
+
},
|
|
17
|
+
}, async () => {
|
|
18
|
+
try {
|
|
19
|
+
const result = await runJxa(listReminderListsScript());
|
|
20
|
+
return ok(result);
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
return err(`Failed to list reminder lists: ${e instanceof Error ? e.message : String(e)}`);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
server.registerTool("list_reminders", {
|
|
27
|
+
title: "List Reminders",
|
|
28
|
+
description: "List reminders. Optionally filter by list name and/or completion status.",
|
|
29
|
+
inputSchema: {
|
|
30
|
+
list: z.string().optional().describe("Filter by list name"),
|
|
31
|
+
completed: z.boolean().optional().describe("Filter by completed status (true/false). Omit to list all."),
|
|
32
|
+
},
|
|
33
|
+
annotations: {
|
|
34
|
+
readOnlyHint: true,
|
|
35
|
+
destructiveHint: false,
|
|
36
|
+
idempotentHint: true,
|
|
37
|
+
openWorldHint: false,
|
|
38
|
+
},
|
|
39
|
+
}, async ({ list, completed }) => {
|
|
40
|
+
try {
|
|
41
|
+
const result = await runJxa(listRemindersScript(list, completed));
|
|
42
|
+
return ok(result);
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
return err(`Failed to list reminders: ${e instanceof Error ? e.message : String(e)}`);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
server.registerTool("read_reminder", {
|
|
49
|
+
title: "Read Reminder",
|
|
50
|
+
description: "Read the full details of a specific reminder by ID.",
|
|
51
|
+
inputSchema: {
|
|
52
|
+
id: z.string().describe("Reminder ID"),
|
|
53
|
+
},
|
|
54
|
+
annotations: {
|
|
55
|
+
readOnlyHint: true,
|
|
56
|
+
destructiveHint: false,
|
|
57
|
+
idempotentHint: true,
|
|
58
|
+
openWorldHint: false,
|
|
59
|
+
},
|
|
60
|
+
}, async ({ id }) => {
|
|
61
|
+
try {
|
|
62
|
+
const result = await runJxa(readReminderScript(id));
|
|
63
|
+
return ok(result);
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
return err(`Failed to read reminder: ${e instanceof Error ? e.message : String(e)}`);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
server.registerTool("create_reminder", {
|
|
70
|
+
title: "Create Reminder",
|
|
71
|
+
description: "Create a new reminder. Optionally set notes, due date, priority (0=none, 1-4=high, 5=medium, 6-9=low), and target list. Recurrence rules cannot be set via automation.",
|
|
72
|
+
inputSchema: {
|
|
73
|
+
title: z.string().describe("Reminder title"),
|
|
74
|
+
body: z.string().optional().describe("Notes/body text"),
|
|
75
|
+
dueDate: z.string().optional().describe("Due date in ISO 8601 format (e.g. '2026-03-15T10:00:00Z')"),
|
|
76
|
+
priority: z.number().int().min(0).max(9).optional().describe("Priority: 0=none, 1-4=high, 5=medium, 6-9=low"),
|
|
77
|
+
list: z.string().optional().describe("Target list name. Defaults to the default list."),
|
|
78
|
+
},
|
|
79
|
+
annotations: {
|
|
80
|
+
readOnlyHint: false,
|
|
81
|
+
destructiveHint: false,
|
|
82
|
+
idempotentHint: false,
|
|
83
|
+
openWorldHint: false,
|
|
84
|
+
},
|
|
85
|
+
}, async ({ title, body, dueDate, priority, list }) => {
|
|
86
|
+
try {
|
|
87
|
+
const result = await runJxa(createReminderScript(title, { body, dueDate, priority, list }));
|
|
88
|
+
return ok(result);
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
return err(`Failed to create reminder: ${e instanceof Error ? e.message : String(e)}`);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
server.registerTool("update_reminder", {
|
|
95
|
+
title: "Update Reminder",
|
|
96
|
+
description: "Update reminder properties. Only specified fields are changed. Set dueDate to null to clear it. Recurrence rules cannot be modified via automation.",
|
|
97
|
+
inputSchema: {
|
|
98
|
+
id: z.string().describe("Reminder ID"),
|
|
99
|
+
name: z.string().optional().describe("New title"),
|
|
100
|
+
body: z.string().optional().describe("New notes/body text"),
|
|
101
|
+
dueDate: z.string().nullable().optional().describe("New due date (ISO 8601) or null to clear"),
|
|
102
|
+
priority: z.number().int().min(0).max(9).optional().describe("New priority (0-9)"),
|
|
103
|
+
flagged: z.boolean().optional().describe("Set flagged status"),
|
|
104
|
+
},
|
|
105
|
+
annotations: {
|
|
106
|
+
readOnlyHint: false,
|
|
107
|
+
destructiveHint: true,
|
|
108
|
+
idempotentHint: true,
|
|
109
|
+
openWorldHint: false,
|
|
110
|
+
},
|
|
111
|
+
}, async ({ id, name, body, dueDate, priority, flagged }) => {
|
|
112
|
+
try {
|
|
113
|
+
const result = await runJxa(updateReminderScript(id, { name, body, dueDate, priority, flagged }));
|
|
114
|
+
return ok(result);
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
return err(`Failed to update reminder: ${e instanceof Error ? e.message : String(e)}`);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
server.registerTool("complete_reminder", {
|
|
121
|
+
title: "Complete Reminder",
|
|
122
|
+
description: "Mark a reminder as completed or un-complete it.",
|
|
123
|
+
inputSchema: {
|
|
124
|
+
id: z.string().describe("Reminder ID"),
|
|
125
|
+
completed: z.boolean().optional().default(true).describe("Set to true to complete, false to un-complete (default: true)"),
|
|
126
|
+
},
|
|
127
|
+
annotations: {
|
|
128
|
+
readOnlyHint: false,
|
|
129
|
+
destructiveHint: false,
|
|
130
|
+
idempotentHint: true,
|
|
131
|
+
openWorldHint: false,
|
|
132
|
+
},
|
|
133
|
+
}, async ({ id, completed }) => {
|
|
134
|
+
try {
|
|
135
|
+
const result = await runJxa(completeReminderScript(id, completed));
|
|
136
|
+
return ok(result);
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
return err(`Failed to complete reminder: ${e instanceof Error ? e.message : String(e)}`);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
server.registerTool("delete_reminder", {
|
|
143
|
+
title: "Delete Reminder",
|
|
144
|
+
description: "Delete a reminder by ID. This action is permanent.",
|
|
145
|
+
inputSchema: {
|
|
146
|
+
id: z.string().describe("Reminder ID"),
|
|
147
|
+
},
|
|
148
|
+
annotations: {
|
|
149
|
+
readOnlyHint: false,
|
|
150
|
+
destructiveHint: true,
|
|
151
|
+
idempotentHint: true,
|
|
152
|
+
openWorldHint: false,
|
|
153
|
+
},
|
|
154
|
+
}, async ({ id }) => {
|
|
155
|
+
try {
|
|
156
|
+
const result = await runJxa(deleteReminderScript(id));
|
|
157
|
+
return ok(result);
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
return err(`Failed to delete reminder: ${e instanceof Error ? e.message : String(e)}`);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
server.registerTool("search_reminders", {
|
|
164
|
+
title: "Search Reminders",
|
|
165
|
+
description: "Search reminders by keyword in name or body across all lists (case-insensitive).",
|
|
166
|
+
inputSchema: {
|
|
167
|
+
query: z.string().describe("Search keyword"),
|
|
168
|
+
limit: z.number().int().min(1).max(500).optional().default(30).describe("Max results (default: 30)"),
|
|
169
|
+
},
|
|
170
|
+
annotations: {
|
|
171
|
+
readOnlyHint: true,
|
|
172
|
+
destructiveHint: false,
|
|
173
|
+
idempotentHint: true,
|
|
174
|
+
openWorldHint: false,
|
|
175
|
+
},
|
|
176
|
+
}, async ({ query, limit }) => {
|
|
177
|
+
try {
|
|
178
|
+
const result = await runJxa(searchRemindersScript(query, limit));
|
|
179
|
+
return ok(result);
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
return err(`Failed to search reminders: ${e instanceof Error ? e.message : String(e)}`);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
server.registerTool("create_reminder_list", {
|
|
186
|
+
title: "Create Reminder List",
|
|
187
|
+
description: "Create a new reminder list.",
|
|
188
|
+
inputSchema: {
|
|
189
|
+
name: z.string().describe("Name for the new list"),
|
|
190
|
+
},
|
|
191
|
+
annotations: {
|
|
192
|
+
readOnlyHint: false,
|
|
193
|
+
destructiveHint: false,
|
|
194
|
+
idempotentHint: false,
|
|
195
|
+
openWorldHint: false,
|
|
196
|
+
},
|
|
197
|
+
}, async ({ name }) => {
|
|
198
|
+
try {
|
|
199
|
+
const result = await runJxa(createReminderListScript(name));
|
|
200
|
+
return ok(result);
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
return err(`Failed to create reminder list: ${e instanceof Error ? e.message : String(e)}`);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
server.registerTool("delete_reminder_list", {
|
|
207
|
+
title: "Delete Reminder List",
|
|
208
|
+
description: "Delete a reminder list by name. This action is permanent and removes all reminders in the list.",
|
|
209
|
+
inputSchema: {
|
|
210
|
+
name: z.string().describe("Name of the list to delete"),
|
|
211
|
+
},
|
|
212
|
+
annotations: {
|
|
213
|
+
readOnlyHint: false,
|
|
214
|
+
destructiveHint: true,
|
|
215
|
+
idempotentHint: true,
|
|
216
|
+
openWorldHint: false,
|
|
217
|
+
},
|
|
218
|
+
}, async ({ name }) => {
|
|
219
|
+
try {
|
|
220
|
+
const result = await runJxa(deleteReminderListScript(name));
|
|
221
|
+
return ok(result);
|
|
222
|
+
}
|
|
223
|
+
catch (e) {
|
|
224
|
+
return err(`Failed to delete reminder list: ${e instanceof Error ? e.message : String(e)}`);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
server.registerTool("create_recurring_reminder", {
|
|
228
|
+
title: "Create Recurring Reminder",
|
|
229
|
+
description: "Create a recurring reminder via EventKit. Supports daily, weekly, monthly, and yearly recurrence with configurable intervals. Requires macOS 26+ Swift bridge.",
|
|
230
|
+
inputSchema: {
|
|
231
|
+
title: z.string().describe("Reminder title"),
|
|
232
|
+
list: z.string().optional().describe("Target reminder list name. Defaults to the default list."),
|
|
233
|
+
notes: z.string().optional().describe("Reminder notes/body text"),
|
|
234
|
+
dueDate: z.string().optional().describe("Due date in ISO 8601 format"),
|
|
235
|
+
priority: z.number().int().min(0).max(9).optional().describe("Priority: 0=none, 1-4=high, 5=medium, 6-9=low"),
|
|
236
|
+
recurrence: z.object({
|
|
237
|
+
frequency: z.enum(["daily", "weekly", "monthly", "yearly"]).describe("Recurrence frequency"),
|
|
238
|
+
interval: z.number().int().min(1).describe("Repeat every N frequency units (e.g. 2 = every 2 weeks)"),
|
|
239
|
+
endDate: z.string().optional().describe("Recurrence end date (ISO 8601)"),
|
|
240
|
+
count: z.number().int().min(1).optional().describe("Number of occurrences (alternative to endDate)"),
|
|
241
|
+
daysOfWeek: z.array(z.number().int().min(1).max(7)).optional().describe("Days of week for weekly recurrence (1=Sun, 2=Mon, ..., 7=Sat)"),
|
|
242
|
+
}).describe("Recurrence rule"),
|
|
243
|
+
},
|
|
244
|
+
annotations: {
|
|
245
|
+
readOnlyHint: false,
|
|
246
|
+
destructiveHint: false,
|
|
247
|
+
idempotentHint: false,
|
|
248
|
+
openWorldHint: false,
|
|
249
|
+
},
|
|
250
|
+
}, async ({ title, list, notes, dueDate, priority, recurrence }) => {
|
|
251
|
+
try {
|
|
252
|
+
const result = await runSwift("create-recurring-reminder", JSON.stringify({
|
|
253
|
+
title,
|
|
254
|
+
list,
|
|
255
|
+
notes,
|
|
256
|
+
dueDate,
|
|
257
|
+
priority,
|
|
258
|
+
recurrence,
|
|
259
|
+
}));
|
|
260
|
+
return ok(result);
|
|
261
|
+
}
|
|
262
|
+
catch (e) {
|
|
263
|
+
return err(`Failed to create recurring reminder: ${e instanceof Error ? e.message : String(e)}`);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/reminders/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function listTabsScript(): string;
|
|
2
|
+
export declare function readPageContentScript(windowIndex: number, tabIndex: number, maxLength: number): string;
|
|
3
|
+
export declare function getCurrentTabScript(): string;
|
|
4
|
+
export declare function openUrlScript(url: string): string;
|
|
5
|
+
export declare function closeTabScript(windowIndex: number, tabIndex: number): string;
|
|
6
|
+
export declare function activateTabScript(windowIndex: number, tabIndex: number): string;
|
|
7
|
+
export declare function runJavascriptScript(code: string, windowIndex: number, tabIndex: number): string;
|
|
8
|
+
export declare function searchTabsScript(query: string): string;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// JXA scripts for Apple Safari automation.
|
|
2
|
+
import { esc } from "../shared/esc.js";
|
|
3
|
+
export function listTabsScript() {
|
|
4
|
+
return `
|
|
5
|
+
const Safari = Application('Safari');
|
|
6
|
+
const wins = Safari.windows();
|
|
7
|
+
const result = [];
|
|
8
|
+
for (let w = 0; w < wins.length; w++) {
|
|
9
|
+
const tabs = wins[w].tabs();
|
|
10
|
+
for (let t = 0; t < tabs.length; t++) {
|
|
11
|
+
result.push({
|
|
12
|
+
windowIndex: w,
|
|
13
|
+
tabIndex: t,
|
|
14
|
+
title: tabs[t].name(),
|
|
15
|
+
url: tabs[t].url()
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
JSON.stringify(result);
|
|
20
|
+
`;
|
|
21
|
+
}
|
|
22
|
+
export function readPageContentScript(windowIndex, tabIndex, maxLength) {
|
|
23
|
+
return `
|
|
24
|
+
const Safari = Application('Safari');
|
|
25
|
+
const wins = Safari.windows();
|
|
26
|
+
if (${windowIndex} >= wins.length) throw new Error('Window index out of range');
|
|
27
|
+
const tabs = wins[${windowIndex}].tabs();
|
|
28
|
+
if (${tabIndex} >= tabs.length) throw new Error('Tab index out of range');
|
|
29
|
+
const tab = tabs[${tabIndex}];
|
|
30
|
+
const source = tab.source() || '';
|
|
31
|
+
const truncated = source.slice(0, ${maxLength});
|
|
32
|
+
JSON.stringify({
|
|
33
|
+
title: tab.name(),
|
|
34
|
+
url: tab.url(),
|
|
35
|
+
content: truncated,
|
|
36
|
+
truncated: source.length > ${maxLength}
|
|
37
|
+
});
|
|
38
|
+
`;
|
|
39
|
+
}
|
|
40
|
+
export function getCurrentTabScript() {
|
|
41
|
+
return `
|
|
42
|
+
const Safari = Application('Safari');
|
|
43
|
+
const wins = Safari.windows();
|
|
44
|
+
if (wins.length === 0) throw new Error('No Safari windows open');
|
|
45
|
+
const tab = wins[0].currentTab();
|
|
46
|
+
JSON.stringify({
|
|
47
|
+
title: tab.name(),
|
|
48
|
+
url: tab.url()
|
|
49
|
+
});
|
|
50
|
+
`;
|
|
51
|
+
}
|
|
52
|
+
export function openUrlScript(url) {
|
|
53
|
+
return `
|
|
54
|
+
const Safari = Application('Safari');
|
|
55
|
+
Safari.activate();
|
|
56
|
+
const u = '${esc(url)}';
|
|
57
|
+
Safari.openLocation(u);
|
|
58
|
+
JSON.stringify({opened: true, url: u});
|
|
59
|
+
`;
|
|
60
|
+
}
|
|
61
|
+
export function closeTabScript(windowIndex, tabIndex) {
|
|
62
|
+
return `
|
|
63
|
+
const Safari = Application('Safari');
|
|
64
|
+
const wins = Safari.windows();
|
|
65
|
+
if (${windowIndex} >= wins.length) throw new Error('Window index out of range');
|
|
66
|
+
const tabs = wins[${windowIndex}].tabs();
|
|
67
|
+
if (${tabIndex} >= tabs.length) throw new Error('Tab index out of range');
|
|
68
|
+
const name = tabs[${tabIndex}].name();
|
|
69
|
+
tabs[${tabIndex}].close();
|
|
70
|
+
JSON.stringify({closed: true, title: name});
|
|
71
|
+
`;
|
|
72
|
+
}
|
|
73
|
+
export function activateTabScript(windowIndex, tabIndex) {
|
|
74
|
+
return `
|
|
75
|
+
const Safari = Application('Safari');
|
|
76
|
+
const wins = Safari.windows();
|
|
77
|
+
if (${windowIndex} >= wins.length) throw new Error('Window index out of range');
|
|
78
|
+
const tabs = wins[${windowIndex}].tabs();
|
|
79
|
+
if (${tabIndex} >= tabs.length) throw new Error('Tab index out of range');
|
|
80
|
+
wins[${windowIndex}].currentTab = tabs[${tabIndex}];
|
|
81
|
+
Safari.activate();
|
|
82
|
+
JSON.stringify({activated: true, title: tabs[${tabIndex}].name(), url: tabs[${tabIndex}].url()});
|
|
83
|
+
`;
|
|
84
|
+
}
|
|
85
|
+
export function runJavascriptScript(code, windowIndex, tabIndex) {
|
|
86
|
+
return `
|
|
87
|
+
const Safari = Application('Safari');
|
|
88
|
+
const wins = Safari.windows();
|
|
89
|
+
if (${windowIndex} >= wins.length) throw new Error('Window index out of range');
|
|
90
|
+
const tabs = wins[${windowIndex}].tabs();
|
|
91
|
+
if (${tabIndex} >= tabs.length) throw new Error('Tab index out of range');
|
|
92
|
+
const result = Safari.doJavaScript('${esc(code)}', {in: tabs[${tabIndex}]});
|
|
93
|
+
JSON.stringify({result: String(result || '')});
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
export function searchTabsScript(query) {
|
|
97
|
+
return `
|
|
98
|
+
const Safari = Application('Safari');
|
|
99
|
+
const wins = Safari.windows();
|
|
100
|
+
const q = '${esc(query)}'.toLowerCase();
|
|
101
|
+
const result = [];
|
|
102
|
+
for (let w = 0; w < wins.length; w++) {
|
|
103
|
+
const tabs = wins[w].tabs();
|
|
104
|
+
for (let t = 0; t < tabs.length; t++) {
|
|
105
|
+
const title = tabs[t].name() || '';
|
|
106
|
+
const url = tabs[t].url() || '';
|
|
107
|
+
if (title.toLowerCase().includes(q) || url.toLowerCase().includes(q)) {
|
|
108
|
+
result.push({
|
|
109
|
+
windowIndex: w,
|
|
110
|
+
tabIndex: t,
|
|
111
|
+
title: title,
|
|
112
|
+
url: url
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
JSON.stringify({returned: result.length, tabs: result});
|
|
118
|
+
`;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/safari/scripts.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAE3C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,UAAU,cAAc;IAC5B,OAAO;;;;;;;;;;;;;;;;GAgBN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB,EAAE,QAAgB,EAAE,SAAiB;IAC5F,OAAO;;;UAGC,WAAW;wBACG,WAAW;UACzB,QAAQ;uBACK,QAAQ;;wCAES,SAAS;;;;;mCAKd,SAAS;;GAEzC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;GASN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO;;;iBAGQ,GAAG,CAAC,GAAG,CAAC;;;GAGtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,QAAgB;IAClE,OAAO;;;UAGC,WAAW;wBACG,WAAW;UACzB,QAAQ;wBACM,QAAQ;WACrB,QAAQ;;GAEhB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,QAAgB;IACrE,OAAO;;;UAGC,WAAW;wBACG,WAAW;UACzB,QAAQ;WACP,WAAW,uBAAuB,QAAQ;;mDAEF,QAAQ,uBAAuB,QAAQ;GACvF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,WAAmB,EAAE,QAAgB;IACrF,OAAO;;;UAGC,WAAW;wBACG,WAAW;UACzB,QAAQ;0CACwB,GAAG,CAAC,IAAI,CAAC,gBAAgB,QAAQ;;GAExE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO;;;iBAGQ,GAAG,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;GAkBxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { runJxa } from "../shared/jxa.js";
|
|
3
|
+
import { ok, err } from "../shared/result.js";
|
|
4
|
+
import { listTabsScript, readPageContentScript, getCurrentTabScript, openUrlScript, closeTabScript, activateTabScript, runJavascriptScript, searchTabsScript, } from "./scripts.js";
|
|
5
|
+
export function registerSafariTools(server, _config) {
|
|
6
|
+
server.registerTool("list_tabs", {
|
|
7
|
+
title: "List Safari Tabs",
|
|
8
|
+
description: "List all open tabs across all Safari windows with title and URL.",
|
|
9
|
+
inputSchema: {},
|
|
10
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
11
|
+
}, async () => {
|
|
12
|
+
try {
|
|
13
|
+
return ok(await runJxa(listTabsScript()));
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
return err(`Failed to list tabs: ${e instanceof Error ? e.message : String(e)}`);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
server.registerTool("read_page_content", {
|
|
20
|
+
title: "Read Page Content",
|
|
21
|
+
description: "Read the HTML source of a Safari tab. Specify window and tab index from list_tabs.",
|
|
22
|
+
inputSchema: {
|
|
23
|
+
windowIndex: z.number().int().min(0).optional().default(0).describe("Window index (default: 0)"),
|
|
24
|
+
tabIndex: z.number().int().min(0).optional().default(0).describe("Tab index (default: 0)"),
|
|
25
|
+
maxLength: z.number().int().min(100).max(50000).optional().default(10000).describe("Max content length (default: 10000)"),
|
|
26
|
+
},
|
|
27
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
28
|
+
}, async ({ windowIndex, tabIndex, maxLength }) => {
|
|
29
|
+
try {
|
|
30
|
+
return ok(await runJxa(readPageContentScript(windowIndex, tabIndex, maxLength)));
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
return err(`Failed to read page: ${e instanceof Error ? e.message : String(e)}`);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
server.registerTool("get_current_tab", {
|
|
37
|
+
title: "Get Current Tab",
|
|
38
|
+
description: "Get the title and URL of the active Safari tab.",
|
|
39
|
+
inputSchema: {},
|
|
40
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
41
|
+
}, async () => {
|
|
42
|
+
try {
|
|
43
|
+
return ok(await runJxa(getCurrentTabScript()));
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
return err(`Failed to get current tab: ${e instanceof Error ? e.message : String(e)}`);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
server.registerTool("open_url", {
|
|
50
|
+
title: "Open URL",
|
|
51
|
+
description: "Open a URL in Safari's frontmost window.",
|
|
52
|
+
inputSchema: {
|
|
53
|
+
url: z.string().url().describe("URL to open"),
|
|
54
|
+
},
|
|
55
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
56
|
+
}, async ({ url }) => {
|
|
57
|
+
try {
|
|
58
|
+
return ok(await runJxa(openUrlScript(url)));
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
return err(`Failed to open URL: ${e instanceof Error ? e.message : String(e)}`);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
server.registerTool("close_tab", {
|
|
65
|
+
title: "Close Tab",
|
|
66
|
+
description: "Close a specific Safari tab. Use list_tabs to find window/tab indices.",
|
|
67
|
+
inputSchema: {
|
|
68
|
+
windowIndex: z.number().int().min(0).optional().default(0).describe("Window index (default: 0)"),
|
|
69
|
+
tabIndex: z.number().int().min(0).describe("Tab index"),
|
|
70
|
+
},
|
|
71
|
+
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
72
|
+
}, async ({ windowIndex, tabIndex }) => {
|
|
73
|
+
try {
|
|
74
|
+
return ok(await runJxa(closeTabScript(windowIndex, tabIndex)));
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
return err(`Failed to close tab: ${e instanceof Error ? e.message : String(e)}`);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
server.registerTool("activate_tab", {
|
|
81
|
+
title: "Activate Tab",
|
|
82
|
+
description: "Switch to a specific Safari tab. Use list_tabs to find window/tab indices.",
|
|
83
|
+
inputSchema: {
|
|
84
|
+
windowIndex: z.number().int().min(0).optional().default(0).describe("Window index (default: 0)"),
|
|
85
|
+
tabIndex: z.number().int().min(0).describe("Tab index"),
|
|
86
|
+
},
|
|
87
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
88
|
+
}, async ({ windowIndex, tabIndex }) => {
|
|
89
|
+
try {
|
|
90
|
+
return ok(await runJxa(activateTabScript(windowIndex, tabIndex)));
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
return err(`Failed to activate tab: ${e instanceof Error ? e.message : String(e)}`);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
server.registerTool("run_javascript", {
|
|
97
|
+
title: "Run JavaScript",
|
|
98
|
+
description: "Execute JavaScript in a Safari tab. Use list_tabs to find window/tab indices. Returns the result as a string.",
|
|
99
|
+
inputSchema: {
|
|
100
|
+
code: z.string().describe("JavaScript to execute"),
|
|
101
|
+
windowIndex: z.number().int().min(0).optional().default(0).describe("Window index (default: 0)"),
|
|
102
|
+
tabIndex: z.number().int().min(0).optional().default(0).describe("Tab index (default: 0)"),
|
|
103
|
+
},
|
|
104
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
105
|
+
}, async ({ code, windowIndex, tabIndex }) => {
|
|
106
|
+
try {
|
|
107
|
+
return ok(await runJxa(runJavascriptScript(code, windowIndex, tabIndex)));
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
return err(`Failed to run JavaScript: ${e instanceof Error ? e.message : String(e)}`);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
server.registerTool("search_tabs", {
|
|
114
|
+
title: "Search Tabs",
|
|
115
|
+
description: "Search open Safari tabs by title or URL keyword.",
|
|
116
|
+
inputSchema: {
|
|
117
|
+
query: z.string().describe("Search keyword to match against tab titles and URLs"),
|
|
118
|
+
},
|
|
119
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
120
|
+
}, async ({ query }) => {
|
|
121
|
+
try {
|
|
122
|
+
return ok(await runJxa(searchTabsScript(query)));
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
return err(`Failed to search tabs: ${e instanceof Error ? e.message : String(e)}`);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/safari/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Escape a string for safe interpolation inside JXA single-quoted literals. */
|
|
2
|
+
export declare function esc(str: string): string;
|
|
3
|
+
/** Escape a string for safe interpolation inside shell double-quoted arguments via doShellScript. */
|
|
4
|
+
export declare function escShell(str: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Escape for shell double-quoted arguments INSIDE a JXA single-quoted string.
|
|
7
|
+
* Two layers: inner escShell for shell, outer esc for JXA single-quote context.
|
|
8
|
+
* Use this whenever doShellScript("...${value}...") is inside a JXA '...' literal.
|
|
9
|
+
*/
|
|
10
|
+
export declare function escJxaShell(str: string): string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Escape a string for safe interpolation inside JXA single-quoted literals. */
|
|
2
|
+
export function esc(str) {
|
|
3
|
+
return str
|
|
4
|
+
.replace(/\0/g, "")
|
|
5
|
+
.replace(/\\/g, "\\\\")
|
|
6
|
+
.replace(/'/g, "\\'")
|
|
7
|
+
.replace(/\n/g, "\\n")
|
|
8
|
+
.replace(/\r/g, "\\r")
|
|
9
|
+
.replace(/\t/g, "\\t")
|
|
10
|
+
.replace(/\u2028/g, "\\u2028")
|
|
11
|
+
.replace(/\u2029/g, "\\u2029");
|
|
12
|
+
}
|
|
13
|
+
/** Escape a string for safe interpolation inside shell double-quoted arguments via doShellScript. */
|
|
14
|
+
export function escShell(str) {
|
|
15
|
+
return str
|
|
16
|
+
.replace(/\0/g, "")
|
|
17
|
+
.replace(/\\/g, "\\\\")
|
|
18
|
+
.replace(/"/g, '\\"')
|
|
19
|
+
.replace(/`/g, "\\`")
|
|
20
|
+
.replace(/\$/g, "\\$")
|
|
21
|
+
.replace(/\n/g, "\\n")
|
|
22
|
+
.replace(/\r/g, "\\r");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Escape for shell double-quoted arguments INSIDE a JXA single-quoted string.
|
|
26
|
+
* Two layers: inner escShell for shell, outer esc for JXA single-quote context.
|
|
27
|
+
* Use this whenever doShellScript("...${value}...") is inside a JXA '...' literal.
|
|
28
|
+
*/
|
|
29
|
+
export function escJxaShell(str) {
|
|
30
|
+
const shellSafe = escShell(str);
|
|
31
|
+
return shellSafe
|
|
32
|
+
.replace(/\\/g, "\\\\")
|
|
33
|
+
.replace(/'/g, "\\'");
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=esc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"esc.js","sourceRoot":"","sources":["../../src/shared/esc.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,UAAU,GAAG,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;SAC7B,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,GAAG;SACP,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,SAAS;SACb,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/shared/jxa.js
CHANGED
|
@@ -12,7 +12,7 @@ export async function runJxa(script) {
|
|
|
12
12
|
catch (e) {
|
|
13
13
|
const err = e;
|
|
14
14
|
if (err.killed || err.signal === "SIGTERM") {
|
|
15
|
-
throw new Error(`osascript timed out after ${TIMEOUT_MS / 1000}s
|
|
15
|
+
throw new Error(`osascript timed out after ${TIMEOUT_MS / 1000}s`, { cause: e });
|
|
16
16
|
}
|
|
17
17
|
throw e;
|
|
18
18
|
}
|
package/dist/shared/jxa.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jxa.js","sourceRoot":"","sources":["../../src/shared/jxa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AAE7C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAI,MAAc;IAC5C,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,WAAW,EACX,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,EAClC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,CAC/C,CAAC;QACF,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,CAA2D,CAAC;QACxE,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"jxa.js","sourceRoot":"","sources":["../../src/shared/jxa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AAE7C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAI,MAAc;IAC5C,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,WAAW,EACX,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,EAClC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,CAC/C,CAAC;QACF,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,CAA2D,CAAC;QACxE,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,GAAG,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
|