@laylzj777/my-apple-apple-eventkit 1.1.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/CHANGELOG.md +575 -0
- package/LICENSE +21 -0
- package/README.md +304 -0
- package/README.zh-CN.md +270 -0
- package/bin/event +0 -0
- package/bin/event-disclaim +0 -0
- package/dist/bin/apple-calendar.d.ts +6 -0
- package/dist/bin/apple-calendar.js +8 -0
- package/dist/bin/apple-calendar.js.map +1 -0
- package/dist/bin/apple-reminders.d.ts +7 -0
- package/dist/bin/apple-reminders.js +9 -0
- package/dist/bin/apple-reminders.js.map +1 -0
- package/dist/bootstrap.d.ts +11 -0
- package/dist/bootstrap.js +44 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/server/handlers.d.ts +12 -0
- package/dist/server/handlers.js +58 -0
- package/dist/server/handlers.js.map +1 -0
- package/dist/server/mode.d.ts +19 -0
- package/dist/server/mode.js +47 -0
- package/dist/server/mode.js.map +1 -0
- package/dist/server/promptAbstractions.d.ts +61 -0
- package/dist/server/promptAbstractions.js +140 -0
- package/dist/server/promptAbstractions.js.map +1 -0
- package/dist/server/prompts.d.ts +13 -0
- package/dist/server/prompts.js +461 -0
- package/dist/server/prompts.js.map +1 -0
- package/dist/server/server.d.ts +61 -0
- package/dist/server/server.js +112 -0
- package/dist/server/server.js.map +1 -0
- package/dist/tools/definitions.d.ts +9 -0
- package/dist/tools/definitions.js +272 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/handlers/calendarHandlers.d.ts +11 -0
- package/dist/tools/handlers/calendarHandlers.js +151 -0
- package/dist/tools/handlers/calendarHandlers.js.map +1 -0
- package/dist/tools/handlers/formatters.d.ts +24 -0
- package/dist/tools/handlers/formatters.js +105 -0
- package/dist/tools/handlers/formatters.js.map +1 -0
- package/dist/tools/handlers/index.d.ts +8 -0
- package/dist/tools/handlers/index.js +9 -0
- package/dist/tools/handlers/index.js.map +1 -0
- package/dist/tools/handlers/listHandlers.d.ts +10 -0
- package/dist/tools/handlers/listHandlers.js +47 -0
- package/dist/tools/handlers/listHandlers.js.map +1 -0
- package/dist/tools/handlers/reminderHandlers.d.ts +10 -0
- package/dist/tools/handlers/reminderHandlers.js +219 -0
- package/dist/tools/handlers/reminderHandlers.js.map +1 -0
- package/dist/tools/handlers/shared.d.ts +28 -0
- package/dist/tools/handlers/shared.js +57 -0
- package/dist/tools/handlers/shared.js.map +1 -0
- package/dist/tools/handlers/subtaskHandlers.d.ts +12 -0
- package/dist/tools/handlers/subtaskHandlers.js +113 -0
- package/dist/tools/handlers/subtaskHandlers.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.js +74 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types/index.d.ts +263 -0
- package/dist/types/index.js +42 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/prompts.d.ts +88 -0
- package/dist/types/prompts.js +6 -0
- package/dist/types/prompts.js.map +1 -0
- package/dist/types/repository.d.ts +197 -0
- package/dist/types/repository.js +14 -0
- package/dist/types/repository.js.map +1 -0
- package/dist/utils/binaryValidator.d.ts +52 -0
- package/dist/utils/binaryValidator.js +185 -0
- package/dist/utils/binaryValidator.js.map +1 -0
- package/dist/utils/calendarRepository.d.ts +49 -0
- package/dist/utils/calendarRepository.js +226 -0
- package/dist/utils/calendarRepository.js.map +1 -0
- package/dist/utils/constants.d.ts +79 -0
- package/dist/utils/constants.js +80 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/dateFiltering.d.ts +41 -0
- package/dist/utils/dateFiltering.js +129 -0
- package/dist/utils/dateFiltering.js.map +1 -0
- package/dist/utils/dateUtils.d.ts +27 -0
- package/dist/utils/dateUtils.js +71 -0
- package/dist/utils/dateUtils.js.map +1 -0
- package/dist/utils/errorHandling.d.ts +27 -0
- package/dist/utils/errorHandling.js +88 -0
- package/dist/utils/errorHandling.js.map +1 -0
- package/dist/utils/eventCli.d.ts +40 -0
- package/dist/utils/eventCli.js +294 -0
- package/dist/utils/eventCli.js.map +1 -0
- package/dist/utils/helpers.d.ts +35 -0
- package/dist/utils/helpers.js +61 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/looseDateParser.d.ts +19 -0
- package/dist/utils/looseDateParser.js +149 -0
- package/dist/utils/looseDateParser.js.map +1 -0
- package/dist/utils/projectUtils.d.ts +13 -0
- package/dist/utils/projectUtils.js +92 -0
- package/dist/utils/projectUtils.js.map +1 -0
- package/dist/utils/reminderDateParser.d.ts +8 -0
- package/dist/utils/reminderDateParser.js +89 -0
- package/dist/utils/reminderDateParser.js.map +1 -0
- package/dist/utils/reminderRepository.d.ts +33 -0
- package/dist/utils/reminderRepository.js +262 -0
- package/dist/utils/reminderRepository.js.map +1 -0
- package/dist/utils/subtaskUtils.d.ts +103 -0
- package/dist/utils/subtaskUtils.js +253 -0
- package/dist/utils/subtaskUtils.js.map +1 -0
- package/dist/utils/tagUtils.d.ts +58 -0
- package/dist/utils/tagUtils.js +177 -0
- package/dist/utils/tagUtils.js.map +1 -0
- package/dist/utils/timeHelpers.d.ts +40 -0
- package/dist/utils/timeHelpers.js +136 -0
- package/dist/utils/timeHelpers.js.map +1 -0
- package/dist/validation/schemas.d.ts +385 -0
- package/dist/validation/schemas.js +579 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +96 -0
- package/scripts/build-event.mjs +513 -0
- package/scripts/disclaim.c +69 -0
- package/scripts/event-Info.plist +29 -0
- package/scripts/event.entitlements +10 -0
- package/scripts/postinstall.mjs +91 -0
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
import { z } from 'zod/v3';
|
|
2
|
+
import { VALIDATION } from '../utils/constants.js';
|
|
3
|
+
import { normalizeLooseDateInput, STRICT_DATE_PATTERN, } from '../utils/looseDateParser.js';
|
|
4
|
+
// Security patterns – allow printable Unicode text while blocking dangerous control and delimiter chars.
|
|
5
|
+
// Allows standard printable ASCII, extended Latin, CJK, plus newlines/tabs for notes.
|
|
6
|
+
// Blocks: control chars (0x00-0x1F except \n\r\t), DEL, dangerous delimiters, Unicode line separators
|
|
7
|
+
// Blocks: bidirectional control characters (U+202A-U+202E, U+2066-U+2069) to prevent visual spoofing
|
|
8
|
+
// This keeps Chinese/Unicode names working while remaining safe with AppleScript quoting.
|
|
9
|
+
const SAFE_TEXT_PATTERN = /^[\u0020-\u007E\u00A0-\u2027\u202F-\u2065\u206A-\uD7FF\uE000-\u{10FFFF}\n\r\t]*$/u;
|
|
10
|
+
// Support multiple date formats: YYYY-MM-DD, YYYY-MM-DD HH:mm:ss, or ISO 8601.
|
|
11
|
+
// Keep this strict enough that a malformed date cannot pass the TS layer and
|
|
12
|
+
// later collapse to an unbounded EventKit query in the Swift CLI.
|
|
13
|
+
// fork:模式收口到 looseDateParser(归一层与校验层必须对同一严格格式达成一致)。
|
|
14
|
+
const DATE_PATTERN = STRICT_DATE_PATTERN;
|
|
15
|
+
// URL validation: accept any valid URI (any scheme) so reminders can link to
|
|
16
|
+
// custom-scheme deep links like obsidian://, shortcuts://, tel:, mailto: —
|
|
17
|
+
// EventKit's EKReminder.url accepts any NSURL, so the MCP layer should not be
|
|
18
|
+
// stricter than the underlying API (see issue #101).
|
|
19
|
+
//
|
|
20
|
+
// For http(s) URLs we still apply SSRF protection (private/internal addresses,
|
|
21
|
+
// localhost, cloud metadata) because those map to real network hostnames the
|
|
22
|
+
// model might be tricked into emitting. Custom schemes are app-handled by
|
|
23
|
+
// macOS and don't reach the network through us, so scheme-validation alone is
|
|
24
|
+
// sufficient there.
|
|
25
|
+
//
|
|
26
|
+
// We still reject a small set of schemes that are dangerous regardless of
|
|
27
|
+
// hostname: file (local filesystem), javascript / vbscript (script execution
|
|
28
|
+
// in any client that renders the link), jar / dict / gopher (historical SSRF
|
|
29
|
+
// vectors via URL handlers), and data (can carry executable content).
|
|
30
|
+
//
|
|
31
|
+
// SSRF blocklist for http(s) hostnames:
|
|
32
|
+
// - IPv4 private/reserved (127.x, 192.168.x, 10.x, 172.16-31.x, 169.254.x, 0.0.0.0, 224-239.x multicast)
|
|
33
|
+
// - IPv6 loopback (::1), unspecified (::), link-local (fe80::), private (fc/fd), multicast (ff)
|
|
34
|
+
// - Cloud metadata (169.254.169.254, 100.100.100.200, metadata.google.internal)
|
|
35
|
+
// - Internal hostnames (localhost, localhost.localdomain, local, internal)
|
|
36
|
+
// Note: For production use, consider using a dedicated SSRF protection library
|
|
37
|
+
// Schemes that are dangerous regardless of host — block unconditionally.
|
|
38
|
+
// Compared case-insensitively against URL.protocol which includes the colon.
|
|
39
|
+
const BLOCKED_URL_SCHEMES = new Set([
|
|
40
|
+
'file:',
|
|
41
|
+
'javascript:',
|
|
42
|
+
'vbscript:',
|
|
43
|
+
'data:',
|
|
44
|
+
'jar:',
|
|
45
|
+
'dict:',
|
|
46
|
+
'gopher:',
|
|
47
|
+
]);
|
|
48
|
+
// Schemes that resolve to a network hostname and therefore need SSRF checks.
|
|
49
|
+
// Other schemes (mailto:, tel:, obsidian://, shortcuts://, ...) are app-routed
|
|
50
|
+
// by macOS and never reach the network through this process.
|
|
51
|
+
const HOST_BASED_URL_SCHEMES = new Set(['http:', 'https:']);
|
|
52
|
+
// Reject control characters and whitespace anywhere in the URL — the URL
|
|
53
|
+
// parser is lenient about some of these and we want a strict input.
|
|
54
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: intentional — must catch raw control chars and DEL injected into URLs
|
|
55
|
+
const URL_FORBIDDEN_CHARS = /[\s\x00-\x1f\x7f]/;
|
|
56
|
+
/**
|
|
57
|
+
* Checks if a hostname is blocked for SSRF protection
|
|
58
|
+
*/
|
|
59
|
+
function isBlockedHostname(hostname) {
|
|
60
|
+
const lowerHostname = hostname.toLowerCase();
|
|
61
|
+
// Blocked hostnames
|
|
62
|
+
const blockedHostnames = [
|
|
63
|
+
'localhost',
|
|
64
|
+
'localhost.localdomain',
|
|
65
|
+
'local',
|
|
66
|
+
'internal',
|
|
67
|
+
'metadata.google.internal',
|
|
68
|
+
];
|
|
69
|
+
if (blockedHostnames.includes(lowerHostname)) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
// Check for decimal IP notation (e.g., 2130706433 for 127.0.0.1)
|
|
73
|
+
if (/^\d+$/.test(lowerHostname)) {
|
|
74
|
+
const decimal = parseInt(lowerHostname, 10);
|
|
75
|
+
if (!Number.isNaN(decimal) && decimal > 0 && decimal <= 4294967295) {
|
|
76
|
+
const a = (decimal >>> 24) & 255;
|
|
77
|
+
const b = (decimal >>> 16) & 255;
|
|
78
|
+
const c = (decimal >>> 8) & 255;
|
|
79
|
+
const d = decimal & 255;
|
|
80
|
+
if (isBlockedIPv4(a, b, c, d))
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Check for hexadecimal IP notation (e.g., 0x7f000001 for 127.0.0.1)
|
|
85
|
+
if (/^0x[0-9a-f]+$/i.test(lowerHostname)) {
|
|
86
|
+
const hex = parseInt(lowerHostname, 16);
|
|
87
|
+
if (!Number.isNaN(hex) && hex > 0 && hex <= 4294967295) {
|
|
88
|
+
const a = (hex >>> 24) & 255;
|
|
89
|
+
const b = (hex >>> 16) & 255;
|
|
90
|
+
const c = (hex >>> 8) & 255;
|
|
91
|
+
const d = hex & 255;
|
|
92
|
+
if (isBlockedIPv4(a, b, c, d))
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Check for octal IP notation (e.g., 0177.0.0.1 for 127.0.0.1)
|
|
97
|
+
const octalPattern = /^0[0-7]*(?:\.[0-7]+){0,3}$/;
|
|
98
|
+
if (octalPattern.test(lowerHostname)) {
|
|
99
|
+
const parts = lowerHostname.split('.').map((p) => parseInt(p, 8));
|
|
100
|
+
if (parts.length === 4 &&
|
|
101
|
+
parts.every((p) => !Number.isNaN(p) && p >= 0 && p <= 255)) {
|
|
102
|
+
if (isBlockedIPv4(parts[0], parts[1], parts[2], parts[3]))
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// IPv4 pattern checks (standard dotted decimal) — groups 1-4 are mandatory.
|
|
107
|
+
const ipv4Pattern = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})(?::\d+)?$/;
|
|
108
|
+
const ipv4Match = lowerHostname.match(ipv4Pattern);
|
|
109
|
+
if (ipv4Match) {
|
|
110
|
+
if (isBlockedIPv4(Number(ipv4Match[1]), Number(ipv4Match[2]), Number(ipv4Match[3]), Number(ipv4Match[4])))
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
// IPv6 pattern checks (remove brackets first)
|
|
114
|
+
const ipv6Hostname = lowerHostname.replace(/^\[|\]$/g, '');
|
|
115
|
+
// ::1 (loopback)
|
|
116
|
+
if (ipv6Hostname === '::1' || ipv6Hostname === '0:0:0:0:0:0:0:1')
|
|
117
|
+
return true;
|
|
118
|
+
// :: (unspecified)
|
|
119
|
+
if (ipv6Hostname === '::' || ipv6Hostname === '0:0:0:0:0:0:0:0')
|
|
120
|
+
return true;
|
|
121
|
+
// fe80::/10 (link-local)
|
|
122
|
+
if (/^fe[89ab][0-9a-f]:/i.test(ipv6Hostname))
|
|
123
|
+
return true;
|
|
124
|
+
// fc00::/7 (ULA - unique local address)
|
|
125
|
+
if (/^fc[0-9a-f][0-9a-f]:/i.test(ipv6Hostname) ||
|
|
126
|
+
/^fd[0-9a-f][0-9a-f]:/i.test(ipv6Hostname))
|
|
127
|
+
return true;
|
|
128
|
+
// ff00::/8 (multicast)
|
|
129
|
+
if (/^ff[0-9a-f][0-9a-f]:/i.test(ipv6Hostname))
|
|
130
|
+
return true;
|
|
131
|
+
// 2001:db8::/32 (documentation)
|
|
132
|
+
if (/^2001:db8:/i.test(ipv6Hostname))
|
|
133
|
+
return true;
|
|
134
|
+
// ::ffff:0:0/96 (IPv4-mapped IPv6) and 64:ff9b::/96 (NAT64, RFC 6052).
|
|
135
|
+
// WHATWG URL normalises `[::ffff:127.0.0.1]` to `[::ffff:7f00:1]` and the
|
|
136
|
+
// fully expanded form back to the same shorthand, so by the time we look at
|
|
137
|
+
// the hostname only the shorthand reaches here. Decode the trailing two
|
|
138
|
+
// hextets and run them through the IPv4 blocklist so a mapped or NAT64
|
|
139
|
+
// form of any blocked v4 address (loopback, private, link-local, cloud
|
|
140
|
+
// metadata) is rejected too — on NAT64-active hosts `[64:ff9b::7f00:1]`
|
|
141
|
+
// is routed straight to 127.0.0.1 by the gateway.
|
|
142
|
+
const v4EmbeddedMatch = ipv6Hostname.match(/^(?:::ffff:|64:ff9b::)([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);
|
|
143
|
+
if (v4EmbeddedMatch) {
|
|
144
|
+
const high = parseInt(v4EmbeddedMatch[1], 16);
|
|
145
|
+
const low = parseInt(v4EmbeddedMatch[2], 16);
|
|
146
|
+
if (isBlockedIPv4((high >>> 8) & 255, high & 255, (low >>> 8) & 255, low & 255)) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Checks if IPv4 octets represent a blocked address
|
|
154
|
+
*/
|
|
155
|
+
function isBlockedIPv4(a, b, c, d) {
|
|
156
|
+
// Validate octet ranges
|
|
157
|
+
if (a < 0 ||
|
|
158
|
+
a > 255 ||
|
|
159
|
+
b < 0 ||
|
|
160
|
+
b > 255 ||
|
|
161
|
+
c < 0 ||
|
|
162
|
+
c > 255 ||
|
|
163
|
+
d < 0 ||
|
|
164
|
+
d > 255) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
// 127.0.0.0/8 (loopback)
|
|
168
|
+
if (a === 127)
|
|
169
|
+
return true;
|
|
170
|
+
// 192.168.0.0/16 (private)
|
|
171
|
+
if (a === 192 && b === 168)
|
|
172
|
+
return true;
|
|
173
|
+
// 10.0.0.0/8 (private)
|
|
174
|
+
if (a === 10)
|
|
175
|
+
return true;
|
|
176
|
+
// 172.16.0.0/12 (private)
|
|
177
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
178
|
+
return true;
|
|
179
|
+
// 169.254.0.0/16 (link-local + cloud metadata)
|
|
180
|
+
if (a === 169 && b === 254)
|
|
181
|
+
return true;
|
|
182
|
+
// 100.100.100.200 (a known cloud instance metadata endpoint)
|
|
183
|
+
if (a === 100 && b === 100 && c === 100 && d === 200)
|
|
184
|
+
return true;
|
|
185
|
+
// 0.0.0.0/8 (unspecified/current network)
|
|
186
|
+
if (a === 0)
|
|
187
|
+
return true;
|
|
188
|
+
// 224.0.0.0/4 (multicast)
|
|
189
|
+
if (a >= 224 && a <= 239)
|
|
190
|
+
return true;
|
|
191
|
+
// 240.0.0.0/4 (reserved for future use)
|
|
192
|
+
if (a >= 240)
|
|
193
|
+
return true;
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
function createSafeTextSchema(minLength, maxLength, fieldName = 'Text', optional = false) {
|
|
197
|
+
let schema = z
|
|
198
|
+
.string()
|
|
199
|
+
.max(maxLength, `${fieldName} cannot exceed ${maxLength} characters`)
|
|
200
|
+
.regex(SAFE_TEXT_PATTERN, `${fieldName} contains invalid or unsafe characters (control characters, line separators, bidirectional overrides, and unpaired surrogates are blocked)`);
|
|
201
|
+
if (minLength > 0) {
|
|
202
|
+
schema = schema.min(minLength, `${fieldName} cannot be empty`);
|
|
203
|
+
}
|
|
204
|
+
return optional ? schema.optional() : schema;
|
|
205
|
+
}
|
|
206
|
+
// Days per month (1-indexed via month - 1). February is treated as 28; leap
|
|
207
|
+
// years are accounted for explicitly below so we don't have to round-trip
|
|
208
|
+
// through `Date`, which has surprising behavior for years 0-99 (mapped to
|
|
209
|
+
// 1900-1999) and for Feb 29 seeded from a non-leap year.
|
|
210
|
+
const DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
211
|
+
const isLeapYear = (year) => (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
212
|
+
function isValidDateInput(value) {
|
|
213
|
+
const match = DATE_PATTERN.exec(value);
|
|
214
|
+
if (!match)
|
|
215
|
+
return false;
|
|
216
|
+
const year = Number(match[1]);
|
|
217
|
+
const month = Number(match[2]);
|
|
218
|
+
const day = Number(match[3]);
|
|
219
|
+
const hour = match[4] === undefined ? 0 : Number(match[4]);
|
|
220
|
+
const minute = match[5] === undefined ? 0 : Number(match[5]);
|
|
221
|
+
const second = match[6] === undefined ? 0 : Number(match[6]);
|
|
222
|
+
if (month < 1 || month > 12)
|
|
223
|
+
return false;
|
|
224
|
+
if (hour > 23 || minute > 59 || second > 59)
|
|
225
|
+
return false;
|
|
226
|
+
const monthDays = DAYS_IN_MONTH[month - 1];
|
|
227
|
+
if (monthDays === undefined)
|
|
228
|
+
return false; // unreachable: month is 1-12
|
|
229
|
+
const maxDay = month === 2 && isLeapYear(year) ? 29 : monthDays;
|
|
230
|
+
if (day < 1 || day > maxDay)
|
|
231
|
+
return false;
|
|
232
|
+
const normalized = value.includes(' ') ? value.replace(' ', 'T') : value;
|
|
233
|
+
return !Number.isNaN(new Date(normalized).getTime());
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Base validation schemas using factory functions
|
|
237
|
+
*/
|
|
238
|
+
export const SafeTextSchema = createSafeTextSchema(1, VALIDATION.MAX_TITLE_LENGTH);
|
|
239
|
+
// Subtask section markers must not appear as standalone lines in user-supplied
|
|
240
|
+
// notes — they would let an attacker forge or truncate the structured subtask
|
|
241
|
+
// section that lives in the same field.
|
|
242
|
+
const SUBTASK_MARKER_LINE_REGEX = /^---(?:END )?SUBTASKS---$/m;
|
|
243
|
+
export const SafeNoteSchema = createSafeTextSchema(0, VALIDATION.MAX_NOTE_LENGTH, 'Note', true).refine((value) => value === undefined || !SUBTASK_MARKER_LINE_REGEX.test(value), {
|
|
244
|
+
message: 'Note cannot contain a line that exactly matches the reserved subtask section markers (---SUBTASKS--- or ---END SUBTASKS---)',
|
|
245
|
+
});
|
|
246
|
+
export const SafeListNameSchema = createSafeTextSchema(0, VALIDATION.MAX_LIST_NAME_LENGTH, 'List name', true);
|
|
247
|
+
export const RequiredListNameSchema = createSafeTextSchema(1, VALIDATION.MAX_LIST_NAME_LENGTH, 'List name');
|
|
248
|
+
export const SafeSearchSchema = createSafeTextSchema(0, VALIDATION.MAX_SEARCH_LENGTH, 'Search term', true);
|
|
249
|
+
// fork:zod 校验前先过 normalizeLooseDateInput——把英文自然语言/中文日期归一成
|
|
250
|
+
// 严格格式(旧日历 MCP 会把这类输入的时刻静默归零);归一不了的原样进 zod 报格式错。
|
|
251
|
+
// 断言回原 schema 类型:preprocess 只改运行时入参,不改变对外的输入/输出类型契约。
|
|
252
|
+
const withLooseDateNormalization = (schema) => z.preprocess((value) => typeof value === 'string' ? normalizeLooseDateInput(value) : value, schema);
|
|
253
|
+
export const SafeDateSchema = withLooseDateNormalization(z
|
|
254
|
+
.string()
|
|
255
|
+
.regex(DATE_PATTERN, "Date must be in format 'YYYY-MM-DD', 'YYYY-MM-DD HH:mm:ss', or ISO 8601 (e.g., '2025-10-30T04:00:00Z')")
|
|
256
|
+
.refine(isValidDateInput, 'Date must be a real, parseable date/time')).optional();
|
|
257
|
+
/**
|
|
258
|
+
* Creates a required date schema with validation
|
|
259
|
+
*/
|
|
260
|
+
const createRequiredDateSchema = (fieldName) => withLooseDateNormalization(z
|
|
261
|
+
.string()
|
|
262
|
+
.min(1, `${fieldName} is required`)
|
|
263
|
+
.regex(DATE_PATTERN, `${fieldName} must be in format 'YYYY-MM-DD', 'YYYY-MM-DD HH:mm:ss', or ISO 8601`)
|
|
264
|
+
.refine(isValidDateInput, `${fieldName} must be a real, parseable date/time`));
|
|
265
|
+
/**
|
|
266
|
+
* Validates a URL string against the project's URI policy.
|
|
267
|
+
*
|
|
268
|
+
* Accepts any valid URI so reminders can hold app-deep-link schemes such as
|
|
269
|
+
* `obsidian://`, `shortcuts://`, `tel:`, and `mailto:` — EventKit itself
|
|
270
|
+
* accepts any NSURL (issue #101). Schemes in {@link BLOCKED_URL_SCHEMES}
|
|
271
|
+
* (file, javascript, data, …) are rejected unconditionally, and for the
|
|
272
|
+
* host-based schemes in {@link HOST_BASED_URL_SCHEMES} (http/https) the
|
|
273
|
+
* SSRF hostname blocklist still applies.
|
|
274
|
+
*
|
|
275
|
+
* @returns `true` if accepted, otherwise an error message describing why.
|
|
276
|
+
*/
|
|
277
|
+
function validateUrl(url) {
|
|
278
|
+
if (URL_FORBIDDEN_CHARS.test(url)) {
|
|
279
|
+
return 'URL cannot contain whitespace or control characters';
|
|
280
|
+
}
|
|
281
|
+
let parsed;
|
|
282
|
+
try {
|
|
283
|
+
parsed = new URL(url);
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
return 'URL must be a valid URI (RFC 3986)';
|
|
287
|
+
}
|
|
288
|
+
const scheme = parsed.protocol.toLowerCase();
|
|
289
|
+
if (BLOCKED_URL_SCHEMES.has(scheme)) {
|
|
290
|
+
return `URL scheme '${scheme}' is not allowed`;
|
|
291
|
+
}
|
|
292
|
+
if (HOST_BASED_URL_SCHEMES.has(scheme) &&
|
|
293
|
+
isBlockedHostname(parsed.hostname)) {
|
|
294
|
+
return 'URL must not point to internal, private, or blocked addresses';
|
|
295
|
+
}
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
export const SafeUrlSchema = z
|
|
299
|
+
.string()
|
|
300
|
+
.max(VALIDATION.MAX_URL_LENGTH, `URL cannot exceed ${VALIDATION.MAX_URL_LENGTH} characters`)
|
|
301
|
+
.superRefine((url, ctx) => {
|
|
302
|
+
const result = validateUrl(url);
|
|
303
|
+
if (result !== true) {
|
|
304
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: result });
|
|
305
|
+
}
|
|
306
|
+
})
|
|
307
|
+
.optional();
|
|
308
|
+
// Reusable schemas for common fields
|
|
309
|
+
const DueWithinEnum = z
|
|
310
|
+
.enum(['today', 'tomorrow', 'this-week', 'overdue', 'no-date'])
|
|
311
|
+
.optional();
|
|
312
|
+
const PriorityFilterEnum = z.enum(['high', 'medium', 'low', 'none']).optional();
|
|
313
|
+
const PriorityValueSchema = z
|
|
314
|
+
.number()
|
|
315
|
+
.int()
|
|
316
|
+
.refine((val) => [0, 1, 5, 9].includes(val), {
|
|
317
|
+
message: 'Priority must be 0 (none), 1 (high), 5 (medium), or 9 (low)',
|
|
318
|
+
})
|
|
319
|
+
.optional();
|
|
320
|
+
const AvailabilitySchema = z
|
|
321
|
+
.enum(['not-supported', 'busy', 'free', 'tentative', 'unavailable'])
|
|
322
|
+
.optional();
|
|
323
|
+
const SpanSchema = z.enum(['this-event', 'future-events']).optional();
|
|
324
|
+
/**
|
|
325
|
+
* Tag schema for reminder tags.
|
|
326
|
+
* Allows Unicode letters and numbers so non-Latin scripts (CJK, Cyrillic,
|
|
327
|
+
* Arabic, etc.) work as tag names — Apple Reminders natively supports them.
|
|
328
|
+
*/
|
|
329
|
+
const TagSchema = z
|
|
330
|
+
.string()
|
|
331
|
+
.min(1)
|
|
332
|
+
.max(50)
|
|
333
|
+
.regex(/^#?[\p{L}\p{N}_-]+$/u, {
|
|
334
|
+
message: 'Tags can only contain letters, numbers, underscores, and hyphens',
|
|
335
|
+
});
|
|
336
|
+
const TagArraySchema = z.array(TagSchema).optional();
|
|
337
|
+
/**
|
|
338
|
+
* Subtask validation schemas
|
|
339
|
+
* Subtask titles are stored as a single line inside a structured notes section,
|
|
340
|
+
* so they must not contain newlines, tabs, or brace characters that would
|
|
341
|
+
* collide with the `[ ] {id} title` line format.
|
|
342
|
+
*/
|
|
343
|
+
const SubtaskTitleSchema = createSafeTextSchema(1, VALIDATION.MAX_TITLE_LENGTH, 'Subtask title').regex(/^[^\n\r\t{}]+$/, 'Subtask title cannot contain newlines, tabs, or braces');
|
|
344
|
+
const SubtaskTitleArraySchema = z.array(SubtaskTitleSchema).optional();
|
|
345
|
+
/** Fields accepted by `event reminders create`. */
|
|
346
|
+
const BaseReminderFields = {
|
|
347
|
+
title: SafeTextSchema,
|
|
348
|
+
dueDate: SafeDateSchema,
|
|
349
|
+
note: SafeNoteSchema,
|
|
350
|
+
url: SafeUrlSchema,
|
|
351
|
+
targetList: SafeListNameSchema,
|
|
352
|
+
priority: PriorityValueSchema,
|
|
353
|
+
tags: TagArraySchema,
|
|
354
|
+
subtasks: SubtaskTitleArraySchema,
|
|
355
|
+
};
|
|
356
|
+
export const SafeIdSchema = z.string().min(1, 'ID cannot be empty');
|
|
357
|
+
/**
|
|
358
|
+
* Tool-specific validation schemas
|
|
359
|
+
*/
|
|
360
|
+
export const CreateReminderSchema = z.object(BaseReminderFields);
|
|
361
|
+
export const ReadRemindersSchema = z.object({
|
|
362
|
+
id: SafeIdSchema.optional(),
|
|
363
|
+
filterList: SafeListNameSchema,
|
|
364
|
+
showCompleted: z.boolean().optional().default(false),
|
|
365
|
+
search: SafeSearchSchema,
|
|
366
|
+
dueWithin: DueWithinEnum,
|
|
367
|
+
filterPriority: PriorityFilterEnum,
|
|
368
|
+
filterRecurring: z.boolean().optional(),
|
|
369
|
+
filterLocationBased: z.boolean().optional(),
|
|
370
|
+
filterTags: TagArraySchema,
|
|
371
|
+
});
|
|
372
|
+
/** Fields accepted by `event reminders update`. */
|
|
373
|
+
export const UpdateReminderSchema = z.object({
|
|
374
|
+
id: SafeIdSchema,
|
|
375
|
+
title: SafeTextSchema.optional(),
|
|
376
|
+
startDate: SafeDateSchema,
|
|
377
|
+
dueDate: SafeDateSchema,
|
|
378
|
+
note: SafeNoteSchema,
|
|
379
|
+
url: SafeUrlSchema,
|
|
380
|
+
completed: z.boolean().optional(),
|
|
381
|
+
targetList: SafeListNameSchema,
|
|
382
|
+
priority: PriorityValueSchema,
|
|
383
|
+
tags: TagArraySchema,
|
|
384
|
+
addTags: TagArraySchema,
|
|
385
|
+
removeTags: TagArraySchema,
|
|
386
|
+
});
|
|
387
|
+
export const DeleteReminderSchema = z.object({
|
|
388
|
+
id: SafeIdSchema,
|
|
389
|
+
});
|
|
390
|
+
// Calendar event schemas. All-day events are inferred from the date format
|
|
391
|
+
// (bare `yyyy-MM-dd` without a time component).
|
|
392
|
+
export const CreateCalendarEventSchema = z.object({
|
|
393
|
+
title: SafeTextSchema,
|
|
394
|
+
startDate: createRequiredDateSchema('Start date'),
|
|
395
|
+
endDate: createRequiredDateSchema('End date'),
|
|
396
|
+
note: SafeNoteSchema,
|
|
397
|
+
location: createSafeTextSchema(0, VALIDATION.MAX_LOCATION_LENGTH, 'Location', true),
|
|
398
|
+
targetCalendar: SafeListNameSchema,
|
|
399
|
+
});
|
|
400
|
+
export const ReadCalendarEventsSchema = z.object({
|
|
401
|
+
id: SafeIdSchema.optional(),
|
|
402
|
+
filterCalendar: SafeListNameSchema,
|
|
403
|
+
search: SafeSearchSchema,
|
|
404
|
+
availability: AvailabilitySchema,
|
|
405
|
+
startDate: SafeDateSchema,
|
|
406
|
+
endDate: SafeDateSchema,
|
|
407
|
+
});
|
|
408
|
+
export const UpdateCalendarEventSchema = z.object({
|
|
409
|
+
id: SafeIdSchema,
|
|
410
|
+
title: SafeTextSchema.optional(),
|
|
411
|
+
startDate: SafeDateSchema,
|
|
412
|
+
endDate: SafeDateSchema,
|
|
413
|
+
note: SafeNoteSchema,
|
|
414
|
+
location: createSafeTextSchema(0, VALIDATION.MAX_LOCATION_LENGTH, 'Location', true),
|
|
415
|
+
});
|
|
416
|
+
export const DeleteCalendarEventSchema = z.object({
|
|
417
|
+
id: SafeIdSchema,
|
|
418
|
+
span: SpanSchema,
|
|
419
|
+
});
|
|
420
|
+
export const ReadCalendarsSchema = z
|
|
421
|
+
.object({
|
|
422
|
+
startDate: SafeDateSchema,
|
|
423
|
+
endDate: SafeDateSchema,
|
|
424
|
+
})
|
|
425
|
+
.superRefine((value, ctx) => {
|
|
426
|
+
if (!value.startDate || !value.endDate)
|
|
427
|
+
return;
|
|
428
|
+
const start = Date.parse(value.startDate.includes(' ')
|
|
429
|
+
? value.startDate.replace(' ', 'T')
|
|
430
|
+
: value.startDate);
|
|
431
|
+
const end = Date.parse(value.endDate.includes(' ')
|
|
432
|
+
? value.endDate.replace(' ', 'T')
|
|
433
|
+
: value.endDate);
|
|
434
|
+
if (Number.isNaN(start) || Number.isNaN(end))
|
|
435
|
+
return; // shape errors surface elsewhere
|
|
436
|
+
if (end < start) {
|
|
437
|
+
ctx.addIssue({
|
|
438
|
+
code: z.ZodIssueCode.custom,
|
|
439
|
+
path: ['endDate'],
|
|
440
|
+
message: 'endDate must be on or after startDate',
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
export const CreateReminderListSchema = z.object({
|
|
445
|
+
name: RequiredListNameSchema,
|
|
446
|
+
});
|
|
447
|
+
export const UpdateReminderListSchema = z.object({
|
|
448
|
+
name: RequiredListNameSchema,
|
|
449
|
+
newName: RequiredListNameSchema,
|
|
450
|
+
});
|
|
451
|
+
export const DeleteReminderListSchema = z.object({
|
|
452
|
+
name: RequiredListNameSchema,
|
|
453
|
+
});
|
|
454
|
+
/**
|
|
455
|
+
* Validation error wrapper for consistent error handling across the application
|
|
456
|
+
* @extends Error
|
|
457
|
+
* @class
|
|
458
|
+
* @description Provides structured error information with field-level details for validation failures
|
|
459
|
+
* @param {string} message - Human-readable error message
|
|
460
|
+
* @param {Record<string, string[]>} [details] - Optional field-specific error details
|
|
461
|
+
* @example
|
|
462
|
+
* throw new ValidationError('Invalid input', {
|
|
463
|
+
* title: ['Title is required', 'Title too long'],
|
|
464
|
+
* dueDate: ['Invalid date format']
|
|
465
|
+
* });
|
|
466
|
+
*/
|
|
467
|
+
export class ValidationError extends Error {
|
|
468
|
+
constructor(message, details) {
|
|
469
|
+
super(message);
|
|
470
|
+
this.details = details;
|
|
471
|
+
this.name = 'ValidationError';
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Generic validation function with security error handling and detailed logging
|
|
476
|
+
* @template T - Expected type after validation
|
|
477
|
+
* @param {z.ZodSchema<T>} schema - Zod schema to validate against
|
|
478
|
+
* @param {unknown} input - Input data to validate
|
|
479
|
+
* @returns {T} Validated and parsed data
|
|
480
|
+
* @throws {ValidationError} Detailed validation error with field-specific messages
|
|
481
|
+
* @description
|
|
482
|
+
* - Provides detailed field-level error messages
|
|
483
|
+
* - Aggregates multiple validation errors into single error
|
|
484
|
+
* - Includes path information for nested field validation
|
|
485
|
+
* - Throws ValidationError for consistent error handling
|
|
486
|
+
* @example
|
|
487
|
+
* try {
|
|
488
|
+
* const data = validateInput(CreateReminderSchema, input);
|
|
489
|
+
* // data is now typed as CreateReminderData
|
|
490
|
+
* } catch (error) {
|
|
491
|
+
* if (error instanceof ValidationError) {
|
|
492
|
+
* console.log(error.details); // Field-specific error messages
|
|
493
|
+
* }
|
|
494
|
+
* }
|
|
495
|
+
*/
|
|
496
|
+
export const validateInput = (schema, input) => {
|
|
497
|
+
try {
|
|
498
|
+
return schema.parse(input);
|
|
499
|
+
}
|
|
500
|
+
catch (error) {
|
|
501
|
+
if (error instanceof z.ZodError) {
|
|
502
|
+
const errorMessages = error.errors
|
|
503
|
+
.map((err) => `${err.path.join('.')}: ${err.message}`)
|
|
504
|
+
.join('; ');
|
|
505
|
+
const errorDetails = error.errors.reduce((acc, err) => {
|
|
506
|
+
const path = err.path.join('.');
|
|
507
|
+
acc[path] = acc[path] ?? [];
|
|
508
|
+
acc[path].push(err.message);
|
|
509
|
+
return acc;
|
|
510
|
+
}, {});
|
|
511
|
+
throw new ValidationError(`Input validation failed: ${errorMessages}`, errorDetails);
|
|
512
|
+
}
|
|
513
|
+
throw new ValidationError('Input validation failed: Unknown error');
|
|
514
|
+
}
|
|
515
|
+
};
|
|
516
|
+
/**
|
|
517
|
+
* Subtask-related schemas
|
|
518
|
+
*/
|
|
519
|
+
const SubtaskIdSchema = z
|
|
520
|
+
.string()
|
|
521
|
+
.min(1, 'Subtask ID is required')
|
|
522
|
+
.regex(/^[a-f0-9]+$/, 'Subtask ID must be a valid hex string');
|
|
523
|
+
const SubtaskOrderSchema = z
|
|
524
|
+
.array(SubtaskIdSchema)
|
|
525
|
+
.min(1, 'Order array cannot be empty');
|
|
526
|
+
export const ReadSubtasksSchema = z.object({
|
|
527
|
+
reminderId: SafeIdSchema,
|
|
528
|
+
});
|
|
529
|
+
export const CreateSubtaskSchema = z.object({
|
|
530
|
+
reminderId: SafeIdSchema,
|
|
531
|
+
title: SubtaskTitleSchema,
|
|
532
|
+
});
|
|
533
|
+
export const UpdateSubtaskSchema = z.object({
|
|
534
|
+
reminderId: SafeIdSchema,
|
|
535
|
+
subtaskId: SubtaskIdSchema,
|
|
536
|
+
title: SubtaskTitleSchema.optional(),
|
|
537
|
+
completed: z.boolean().optional(),
|
|
538
|
+
});
|
|
539
|
+
export const DeleteSubtaskSchema = z.object({
|
|
540
|
+
reminderId: SafeIdSchema,
|
|
541
|
+
subtaskId: SubtaskIdSchema,
|
|
542
|
+
});
|
|
543
|
+
export const ToggleSubtaskSchema = z.object({
|
|
544
|
+
reminderId: SafeIdSchema,
|
|
545
|
+
subtaskId: SubtaskIdSchema,
|
|
546
|
+
});
|
|
547
|
+
export const ReorderSubtasksSchema = z.object({
|
|
548
|
+
reminderId: SafeIdSchema,
|
|
549
|
+
order: SubtaskOrderSchema,
|
|
550
|
+
});
|
|
551
|
+
/**
|
|
552
|
+
* Prompt argument validation schemas
|
|
553
|
+
* These schemas validate user inputs for MCP prompt templates
|
|
554
|
+
*/
|
|
555
|
+
/**
|
|
556
|
+
* Schema for daily-task-organizer prompt arguments
|
|
557
|
+
*/
|
|
558
|
+
export const DailyTaskOrganizerArgsSchema = z.object({
|
|
559
|
+
"Today's focus": createSafeTextSchema(0, VALIDATION.MAX_TITLE_LENGTH, "Today's focus", true),
|
|
560
|
+
});
|
|
561
|
+
/**
|
|
562
|
+
* Schema for smart-reminder-creator prompt arguments
|
|
563
|
+
*/
|
|
564
|
+
export const SmartReminderCreatorArgsSchema = z.object({
|
|
565
|
+
'Task idea': createSafeTextSchema(0, VALIDATION.MAX_NOTE_LENGTH, 'Task idea', true),
|
|
566
|
+
});
|
|
567
|
+
/**
|
|
568
|
+
* Schema for reminder-review-assistant prompt arguments
|
|
569
|
+
*/
|
|
570
|
+
export const ReminderReviewAssistantArgsSchema = z.object({
|
|
571
|
+
'Review focus': createSafeTextSchema(0, VALIDATION.MAX_TITLE_LENGTH, 'Review focus', true),
|
|
572
|
+
});
|
|
573
|
+
/**
|
|
574
|
+
* Schema for weekly-planning-workflow prompt arguments
|
|
575
|
+
*/
|
|
576
|
+
export const WeeklyPlanningWorkflowArgsSchema = z.object({
|
|
577
|
+
'User ideas': createSafeTextSchema(0, VALIDATION.MAX_NOTE_LENGTH, 'User ideas', true),
|
|
578
|
+
});
|
|
579
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/validation/schemas.ts"],"names":[],"mappings":"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"}
|