@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.
Files changed (123) hide show
  1. package/CHANGELOG.md +575 -0
  2. package/LICENSE +21 -0
  3. package/README.md +304 -0
  4. package/README.zh-CN.md +270 -0
  5. package/bin/event +0 -0
  6. package/bin/event-disclaim +0 -0
  7. package/dist/bin/apple-calendar.d.ts +6 -0
  8. package/dist/bin/apple-calendar.js +8 -0
  9. package/dist/bin/apple-calendar.js.map +1 -0
  10. package/dist/bin/apple-reminders.d.ts +7 -0
  11. package/dist/bin/apple-reminders.js +9 -0
  12. package/dist/bin/apple-reminders.js.map +1 -0
  13. package/dist/bootstrap.d.ts +11 -0
  14. package/dist/bootstrap.js +44 -0
  15. package/dist/bootstrap.js.map +1 -0
  16. package/dist/index.d.ts +10 -0
  17. package/dist/index.js +12 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/server/handlers.d.ts +12 -0
  20. package/dist/server/handlers.js +58 -0
  21. package/dist/server/handlers.js.map +1 -0
  22. package/dist/server/mode.d.ts +19 -0
  23. package/dist/server/mode.js +47 -0
  24. package/dist/server/mode.js.map +1 -0
  25. package/dist/server/promptAbstractions.d.ts +61 -0
  26. package/dist/server/promptAbstractions.js +140 -0
  27. package/dist/server/promptAbstractions.js.map +1 -0
  28. package/dist/server/prompts.d.ts +13 -0
  29. package/dist/server/prompts.js +461 -0
  30. package/dist/server/prompts.js.map +1 -0
  31. package/dist/server/server.d.ts +61 -0
  32. package/dist/server/server.js +112 -0
  33. package/dist/server/server.js.map +1 -0
  34. package/dist/tools/definitions.d.ts +9 -0
  35. package/dist/tools/definitions.js +272 -0
  36. package/dist/tools/definitions.js.map +1 -0
  37. package/dist/tools/handlers/calendarHandlers.d.ts +11 -0
  38. package/dist/tools/handlers/calendarHandlers.js +151 -0
  39. package/dist/tools/handlers/calendarHandlers.js.map +1 -0
  40. package/dist/tools/handlers/formatters.d.ts +24 -0
  41. package/dist/tools/handlers/formatters.js +105 -0
  42. package/dist/tools/handlers/formatters.js.map +1 -0
  43. package/dist/tools/handlers/index.d.ts +8 -0
  44. package/dist/tools/handlers/index.js +9 -0
  45. package/dist/tools/handlers/index.js.map +1 -0
  46. package/dist/tools/handlers/listHandlers.d.ts +10 -0
  47. package/dist/tools/handlers/listHandlers.js +47 -0
  48. package/dist/tools/handlers/listHandlers.js.map +1 -0
  49. package/dist/tools/handlers/reminderHandlers.d.ts +10 -0
  50. package/dist/tools/handlers/reminderHandlers.js +219 -0
  51. package/dist/tools/handlers/reminderHandlers.js.map +1 -0
  52. package/dist/tools/handlers/shared.d.ts +28 -0
  53. package/dist/tools/handlers/shared.js +57 -0
  54. package/dist/tools/handlers/shared.js.map +1 -0
  55. package/dist/tools/handlers/subtaskHandlers.d.ts +12 -0
  56. package/dist/tools/handlers/subtaskHandlers.js +113 -0
  57. package/dist/tools/handlers/subtaskHandlers.js.map +1 -0
  58. package/dist/tools/index.d.ts +10 -0
  59. package/dist/tools/index.js +74 -0
  60. package/dist/tools/index.js.map +1 -0
  61. package/dist/types/index.d.ts +263 -0
  62. package/dist/types/index.js +42 -0
  63. package/dist/types/index.js.map +1 -0
  64. package/dist/types/prompts.d.ts +88 -0
  65. package/dist/types/prompts.js +6 -0
  66. package/dist/types/prompts.js.map +1 -0
  67. package/dist/types/repository.d.ts +197 -0
  68. package/dist/types/repository.js +14 -0
  69. package/dist/types/repository.js.map +1 -0
  70. package/dist/utils/binaryValidator.d.ts +52 -0
  71. package/dist/utils/binaryValidator.js +185 -0
  72. package/dist/utils/binaryValidator.js.map +1 -0
  73. package/dist/utils/calendarRepository.d.ts +49 -0
  74. package/dist/utils/calendarRepository.js +226 -0
  75. package/dist/utils/calendarRepository.js.map +1 -0
  76. package/dist/utils/constants.d.ts +79 -0
  77. package/dist/utils/constants.js +80 -0
  78. package/dist/utils/constants.js.map +1 -0
  79. package/dist/utils/dateFiltering.d.ts +41 -0
  80. package/dist/utils/dateFiltering.js +129 -0
  81. package/dist/utils/dateFiltering.js.map +1 -0
  82. package/dist/utils/dateUtils.d.ts +27 -0
  83. package/dist/utils/dateUtils.js +71 -0
  84. package/dist/utils/dateUtils.js.map +1 -0
  85. package/dist/utils/errorHandling.d.ts +27 -0
  86. package/dist/utils/errorHandling.js +88 -0
  87. package/dist/utils/errorHandling.js.map +1 -0
  88. package/dist/utils/eventCli.d.ts +40 -0
  89. package/dist/utils/eventCli.js +294 -0
  90. package/dist/utils/eventCli.js.map +1 -0
  91. package/dist/utils/helpers.d.ts +35 -0
  92. package/dist/utils/helpers.js +61 -0
  93. package/dist/utils/helpers.js.map +1 -0
  94. package/dist/utils/looseDateParser.d.ts +19 -0
  95. package/dist/utils/looseDateParser.js +149 -0
  96. package/dist/utils/looseDateParser.js.map +1 -0
  97. package/dist/utils/projectUtils.d.ts +13 -0
  98. package/dist/utils/projectUtils.js +92 -0
  99. package/dist/utils/projectUtils.js.map +1 -0
  100. package/dist/utils/reminderDateParser.d.ts +8 -0
  101. package/dist/utils/reminderDateParser.js +89 -0
  102. package/dist/utils/reminderDateParser.js.map +1 -0
  103. package/dist/utils/reminderRepository.d.ts +33 -0
  104. package/dist/utils/reminderRepository.js +262 -0
  105. package/dist/utils/reminderRepository.js.map +1 -0
  106. package/dist/utils/subtaskUtils.d.ts +103 -0
  107. package/dist/utils/subtaskUtils.js +253 -0
  108. package/dist/utils/subtaskUtils.js.map +1 -0
  109. package/dist/utils/tagUtils.d.ts +58 -0
  110. package/dist/utils/tagUtils.js +177 -0
  111. package/dist/utils/tagUtils.js.map +1 -0
  112. package/dist/utils/timeHelpers.d.ts +40 -0
  113. package/dist/utils/timeHelpers.js +136 -0
  114. package/dist/utils/timeHelpers.js.map +1 -0
  115. package/dist/validation/schemas.d.ts +385 -0
  116. package/dist/validation/schemas.js +579 -0
  117. package/dist/validation/schemas.js.map +1 -0
  118. package/package.json +96 -0
  119. package/scripts/build-event.mjs +513 -0
  120. package/scripts/disclaim.c +69 -0
  121. package/scripts/event-Info.plist +29 -0
  122. package/scripts/event.entitlements +10 -0
  123. 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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"}