@shin1ohno/sage 0.3.0 → 0.5.3

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 (95) hide show
  1. package/dist/cli/http-server-with-config.d.ts +38 -0
  2. package/dist/cli/http-server-with-config.d.ts.map +1 -0
  3. package/dist/cli/http-server-with-config.js +458 -0
  4. package/dist/cli/http-server-with-config.js.map +1 -0
  5. package/dist/cli/http-server.d.ts +74 -0
  6. package/dist/cli/http-server.d.ts.map +1 -0
  7. package/dist/cli/http-server.js +407 -0
  8. package/dist/cli/http-server.js.map +1 -0
  9. package/dist/cli/jwt-middleware.d.ts +36 -0
  10. package/dist/cli/jwt-middleware.d.ts.map +1 -0
  11. package/dist/cli/jwt-middleware.js +99 -0
  12. package/dist/cli/jwt-middleware.js.map +1 -0
  13. package/dist/cli/main-entry.d.ts +41 -0
  14. package/dist/cli/main-entry.d.ts.map +1 -0
  15. package/dist/cli/main-entry.js +80 -0
  16. package/dist/cli/main-entry.js.map +1 -0
  17. package/dist/cli/mcp-handler.d.ts +56 -0
  18. package/dist/cli/mcp-handler.d.ts.map +1 -0
  19. package/dist/cli/mcp-handler.js +2189 -0
  20. package/dist/cli/mcp-handler.js.map +1 -0
  21. package/dist/cli/parser.d.ts +43 -0
  22. package/dist/cli/parser.d.ts.map +1 -0
  23. package/dist/cli/parser.js +162 -0
  24. package/dist/cli/parser.js.map +1 -0
  25. package/dist/cli/remote-config-loader.d.ts +85 -0
  26. package/dist/cli/remote-config-loader.d.ts.map +1 -0
  27. package/dist/cli/remote-config-loader.js +129 -0
  28. package/dist/cli/remote-config-loader.js.map +1 -0
  29. package/dist/cli/secret-auth.d.ts +47 -0
  30. package/dist/cli/secret-auth.d.ts.map +1 -0
  31. package/dist/cli/secret-auth.js +165 -0
  32. package/dist/cli/secret-auth.js.map +1 -0
  33. package/dist/cli/sse-stream-handler.d.ts +45 -0
  34. package/dist/cli/sse-stream-handler.d.ts.map +1 -0
  35. package/dist/cli/sse-stream-handler.js +125 -0
  36. package/dist/cli/sse-stream-handler.js.map +1 -0
  37. package/dist/index.js +885 -209
  38. package/dist/index.js.map +1 -1
  39. package/dist/integrations/calendar-event-creator.d.ts +152 -0
  40. package/dist/integrations/calendar-event-creator.d.ts.map +1 -0
  41. package/dist/integrations/calendar-event-creator.js +507 -0
  42. package/dist/integrations/calendar-event-creator.js.map +1 -0
  43. package/dist/integrations/calendar-event-deleter.d.ts +137 -0
  44. package/dist/integrations/calendar-event-deleter.d.ts.map +1 -0
  45. package/dist/integrations/calendar-event-deleter.js +378 -0
  46. package/dist/integrations/calendar-event-deleter.js.map +1 -0
  47. package/dist/integrations/calendar-event-response.d.ts +213 -0
  48. package/dist/integrations/calendar-event-response.d.ts.map +1 -0
  49. package/dist/integrations/calendar-event-response.js +560 -0
  50. package/dist/integrations/calendar-event-response.js.map +1 -0
  51. package/dist/integrations/calendar-service.d.ts +66 -1
  52. package/dist/integrations/calendar-service.d.ts.map +1 -1
  53. package/dist/integrations/calendar-service.js +223 -0
  54. package/dist/integrations/calendar-service.js.map +1 -1
  55. package/dist/oauth/client-store.d.ts +36 -0
  56. package/dist/oauth/client-store.d.ts.map +1 -0
  57. package/dist/oauth/client-store.js +104 -0
  58. package/dist/oauth/client-store.js.map +1 -0
  59. package/dist/oauth/code-store.d.ts +48 -0
  60. package/dist/oauth/code-store.d.ts.map +1 -0
  61. package/dist/oauth/code-store.js +89 -0
  62. package/dist/oauth/code-store.js.map +1 -0
  63. package/dist/oauth/index.d.ts +13 -0
  64. package/dist/oauth/index.d.ts.map +1 -0
  65. package/dist/oauth/index.js +21 -0
  66. package/dist/oauth/index.js.map +1 -0
  67. package/dist/oauth/oauth-handler.d.ts +101 -0
  68. package/dist/oauth/oauth-handler.d.ts.map +1 -0
  69. package/dist/oauth/oauth-handler.js +577 -0
  70. package/dist/oauth/oauth-handler.js.map +1 -0
  71. package/dist/oauth/oauth-server.d.ts +165 -0
  72. package/dist/oauth/oauth-server.d.ts.map +1 -0
  73. package/dist/oauth/oauth-server.js +489 -0
  74. package/dist/oauth/oauth-server.js.map +1 -0
  75. package/dist/oauth/pkce.d.ts +48 -0
  76. package/dist/oauth/pkce.d.ts.map +1 -0
  77. package/dist/oauth/pkce.js +106 -0
  78. package/dist/oauth/pkce.js.map +1 -0
  79. package/dist/oauth/refresh-token-store.d.ts +45 -0
  80. package/dist/oauth/refresh-token-store.d.ts.map +1 -0
  81. package/dist/oauth/refresh-token-store.js +98 -0
  82. package/dist/oauth/refresh-token-store.js.map +1 -0
  83. package/dist/oauth/token-service.d.ts +46 -0
  84. package/dist/oauth/token-service.d.ts.map +1 -0
  85. package/dist/oauth/token-service.js +199 -0
  86. package/dist/oauth/token-service.js.map +1 -0
  87. package/dist/oauth/types.d.ts +264 -0
  88. package/dist/oauth/types.d.ts.map +1 -0
  89. package/dist/oauth/types.js +37 -0
  90. package/dist/oauth/types.js.map +1 -0
  91. package/dist/version.d.ts +9 -0
  92. package/dist/version.d.ts.map +1 -0
  93. package/dist/version.js +11 -0
  94. package/dist/version.js.map +1 -0
  95. package/package.json +1 -1
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Calendar Event Deleter Service
3
+ * Handles deleting calendar events via EventKit
4
+ * Requirements: 19.1-19.12
5
+ *
6
+ * Supports:
7
+ * - Single event deletion by ID
8
+ * - Batch event deletion
9
+ * - Calendar-specific deletion
10
+ * - UUID extraction from full IDs
11
+ */
12
+ import { retryWithBackoff, isRetryableError } from '../utils/retry.js';
13
+ /**
14
+ * Default retry options for calendar operations
15
+ */
16
+ const RETRY_OPTIONS = {
17
+ maxAttempts: 3,
18
+ initialDelay: 500,
19
+ maxDelay: 5000,
20
+ shouldRetry: isRetryableError,
21
+ };
22
+ /**
23
+ * Rate limit delay between batch operations (ms)
24
+ */
25
+ const BATCH_DELAY_MS = 100;
26
+ /**
27
+ * Extract UUID from event ID
28
+ * Requirement: 19.4, 19.5
29
+ *
30
+ * @param eventId - Full event ID or UUID
31
+ * @returns UUID part of the event ID
32
+ */
33
+ export function extractEventUid(eventId) {
34
+ if (!eventId) {
35
+ return '';
36
+ }
37
+ const trimmed = eventId.trim();
38
+ if (!trimmed) {
39
+ return '';
40
+ }
41
+ // If contains colon, extract the last part (UUID)
42
+ const lastColonIndex = trimmed.lastIndexOf(':');
43
+ if (lastColonIndex !== -1) {
44
+ return trimmed.substring(lastColonIndex + 1);
45
+ }
46
+ return trimmed;
47
+ }
48
+ /**
49
+ * Calendar Event Deleter Service
50
+ * Deletes calendar events via EventKit on macOS
51
+ */
52
+ export class CalendarEventDeleterService {
53
+ runAppleScript = null;
54
+ /**
55
+ * Detect current platform
56
+ */
57
+ async detectPlatform() {
58
+ if (typeof process !== 'undefined' && process.platform === 'darwin') {
59
+ return {
60
+ platform: 'macos',
61
+ hasEventKitAccess: true,
62
+ supportsEventDeletion: true,
63
+ };
64
+ }
65
+ return {
66
+ platform: 'unknown',
67
+ hasEventKitAccess: false,
68
+ supportsEventDeletion: false,
69
+ };
70
+ }
71
+ /**
72
+ * Check if EventKit is available for event deletion
73
+ */
74
+ async isEventKitAvailable() {
75
+ const platform = await this.detectPlatform();
76
+ return platform.hasEventKitAccess;
77
+ }
78
+ /**
79
+ * Validate delete event request
80
+ * Requirement: 19.2
81
+ */
82
+ validateRequest(request) {
83
+ if (!request.eventId || request.eventId.trim() === '') {
84
+ return '無効なイベントID: イベントIDが空です';
85
+ }
86
+ return null;
87
+ }
88
+ /**
89
+ * Validate batch delete request
90
+ * Requirement: 19.10
91
+ */
92
+ validateBatchRequest(request) {
93
+ if (!request.eventIds || request.eventIds.length === 0) {
94
+ return '無効なリクエスト: イベントIDの配列が空です';
95
+ }
96
+ for (let i = 0; i < request.eventIds.length; i++) {
97
+ if (!request.eventIds[i] || request.eventIds[i].trim() === '') {
98
+ return `無効なイベントID: インデックス${i}のイベントIDが空です`;
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+ /**
104
+ * Delete a calendar event
105
+ * Requirement: 19.1
106
+ */
107
+ async deleteEvent(request) {
108
+ // Validate input
109
+ const validationError = this.validateRequest(request);
110
+ if (validationError) {
111
+ return {
112
+ success: false,
113
+ eventId: request.eventId,
114
+ error: validationError,
115
+ message: 'イベントの削除に失敗しました',
116
+ };
117
+ }
118
+ try {
119
+ // Check platform availability
120
+ const isAvailable = await this.isEventKitAvailable();
121
+ if (!isAvailable) {
122
+ return {
123
+ success: false,
124
+ eventId: request.eventId,
125
+ error: 'カレンダー統合がこのプラットフォームで利用できません。macOSで実行してください。',
126
+ message: 'イベントの削除に失敗しました',
127
+ };
128
+ }
129
+ // Delete event via EventKit
130
+ const result = await this.deleteEventViaEventKit(request);
131
+ if (result.success) {
132
+ result.message = this.generateSuccessMessage(result);
133
+ }
134
+ return result;
135
+ }
136
+ catch (error) {
137
+ return {
138
+ success: false,
139
+ eventId: request.eventId,
140
+ error: `EventKitエラー: ${error instanceof Error ? error.message : 'Unknown error'}`,
141
+ message: 'イベントの削除に失敗しました',
142
+ };
143
+ }
144
+ }
145
+ /**
146
+ * Delete multiple calendar events
147
+ * Requirement: 19.10
148
+ */
149
+ async deleteEventsBatch(request) {
150
+ // Validate input
151
+ const validationError = this.validateBatchRequest(request);
152
+ if (validationError) {
153
+ return {
154
+ success: false,
155
+ totalCount: 0,
156
+ successCount: 0,
157
+ failedCount: 0,
158
+ results: [],
159
+ error: validationError,
160
+ message: 'イベントの削除に失敗しました',
161
+ };
162
+ }
163
+ const results = [];
164
+ let successCount = 0;
165
+ let failedCount = 0;
166
+ // Process each event sequentially with rate limiting
167
+ for (let i = 0; i < request.eventIds.length; i++) {
168
+ const eventId = request.eventIds[i];
169
+ const result = await this.deleteEvent({
170
+ eventId,
171
+ calendarName: request.calendarName,
172
+ });
173
+ results.push(result);
174
+ if (result.success) {
175
+ successCount++;
176
+ }
177
+ else {
178
+ failedCount++;
179
+ }
180
+ // Add delay between operations (except for the last one)
181
+ if (i < request.eventIds.length - 1) {
182
+ await this.delay(BATCH_DELAY_MS);
183
+ }
184
+ }
185
+ const batchResult = {
186
+ success: successCount > 0 && failedCount === 0,
187
+ totalCount: request.eventIds.length,
188
+ successCount,
189
+ failedCount,
190
+ results,
191
+ message: '',
192
+ };
193
+ batchResult.message = this.generateBatchSummaryMessage(batchResult);
194
+ return batchResult;
195
+ }
196
+ /**
197
+ * Build AppleScriptObjC script for deleting event via EventKit
198
+ * Requirement: 19.6
199
+ */
200
+ buildDeleteEventScript(eventId, calendarName) {
201
+ const uid = extractEventUid(eventId);
202
+ const escapedUid = uid.replace(/"/g, '\\"');
203
+ // Build calendar filter section
204
+ let calendarFilterSection = '';
205
+ if (calendarName) {
206
+ const escapedCalendarName = calendarName.replace(/"/g, '\\"');
207
+ calendarFilterSection = `
208
+ -- Filter by calendar name
209
+ set targetCalendarName to "${escapedCalendarName}"
210
+ set eventCalendarName to (theEvent's calendar()'s title()) as text
211
+ if eventCalendarName is not equal to targetCalendarName then
212
+ return "ERROR:指定されたカレンダーにイベントが見つかりません: " & targetCalendarName
213
+ end if
214
+
215
+ -- Check if calendar allows modifications
216
+ set canModify to ((theEvent's calendar())'s allowsContentModifications()) as boolean
217
+ if not canModify then
218
+ return "ERROR:読み取り専用カレンダーからは削除できません: " & eventCalendarName
219
+ end if`;
220
+ }
221
+ else {
222
+ calendarFilterSection = `
223
+ -- Check if calendar allows modifications
224
+ set canModify to ((theEvent's calendar())'s allowsContentModifications()) as boolean
225
+ if not canModify then
226
+ set calendarName to (theEvent's calendar()'s title()) as text
227
+ return "ERROR:読み取り専用カレンダーからは削除できません: " & calendarName
228
+ end if`;
229
+ }
230
+ return `
231
+ use AppleScript version "2.7"
232
+ use framework "Foundation"
233
+ use framework "EventKit"
234
+ use scripting additions
235
+
236
+ -- Create EventKit store
237
+ set theStore to current application's EKEventStore's alloc()'s init()
238
+
239
+ -- Request calendar access
240
+ theStore's requestFullAccessToEventsWithCompletion:(missing value)
241
+ delay 0.5
242
+
243
+ -- Check access
244
+ set accessStatus to current application's EKEventStore's authorizationStatusForEntityType:0
245
+ if accessStatus is not 3 then
246
+ return "ERROR:カレンダーへのアクセス権限がありません"
247
+ end if
248
+
249
+ -- Find event by identifier
250
+ set eventIdentifier to "${escapedUid}"
251
+ set theEvent to theStore's calendarItemWithIdentifier:eventIdentifier
252
+
253
+ if theEvent is missing value then
254
+ return "ERROR:イベントが見つかりません: " & eventIdentifier
255
+ end if
256
+
257
+ -- Verify it's an event (not a reminder)
258
+ set eventClass to theEvent's |class|()
259
+ if eventClass is not (current application's EKEvent) then
260
+ return "ERROR:指定されたIDはイベントではありません"
261
+ end if
262
+
263
+ ${calendarFilterSection}
264
+
265
+ -- Get event details before deletion
266
+ set eventTitle to (theEvent's title()) as text
267
+ set calendarName to (theEvent's calendar()'s title()) as text
268
+
269
+ -- Delete the event
270
+ set deleteSuccess to theStore's removeEvent:theEvent span:0 |error|:(missing value)
271
+
272
+ if deleteSuccess then
273
+ return "SUCCESS|" & eventIdentifier & "|" & eventTitle & "|" & calendarName
274
+ else
275
+ return "ERROR:イベントの削除に失敗しました"
276
+ end if`;
277
+ }
278
+ /**
279
+ * Delete event via EventKit
280
+ * @internal
281
+ */
282
+ async deleteEventViaEventKit(request) {
283
+ try {
284
+ // Lazy load run-applescript
285
+ if (!this.runAppleScript) {
286
+ const module = await import('run-applescript');
287
+ this.runAppleScript = module.runAppleScript;
288
+ }
289
+ const uid = extractEventUid(request.eventId);
290
+ const script = this.buildDeleteEventScript(uid, request.calendarName);
291
+ // Use retry with exponential backoff
292
+ const result = await retryWithBackoff(async () => {
293
+ return await this.runAppleScript(script);
294
+ }, {
295
+ ...RETRY_OPTIONS,
296
+ onRetry: (error, attempt) => {
297
+ console.error(`EventKit delete event retry attempt ${attempt}: ${error.message}`);
298
+ },
299
+ });
300
+ return this.parseDeleteEventResult(result, request.eventId);
301
+ }
302
+ catch (error) {
303
+ return {
304
+ success: false,
305
+ eventId: request.eventId,
306
+ error: `EventKitエラー: ${error instanceof Error ? error.message : 'Unknown error'}`,
307
+ message: 'イベントの削除に失敗しました',
308
+ };
309
+ }
310
+ }
311
+ /**
312
+ * Parse delete event result
313
+ * Requirement: 19.7
314
+ */
315
+ parseDeleteEventResult(result, eventId) {
316
+ if (result.startsWith('ERROR:')) {
317
+ return {
318
+ success: false,
319
+ eventId,
320
+ error: result.replace('ERROR:', ''),
321
+ message: 'イベントの削除に失敗しました',
322
+ };
323
+ }
324
+ if (result.startsWith('SUCCESS|')) {
325
+ const parts = result.split('|');
326
+ const deletedEventId = parts[1] || eventId;
327
+ const title = parts[2];
328
+ const calendarName = parts[3];
329
+ return {
330
+ success: true,
331
+ eventId: deletedEventId,
332
+ title,
333
+ calendarName,
334
+ message: '',
335
+ };
336
+ }
337
+ return {
338
+ success: false,
339
+ eventId,
340
+ error: '予期しない応答形式',
341
+ message: 'イベントの削除に失敗しました',
342
+ };
343
+ }
344
+ /**
345
+ * Generate success message for single deletion
346
+ * Requirement: 19.9
347
+ */
348
+ generateSuccessMessage(result) {
349
+ if (!result.success) {
350
+ return 'イベントの削除に失敗しました';
351
+ }
352
+ if (result.calendarName) {
353
+ return `イベント「${result.title}」を削除しました(カレンダー: ${result.calendarName})`;
354
+ }
355
+ return `イベント「${result.title}」を削除しました`;
356
+ }
357
+ /**
358
+ * Generate summary message for batch deletion
359
+ * Requirement: 19.11
360
+ */
361
+ generateBatchSummaryMessage(result) {
362
+ if (result.successCount === result.totalCount) {
363
+ return `${result.totalCount}件のイベントを削除しました`;
364
+ }
365
+ if (result.successCount === 0) {
366
+ return `イベントの削除に失敗しました(0件成功、${result.failedCount}件失敗)`;
367
+ }
368
+ return `${result.totalCount}件中${result.successCount}件のイベントを削除しました(${result.failedCount}件失敗)`;
369
+ }
370
+ /**
371
+ * Delay helper for rate limiting
372
+ * @internal
373
+ */
374
+ delay(ms) {
375
+ return new Promise(resolve => setTimeout(resolve, ms));
376
+ }
377
+ }
378
+ //# sourceMappingURL=calendar-event-deleter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-event-deleter.js","sourceRoot":"","sources":["../../src/integrations/calendar-event-deleter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Calendar Event Response Service
3
+ * Handles responding to calendar events (accept/decline/tentative)
4
+ * Requirements: 17.1-17.12
5
+ *
6
+ * Supports:
7
+ * - iCloud/Local calendars via EventKit
8
+ * - Google Calendar events (CalendarType detection)
9
+ * - Exchange calendar events (CalendarType detection)
10
+ * - Batch processing for multiple events
11
+ */
12
+ /**
13
+ * Response type for calendar events
14
+ * Requirement: 17.2
15
+ */
16
+ export type EventResponseType = 'accept' | 'decline' | 'tentative';
17
+ /**
18
+ * Calendar type detection
19
+ * Requirement: 17.5, 17.6
20
+ */
21
+ export type CalendarType = 'google' | 'icloud' | 'exchange' | 'local';
22
+ /**
23
+ * Participant status in calendar events
24
+ */
25
+ export type EventParticipantStatus = 'accepted' | 'declined' | 'tentative' | 'pending' | 'unknown';
26
+ /**
27
+ * Platform information for calendar integration
28
+ */
29
+ export interface CalendarResponsePlatformInfo {
30
+ platform: 'macos' | 'ios' | 'ipados' | 'web' | 'unknown';
31
+ hasEventKitAccess: boolean;
32
+ supportsEventResponse: boolean;
33
+ }
34
+ /**
35
+ * Event response request
36
+ * Requirement: 17.2
37
+ */
38
+ export interface EventResponseRequest {
39
+ eventId: string;
40
+ response: EventResponseType;
41
+ comment?: string;
42
+ }
43
+ /**
44
+ * Event response result
45
+ * Requirement: 17.11
46
+ */
47
+ export interface EventResponseResult {
48
+ success: boolean;
49
+ eventId: string;
50
+ eventTitle?: string;
51
+ newStatus?: EventParticipantStatus;
52
+ method?: string;
53
+ message?: string;
54
+ error?: string;
55
+ skipped?: boolean;
56
+ reason?: string;
57
+ instanceOnly?: boolean;
58
+ }
59
+ /**
60
+ * Batch response request
61
+ * Requirement: 17.3, 17.4
62
+ */
63
+ export interface BatchResponseRequest {
64
+ eventIds: string[];
65
+ response: EventResponseType;
66
+ comment?: string;
67
+ }
68
+ /**
69
+ * Batch response result
70
+ * Requirement: 17.12
71
+ */
72
+ export interface BatchResponseResult {
73
+ success: boolean;
74
+ summary: {
75
+ total: number;
76
+ succeeded: number;
77
+ skipped: number;
78
+ failed: number;
79
+ };
80
+ details: {
81
+ succeeded: Array<{
82
+ id: string;
83
+ title: string;
84
+ reason: string;
85
+ }>;
86
+ skipped: Array<{
87
+ id: string;
88
+ title: string;
89
+ reason: string;
90
+ }>;
91
+ failed: Array<{
92
+ id: string;
93
+ title: string;
94
+ error: string;
95
+ }>;
96
+ };
97
+ message: string;
98
+ }
99
+ /**
100
+ * Event details for validation
101
+ */
102
+ export interface EventDetails {
103
+ id: string;
104
+ title: string;
105
+ isOrganizer: boolean;
106
+ hasAttendees: boolean;
107
+ isReadOnly: boolean;
108
+ calendarType: CalendarType;
109
+ isRecurringInstance?: boolean;
110
+ isAllDay?: boolean;
111
+ }
112
+ /**
113
+ * Response validation result
114
+ */
115
+ export interface CanRespondResult {
116
+ canRespond: boolean;
117
+ reason?: string;
118
+ }
119
+ /**
120
+ * Calendar Event Response Service
121
+ * Handles responding to calendar events
122
+ */
123
+ export declare class CalendarEventResponseService {
124
+ private runAppleScript;
125
+ /**
126
+ * Detect current platform
127
+ */
128
+ detectPlatform(): Promise<CalendarResponsePlatformInfo>;
129
+ /**
130
+ * Check if EventKit is available
131
+ */
132
+ isEventKitAvailable(): Promise<boolean>;
133
+ /**
134
+ * Detect calendar type from event ID
135
+ * Requirement: 17.5, 17.6
136
+ */
137
+ detectCalendarType(eventId: string): Promise<CalendarType>;
138
+ /**
139
+ * Check if an event can be responded to
140
+ * Requirement: 17.7, 17.9, 17.10
141
+ */
142
+ canRespondToEvent(event: {
143
+ id: string;
144
+ title: string;
145
+ isOrganizer: boolean;
146
+ hasAttendees: boolean;
147
+ isReadOnly: boolean;
148
+ }): Promise<CanRespondResult>;
149
+ /**
150
+ * Respond to a single calendar event
151
+ * Requirement: 17.1
152
+ */
153
+ respondToEvent(request: EventResponseRequest): Promise<EventResponseResult>;
154
+ /**
155
+ * Respond to multiple calendar events
156
+ * Requirement: 17.3, 17.4
157
+ */
158
+ respondToEventsBatch(request: BatchResponseRequest): Promise<BatchResponseResult>;
159
+ /**
160
+ * Fetch event details via EventKit
161
+ * @internal
162
+ */
163
+ private fetchEventDetails;
164
+ /**
165
+ * Build AppleScript for fetching event details
166
+ * @internal
167
+ */
168
+ private buildFetchEventDetailsScript;
169
+ /**
170
+ * Parse event details result
171
+ * @internal
172
+ */
173
+ private parseEventDetailsResult;
174
+ /**
175
+ * Respond via EventKit
176
+ * Requirement: 17.6
177
+ * @internal
178
+ */
179
+ private respondViaEventKit;
180
+ /**
181
+ * Build AppleScript for responding to event
182
+ * Note: EventKit's EKParticipant is read-only, so we use Calendar.app as fallback
183
+ * @internal
184
+ */
185
+ private buildRespondScript;
186
+ /**
187
+ * Convert response type to EventKit status constant
188
+ * @internal
189
+ */
190
+ private responseTypeToEventKitStatus;
191
+ /**
192
+ * Convert response type to participant status
193
+ * @internal
194
+ */
195
+ private responseTypeToStatus;
196
+ /**
197
+ * Get response reason text
198
+ * @internal
199
+ */
200
+ private getResponseReasonText;
201
+ /**
202
+ * Generate response message
203
+ * Requirement: 17.11
204
+ */
205
+ generateResponseMessage(response: EventResponseType, eventTitle: string): string;
206
+ /**
207
+ * Generate batch summary message
208
+ * Requirement: 17.12
209
+ * @internal
210
+ */
211
+ private generateBatchSummaryMessage;
212
+ }
213
+ //# sourceMappingURL=calendar-event-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-event-response.d.ts","sourceRoot":"","sources":["../../src/integrations/calendar-event-response.ts"],"names":[],"mappings":"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"}