@corsair-dev/googlecalendar 0.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.
@@ -0,0 +1,335 @@
1
+ export declare const GoogleCalendarSchema: {
2
+ readonly version: "1.0.0";
3
+ readonly entities: {
4
+ readonly events: import("zod").ZodObject<{
5
+ id: import("zod").ZodString;
6
+ status: import("zod").ZodOptional<import("zod").ZodEnum<["confirmed", "tentative", "cancelled"]>>;
7
+ htmlLink: import("zod").ZodOptional<import("zod").ZodString>;
8
+ created: import("zod").ZodOptional<import("zod").ZodString>;
9
+ updated: import("zod").ZodOptional<import("zod").ZodString>;
10
+ summary: import("zod").ZodOptional<import("zod").ZodString>;
11
+ description: import("zod").ZodOptional<import("zod").ZodString>;
12
+ location: import("zod").ZodOptional<import("zod").ZodString>;
13
+ colorId: import("zod").ZodOptional<import("zod").ZodString>;
14
+ creator: import("zod").ZodOptional<import("zod").ZodObject<{
15
+ id: import("zod").ZodOptional<import("zod").ZodString>;
16
+ email: import("zod").ZodOptional<import("zod").ZodString>;
17
+ displayName: import("zod").ZodOptional<import("zod").ZodString>;
18
+ self: import("zod").ZodOptional<import("zod").ZodBoolean>;
19
+ }, "strip", import("zod").ZodTypeAny, {
20
+ id?: string | undefined;
21
+ email?: string | undefined;
22
+ displayName?: string | undefined;
23
+ self?: boolean | undefined;
24
+ }, {
25
+ id?: string | undefined;
26
+ email?: string | undefined;
27
+ displayName?: string | undefined;
28
+ self?: boolean | undefined;
29
+ }>>;
30
+ organizer: import("zod").ZodOptional<import("zod").ZodObject<{
31
+ id: import("zod").ZodOptional<import("zod").ZodString>;
32
+ email: import("zod").ZodOptional<import("zod").ZodString>;
33
+ displayName: import("zod").ZodOptional<import("zod").ZodString>;
34
+ self: import("zod").ZodOptional<import("zod").ZodBoolean>;
35
+ }, "strip", import("zod").ZodTypeAny, {
36
+ id?: string | undefined;
37
+ email?: string | undefined;
38
+ displayName?: string | undefined;
39
+ self?: boolean | undefined;
40
+ }, {
41
+ id?: string | undefined;
42
+ email?: string | undefined;
43
+ displayName?: string | undefined;
44
+ self?: boolean | undefined;
45
+ }>>;
46
+ start: import("zod").ZodOptional<import("zod").ZodObject<{
47
+ date: import("zod").ZodOptional<import("zod").ZodString>;
48
+ dateTime: import("zod").ZodOptional<import("zod").ZodString>;
49
+ timeZone: import("zod").ZodOptional<import("zod").ZodString>;
50
+ }, "strip", import("zod").ZodTypeAny, {
51
+ date?: string | undefined;
52
+ dateTime?: string | undefined;
53
+ timeZone?: string | undefined;
54
+ }, {
55
+ date?: string | undefined;
56
+ dateTime?: string | undefined;
57
+ timeZone?: string | undefined;
58
+ }>>;
59
+ end: import("zod").ZodOptional<import("zod").ZodObject<{
60
+ date: import("zod").ZodOptional<import("zod").ZodString>;
61
+ dateTime: import("zod").ZodOptional<import("zod").ZodString>;
62
+ timeZone: import("zod").ZodOptional<import("zod").ZodString>;
63
+ }, "strip", import("zod").ZodTypeAny, {
64
+ date?: string | undefined;
65
+ dateTime?: string | undefined;
66
+ timeZone?: string | undefined;
67
+ }, {
68
+ date?: string | undefined;
69
+ dateTime?: string | undefined;
70
+ timeZone?: string | undefined;
71
+ }>>;
72
+ endTimeUnspecified: import("zod").ZodOptional<import("zod").ZodBoolean>;
73
+ recurrence: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
74
+ recurringEventId: import("zod").ZodOptional<import("zod").ZodString>;
75
+ originalStartTime: import("zod").ZodOptional<import("zod").ZodObject<{
76
+ date: import("zod").ZodOptional<import("zod").ZodString>;
77
+ dateTime: import("zod").ZodOptional<import("zod").ZodString>;
78
+ timeZone: import("zod").ZodOptional<import("zod").ZodString>;
79
+ }, "strip", import("zod").ZodTypeAny, {
80
+ date?: string | undefined;
81
+ dateTime?: string | undefined;
82
+ timeZone?: string | undefined;
83
+ }, {
84
+ date?: string | undefined;
85
+ dateTime?: string | undefined;
86
+ timeZone?: string | undefined;
87
+ }>>;
88
+ transparency: import("zod").ZodOptional<import("zod").ZodEnum<["opaque", "transparent"]>>;
89
+ visibility: import("zod").ZodOptional<import("zod").ZodEnum<["default", "public", "private", "confidential"]>>;
90
+ iCalUID: import("zod").ZodOptional<import("zod").ZodString>;
91
+ sequence: import("zod").ZodOptional<import("zod").ZodNumber>;
92
+ attendees: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
93
+ id: import("zod").ZodOptional<import("zod").ZodString>;
94
+ email: import("zod").ZodOptional<import("zod").ZodString>;
95
+ displayName: import("zod").ZodOptional<import("zod").ZodString>;
96
+ organizer: import("zod").ZodOptional<import("zod").ZodBoolean>;
97
+ self: import("zod").ZodOptional<import("zod").ZodBoolean>;
98
+ resource: import("zod").ZodOptional<import("zod").ZodBoolean>;
99
+ optional: import("zod").ZodOptional<import("zod").ZodBoolean>;
100
+ responseStatus: import("zod").ZodOptional<import("zod").ZodEnum<["needsAction", "declined", "tentative", "accepted"]>>;
101
+ comment: import("zod").ZodOptional<import("zod").ZodString>;
102
+ additionalGuests: import("zod").ZodOptional<import("zod").ZodNumber>;
103
+ }, "strip", import("zod").ZodTypeAny, {
104
+ id?: string | undefined;
105
+ email?: string | undefined;
106
+ displayName?: string | undefined;
107
+ organizer?: boolean | undefined;
108
+ self?: boolean | undefined;
109
+ resource?: boolean | undefined;
110
+ optional?: boolean | undefined;
111
+ responseStatus?: "needsAction" | "declined" | "tentative" | "accepted" | undefined;
112
+ comment?: string | undefined;
113
+ additionalGuests?: number | undefined;
114
+ }, {
115
+ id?: string | undefined;
116
+ email?: string | undefined;
117
+ displayName?: string | undefined;
118
+ organizer?: boolean | undefined;
119
+ self?: boolean | undefined;
120
+ resource?: boolean | undefined;
121
+ optional?: boolean | undefined;
122
+ responseStatus?: "needsAction" | "declined" | "tentative" | "accepted" | undefined;
123
+ comment?: string | undefined;
124
+ additionalGuests?: number | undefined;
125
+ }>, "many">>;
126
+ attendeesOmitted: import("zod").ZodOptional<import("zod").ZodBoolean>;
127
+ hangoutLink: import("zod").ZodOptional<import("zod").ZodString>;
128
+ reminders: import("zod").ZodOptional<import("zod").ZodObject<{
129
+ useDefault: import("zod").ZodOptional<import("zod").ZodBoolean>;
130
+ overrides: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
131
+ method: import("zod").ZodOptional<import("zod").ZodEnum<["email", "popup"]>>;
132
+ minutes: import("zod").ZodOptional<import("zod").ZodNumber>;
133
+ }, "strip", import("zod").ZodTypeAny, {
134
+ method?: "email" | "popup" | undefined;
135
+ minutes?: number | undefined;
136
+ }, {
137
+ method?: "email" | "popup" | undefined;
138
+ minutes?: number | undefined;
139
+ }>, "many">>;
140
+ }, "strip", import("zod").ZodTypeAny, {
141
+ useDefault?: boolean | undefined;
142
+ overrides?: {
143
+ method?: "email" | "popup" | undefined;
144
+ minutes?: number | undefined;
145
+ }[] | undefined;
146
+ }, {
147
+ useDefault?: boolean | undefined;
148
+ overrides?: {
149
+ method?: "email" | "popup" | undefined;
150
+ minutes?: number | undefined;
151
+ }[] | undefined;
152
+ }>>;
153
+ anyoneCanAddSelf: import("zod").ZodOptional<import("zod").ZodBoolean>;
154
+ guestsCanInviteOthers: import("zod").ZodOptional<import("zod").ZodBoolean>;
155
+ guestsCanModify: import("zod").ZodOptional<import("zod").ZodBoolean>;
156
+ guestsCanSeeOtherGuests: import("zod").ZodOptional<import("zod").ZodBoolean>;
157
+ privateCopy: import("zod").ZodOptional<import("zod").ZodBoolean>;
158
+ locked: import("zod").ZodOptional<import("zod").ZodBoolean>;
159
+ eventType: import("zod").ZodOptional<import("zod").ZodEnum<["default", "outOfOffice", "focusTime", "workingLocation"]>>;
160
+ calendarId: import("zod").ZodOptional<import("zod").ZodString>;
161
+ createdAt: import("zod").ZodOptional<import("zod").ZodDate>;
162
+ }, "strip", import("zod").ZodTypeAny, {
163
+ id: string;
164
+ location?: string | undefined;
165
+ status?: "tentative" | "confirmed" | "cancelled" | undefined;
166
+ start?: {
167
+ date?: string | undefined;
168
+ dateTime?: string | undefined;
169
+ timeZone?: string | undefined;
170
+ } | undefined;
171
+ end?: {
172
+ date?: string | undefined;
173
+ dateTime?: string | undefined;
174
+ timeZone?: string | undefined;
175
+ } | undefined;
176
+ description?: string | undefined;
177
+ organizer?: {
178
+ id?: string | undefined;
179
+ email?: string | undefined;
180
+ displayName?: string | undefined;
181
+ self?: boolean | undefined;
182
+ } | undefined;
183
+ summary?: string | undefined;
184
+ attendees?: {
185
+ id?: string | undefined;
186
+ email?: string | undefined;
187
+ displayName?: string | undefined;
188
+ organizer?: boolean | undefined;
189
+ self?: boolean | undefined;
190
+ resource?: boolean | undefined;
191
+ optional?: boolean | undefined;
192
+ responseStatus?: "needsAction" | "declined" | "tentative" | "accepted" | undefined;
193
+ comment?: string | undefined;
194
+ additionalGuests?: number | undefined;
195
+ }[] | undefined;
196
+ recurrence?: string[] | undefined;
197
+ colorId?: string | undefined;
198
+ transparency?: "opaque" | "transparent" | undefined;
199
+ visibility?: "default" | "public" | "private" | "confidential" | undefined;
200
+ eventType?: "default" | "outOfOffice" | "focusTime" | "workingLocation" | undefined;
201
+ reminders?: {
202
+ useDefault?: boolean | undefined;
203
+ overrides?: {
204
+ method?: "email" | "popup" | undefined;
205
+ minutes?: number | undefined;
206
+ }[] | undefined;
207
+ } | undefined;
208
+ guestsCanModify?: boolean | undefined;
209
+ guestsCanInviteOthers?: boolean | undefined;
210
+ guestsCanSeeOtherGuests?: boolean | undefined;
211
+ anyoneCanAddSelf?: boolean | undefined;
212
+ sequence?: number | undefined;
213
+ originalStartTime?: {
214
+ date?: string | undefined;
215
+ dateTime?: string | undefined;
216
+ timeZone?: string | undefined;
217
+ } | undefined;
218
+ recurringEventId?: string | undefined;
219
+ calendarId?: string | undefined;
220
+ updated?: string | undefined;
221
+ iCalUID?: string | undefined;
222
+ htmlLink?: string | undefined;
223
+ created?: string | undefined;
224
+ creator?: {
225
+ id?: string | undefined;
226
+ email?: string | undefined;
227
+ displayName?: string | undefined;
228
+ self?: boolean | undefined;
229
+ } | undefined;
230
+ endTimeUnspecified?: boolean | undefined;
231
+ attendeesOmitted?: boolean | undefined;
232
+ hangoutLink?: string | undefined;
233
+ privateCopy?: boolean | undefined;
234
+ locked?: boolean | undefined;
235
+ createdAt?: Date | undefined;
236
+ }, {
237
+ id: string;
238
+ location?: string | undefined;
239
+ status?: "tentative" | "confirmed" | "cancelled" | undefined;
240
+ start?: {
241
+ date?: string | undefined;
242
+ dateTime?: string | undefined;
243
+ timeZone?: string | undefined;
244
+ } | undefined;
245
+ end?: {
246
+ date?: string | undefined;
247
+ dateTime?: string | undefined;
248
+ timeZone?: string | undefined;
249
+ } | undefined;
250
+ description?: string | undefined;
251
+ organizer?: {
252
+ id?: string | undefined;
253
+ email?: string | undefined;
254
+ displayName?: string | undefined;
255
+ self?: boolean | undefined;
256
+ } | undefined;
257
+ summary?: string | undefined;
258
+ attendees?: {
259
+ id?: string | undefined;
260
+ email?: string | undefined;
261
+ displayName?: string | undefined;
262
+ organizer?: boolean | undefined;
263
+ self?: boolean | undefined;
264
+ resource?: boolean | undefined;
265
+ optional?: boolean | undefined;
266
+ responseStatus?: "needsAction" | "declined" | "tentative" | "accepted" | undefined;
267
+ comment?: string | undefined;
268
+ additionalGuests?: number | undefined;
269
+ }[] | undefined;
270
+ recurrence?: string[] | undefined;
271
+ colorId?: string | undefined;
272
+ transparency?: "opaque" | "transparent" | undefined;
273
+ visibility?: "default" | "public" | "private" | "confidential" | undefined;
274
+ eventType?: "default" | "outOfOffice" | "focusTime" | "workingLocation" | undefined;
275
+ reminders?: {
276
+ useDefault?: boolean | undefined;
277
+ overrides?: {
278
+ method?: "email" | "popup" | undefined;
279
+ minutes?: number | undefined;
280
+ }[] | undefined;
281
+ } | undefined;
282
+ guestsCanModify?: boolean | undefined;
283
+ guestsCanInviteOthers?: boolean | undefined;
284
+ guestsCanSeeOtherGuests?: boolean | undefined;
285
+ anyoneCanAddSelf?: boolean | undefined;
286
+ sequence?: number | undefined;
287
+ originalStartTime?: {
288
+ date?: string | undefined;
289
+ dateTime?: string | undefined;
290
+ timeZone?: string | undefined;
291
+ } | undefined;
292
+ recurringEventId?: string | undefined;
293
+ calendarId?: string | undefined;
294
+ updated?: string | undefined;
295
+ iCalUID?: string | undefined;
296
+ htmlLink?: string | undefined;
297
+ created?: string | undefined;
298
+ creator?: {
299
+ id?: string | undefined;
300
+ email?: string | undefined;
301
+ displayName?: string | undefined;
302
+ self?: boolean | undefined;
303
+ } | undefined;
304
+ endTimeUnspecified?: boolean | undefined;
305
+ attendeesOmitted?: boolean | undefined;
306
+ hangoutLink?: string | undefined;
307
+ privateCopy?: boolean | undefined;
308
+ locked?: boolean | undefined;
309
+ createdAt?: Date | undefined;
310
+ }>;
311
+ readonly calendars: import("zod").ZodObject<{
312
+ id: import("zod").ZodString;
313
+ summary: import("zod").ZodOptional<import("zod").ZodString>;
314
+ description: import("zod").ZodOptional<import("zod").ZodString>;
315
+ location: import("zod").ZodOptional<import("zod").ZodString>;
316
+ timeZone: import("zod").ZodOptional<import("zod").ZodString>;
317
+ createdAt: import("zod").ZodOptional<import("zod").ZodDate>;
318
+ }, "strip", import("zod").ZodTypeAny, {
319
+ id: string;
320
+ location?: string | undefined;
321
+ description?: string | undefined;
322
+ timeZone?: string | undefined;
323
+ summary?: string | undefined;
324
+ createdAt?: Date | undefined;
325
+ }, {
326
+ id: string;
327
+ location?: string | undefined;
328
+ description?: string | undefined;
329
+ timeZone?: string | undefined;
330
+ summary?: string | undefined;
331
+ createdAt?: Date | undefined;
332
+ }>;
333
+ };
334
+ };
335
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../schema/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMvB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Setup guide for the Google Calendar plugin.
3
+ *
4
+ * This string is read by the Corsair setup agent at runtime to walk a developer
5
+ * through configuring the integration. It is NOT intended for human readers —
6
+ * the agent interprets the instructions and asks the user one step at a time.
7
+ */
8
+ export declare const GoogleCalendarSetup = "\n## Google Calendar OAuth2 Setup\n\nGoogle Calendar uses OAuth2 and requires 4 credentials:\n- **client_id** + **client_secret** (integration-level, shared) \u2014 from your GCP OAuth app\n- **access_token** + **refresh_token** (account-level) \u2014 from the OAuth flow\n\nWalk the user through these steps exactly, one at a time:\n\n---\n\n### Step 1: Check for an existing GCP project\n\nask_human: \"Do you already have a Google Cloud Platform project you'd like to use, or should we create a new one?\"\n\n- If yes \u2192 go to Step 2.\n- If no \u2192 tell them:\n 1. Go to https://console.cloud.google.com\n 2. Click the project dropdown at the top \u2192 \"New Project\"\n 3. Name it (e.g., \"Corsair\") and click \"Create\"\n ask_human: \"Let me know once your GCP project is ready!\"\n\n---\n\n### Step 2: Enable the Google Calendar API\n\nTell them:\n- In GCP Console, go to \"APIs & Services\" \u2192 \"Library\" (left sidebar)\n- Search for \"Google Calendar API\" \u2192 click it \u2192 click \"Enable\"\n\nask_human: \"Done enabling the Google Calendar API? Let me know!\"\n\n---\n\n### Step 3: Configure the OAuth Consent Screen\n\nAsk first: \"Have you already set up an OAuth consent screen for this GCP project?\"\n\nIf not, tell them:\n- Go to \"APIs & Services\" \u2192 \"OAuth consent screen\"\n- Choose \"External\" \u2192 click \"Create\"\n- Fill in:\n - App name: anything (e.g., \"Corsair\")\n - User support email: their Google email\n - Developer contact: their email\n- Click \"Save and Continue\"\n- On Scopes \u2192 click \"Add or Remove Scopes\" \u2192 search \"calendar\" \u2192 select: https://www.googleapis.com/auth/calendar \u2192 click \"Update\" \u2192 \"Save and Continue\"\n- On Test Users \u2192 click \"Add Users\" \u2192 add their Google email \u2192 \"Save and Continue\"\n\nask_human: \"Done with the OAuth consent screen? Let me know!\"\n\n---\n\n### Step 4: Create OAuth 2.0 Credentials\n\nTell them:\n- Go to \"APIs & Services\" \u2192 \"Credentials\"\n- Click \"+ Create Credentials\" \u2192 \"OAuth client ID\"\n- Application type: **Web application**\n- Name: anything (e.g., \"Corsair Calendar\")\n- Under \"Authorized redirect URIs\" \u2192 click \"+ Add URI\" \u2192 add:\n `https://developers.google.com/oauthplayground`\n- Click \"Create\"\n- A popup shows the **Client ID** and **Client Secret** \u2014 copy both\n\nask_human: \"Have you got your Client ID and Client Secret? Let me know!\"\n\n---\n\n### Step 5: Enter Client ID and Client Secret\n\nCall get_setup_url for plugin=\"googlecalendar\" (no field \u2014 shows all fields).\nSend the message: \"Enter your Client ID and Client Secret at this URL: {URL}. Look for the 'OAuth2 Client ID' and 'OAuth2 Client Secret' fields.\"\n\nask_human: \"Let me know when you've saved the Client ID and Client Secret!\"\n\nThen call verify_setup. If client_id and client_secret are both set, move on. If not, send the URL again with a note to double-check.\n\n---\n\n### Step 6: Get Access Token and Refresh Token (OAuth Playground)\n\nTell them:\n1. Go to https://developers.google.com/oauthplayground/\n2. Click the **gear icon (\u2699\uFE0F)** top right \u2192 check \"Use your own OAuth credentials\"\n3. Enter your Client ID and Client Secret \u2192 close the settings panel\n4. In the left panel, scroll to \"Google Calendar API v3\"\n5. Check the scope: `https://www.googleapis.com/auth/calendar`\n6. Click \"Authorize APIs\" \u2192 sign in with Google \u2192 click \"Allow\"\n7. On Step 2: click the blue \"Exchange authorization code for tokens\" button\n8. In the JSON response on the right, copy:\n - `access_token`\n - `refresh_token`\n\nask_human: \"Let me know when you have both tokens!\"\n\n---\n\n### Step 7: Enter Access Token and Refresh Token\n\nCall get_setup_url for plugin=\"googlecalendar\".\nSend: \"Enter your Access Token and Refresh Token at this URL: {URL}\"\n\nask_human: \"Let me know when you've saved both tokens!\"\n\nThen call verify_setup. If all 4 fields (client_id, client_secret, access_token, refresh_token) are set, the plugin is ready!\n\n---\n\n### Step 8: Webhook Setup (Optional)\n\nTell them: \"Google Calendar is now connected! Would you like to set up webhooks so Corsair can trigger automations when your calendar events change? This requires a public HTTPS URL for your Corsair server, which we'll help you set up.\"\n\nask_human: \"Do you want to set up webhooks? Reply 'yes' or 'no'.\"\n\nIf no \u2192 call finish_setup with \"Google Calendar is all set! You can now create, read, update, and delete calendar events from Corsair.\"\n\nIf yes \u2192 proceed to Step 9.\n\n---\n\n### Step 9: Get a Public Webhook URL\n\nask_human: \"Do you already have a public HTTPS URL for this Corsair server (e.g. from Railway, Render, Vercel, or a VPS)? If so, reply with the base URL. If not, reply 'no' and I'll help you set up ngrok.\"\n\nIf they provide a URL: the webhook endpoint is `{their-url}/api/webhook`. Go to Step 11.\n\nIf 'no' \u2192 Step 10: ngrok setup.\n\n---\n\n### Step 10: Set Up ngrok\n\nTell them: \"We'll use ngrok to create a temporary public URL that tunnels to your local Corsair server. It takes about 2 minutes to set up.\"\n\n**Install ngrok** (if not already):\n- Mac: `brew install ngrok`\n- Or download from https://ngrok.com/download\n- Or: `npm install -g ngrok`\n\nask_human: \"Do you have ngrok installed? Run `which ngrok` to check. Reply 'yes' or 'no'.\"\n\nIf no: give them the install command for their OS. ask_human: \"Let me know once ngrok is installed!\"\n\n**Authenticate ngrok:**\nTell them:\n1. Sign up (free) at https://ngrok.com\n2. Go to https://dashboard.ngrok.com/get-started/your-authtoken\n3. Copy your auth token\n4. Run: `ngrok config add-authtoken YOUR_TOKEN_HERE`\n\nask_human: \"Done adding your ngrok auth token? Let me know!\"\n\n**Start the tunnel:**\nTell them: \"Now run this in a separate terminal (keep it open while using webhooks):\"\n```\nngrok http 3001\n```\n\"Copy the Forwarding URL that looks like `https://abc123.ngrok-free.app`\"\n\nask_human: \"What's the HTTPS forwarding URL from ngrok? (e.g. https://abc123.ngrok-free.app)\"\n\nThe webhook URL will be: `{their-ngrok-url}/api/webhook`\n\n---\n\n### Step 11: Create the Calendar Watch Channel\n\nNow run the watch setup script. The webhook URL is `{url-from-step-9-or-10}/api/webhook`.\n\nRun this from alongside their package.json to ensure imports will be correctly linked.\n\nUse run_script with this TypeScript code (fill in the actual webhook URL and calendar ID):\n\n```typescript\nimport * as crypto from 'node:crypto';\n\nimport * as crypto from 'node:crypto';\nimport { corsair } from './server/corsair';\n\nconst main = async () => {\n\tconst getClientId = corsair.keys.googlecalendar.get_client_id;\n\tconst getClientSecret = corsair.keys.googlecalendar.get_client_secret;\n\tconst getRefreshToken = corsair.googlecalendar.keys.get_refresh_token;\n\n\tconst [clientId, clientSecret, refreshToken] = await Promise.all([\n\t\tgetClientId(),\n\t\tgetClientSecret(),\n\t\tgetRefreshToken(),\n\t]);\n\n\tif (!clientId || !clientSecret || !refreshToken) {\n\t\tconsole.error(\n\t\t\t'Missing credentials \u2014 please complete credential setup first.',\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\t// Refresh access token\n\tconst tokenRes = await fetch('https://oauth2.googleapis.com/token', {\n\t\tmethod: 'POST',\n\t\theaders: { 'Content-Type': 'application/x-www-form-urlencoded' },\n\t\tbody: new URLSearchParams({\n\t\t\tclient_id: clientId,\n\t\t\tclient_secret: clientSecret,\n\t\t\trefresh_token: refreshToken,\n\t\t\tgrant_type: 'refresh_token',\n\t\t}),\n\t});\n\n\tif (!tokenRes.ok) {\n\t\tconst err = await tokenRes.text();\n\t\tconsole.error('Token refresh failed:', err);\n\t\tprocess.exit(1);\n\t}\n\n\tconst { access_token } = (await tokenRes.json()) as { access_token: string };\n\n\t// Create the watch channel\n\tconst channelId = crypto.randomUUID();\n\tconst WEBHOOK_URL = 'REPLACE_WITH_WEBHOOK_URL'; // e.g. https://abc123.ngrok-free.app/api/webhook\n\tconst CALENDAR_ID = 'primary'; // or specific calendar ID\n\n\tconst watchRes = await fetch(\n\t\t'https://www.googleapis.com/calendar/v3/calendars/' +\n\t\t\tencodeURIComponent(CALENDAR_ID) +\n\t\t\t'/events/watch',\n\t\t{\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\tAuthorization: 'Bearer ' + access_token,\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tid: channelId,\n\t\t\t\ttype: 'web_hook',\n\t\t\t\taddress: WEBHOOK_URL,\n\t\t\t}),\n\t\t},\n\t);\n\n\tif (!watchRes.ok) {\n\t\tconst err = await watchRes.text();\n\t\tconsole.error('Calendar watch failed:', err);\n\t\tprocess.exit(1);\n\t}\n\n\tconst data = (await watchRes.json()) as {\n\t\tid: string;\n\t\tresourceId: string;\n\t\texpiration: string;\n\t};\n\n\tconst expiration = new Date(Number(data.expiration)).toISOString();\n\tconsole.log('Watch channel created!');\n\tconsole.log('Channel ID:', channelId);\n\tconsole.log('Resource ID:', data.resourceId);\n\tconsole.log('Expiration:', expiration);\n\tconsole.log('');\n\tconsole.log('IMPORTANT: This watch channel expires on', expiration);\n\tconsole.log('To renew it, re-run this setup step before it expires.');\n};\n\nmain().catch((e: Error) => {\n console.error(e.message);\n process.exit(1);\n});\n```\n\nReplace REPLACE_WITH_WEBHOOK_URL with the actual URL and run_script it. Report the output (Channel ID, Resource ID, Expiration) to the user.\n\nThen call finish_setup with a message like: \"Google Calendar is fully set up with webhooks! Channel expires on {date} \u2014 you can re-run this setup step to renew it when needed.\"\n";
9
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../setup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,68SAgR/B,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("tsup").Options | import("tsup").Options[] | ((overrideOptions: import("tsup").Options) => import("tsup").Options | import("tsup").Options[] | Promise<import("tsup").Options | import("tsup").Options[]>);
2
+ export default _default;
3
+ //# sourceMappingURL=tsup.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsup.config.d.ts","sourceRoot":"","sources":["../tsup.config.ts"],"names":[],"mappings":";AAEA,wBAYG"}
@@ -0,0 +1,182 @@
1
+ export type EventDateTime = {
2
+ date?: string;
3
+ dateTime?: string;
4
+ timeZone?: string;
5
+ };
6
+ export type Attendee = {
7
+ id?: string;
8
+ email?: string;
9
+ displayName?: string;
10
+ organizer?: boolean;
11
+ self?: boolean;
12
+ resource?: boolean;
13
+ optional?: boolean;
14
+ responseStatus?: 'needsAction' | 'declined' | 'tentative' | 'accepted';
15
+ comment?: string;
16
+ additionalGuests?: number;
17
+ };
18
+ export type Organizer = {
19
+ id?: string;
20
+ email?: string;
21
+ displayName?: string;
22
+ self?: boolean;
23
+ };
24
+ export type Reminder = {
25
+ method?: 'email' | 'popup';
26
+ minutes?: number;
27
+ };
28
+ export type EventReminders = {
29
+ useDefault?: boolean;
30
+ overrides?: Reminder[];
31
+ };
32
+ export type ConferenceData = {
33
+ createRequest?: {
34
+ requestId?: string;
35
+ conferenceSolutionKey?: {
36
+ type?: string;
37
+ };
38
+ status?: {
39
+ statusCode?: string;
40
+ };
41
+ };
42
+ entryPoints?: Array<{
43
+ entryPointType?: string;
44
+ uri?: string;
45
+ label?: string;
46
+ pin?: string;
47
+ accessCode?: string;
48
+ meetingCode?: string;
49
+ passcode?: string;
50
+ password?: string;
51
+ }>;
52
+ conferenceSolution?: {
53
+ key?: {
54
+ type?: string;
55
+ };
56
+ name?: string;
57
+ iconUri?: string;
58
+ };
59
+ conferenceId?: string;
60
+ signature?: string;
61
+ notes?: string;
62
+ };
63
+ export type Event = {
64
+ id?: string;
65
+ status?: 'confirmed' | 'tentative' | 'cancelled';
66
+ htmlLink?: string;
67
+ created?: string;
68
+ updated?: string;
69
+ summary?: string;
70
+ description?: string;
71
+ location?: string;
72
+ colorId?: string;
73
+ creator?: Organizer;
74
+ organizer?: Organizer;
75
+ start?: EventDateTime;
76
+ end?: EventDateTime;
77
+ endTimeUnspecified?: boolean;
78
+ recurrence?: string[];
79
+ recurringEventId?: string;
80
+ originalStartTime?: EventDateTime;
81
+ transparency?: 'opaque' | 'transparent';
82
+ visibility?: 'default' | 'public' | 'private' | 'confidential';
83
+ iCalUID?: string;
84
+ sequence?: number;
85
+ attendees?: Attendee[];
86
+ attendeesOmitted?: boolean;
87
+ hangoutLink?: string;
88
+ conferenceData?: ConferenceData;
89
+ gadget?: {
90
+ type?: string;
91
+ title?: string;
92
+ link?: string;
93
+ iconLink?: string;
94
+ width?: number;
95
+ height?: number;
96
+ display?: string;
97
+ preferences?: Record<string, string>;
98
+ };
99
+ anyoneCanAddSelf?: boolean;
100
+ guestsCanInviteOthers?: boolean;
101
+ guestsCanModify?: boolean;
102
+ guestsCanSeeOtherGuests?: boolean;
103
+ privateCopy?: boolean;
104
+ locked?: boolean;
105
+ reminders?: EventReminders;
106
+ source?: {
107
+ url?: string;
108
+ title?: string;
109
+ };
110
+ attachments?: Array<{
111
+ fileUrl?: string;
112
+ title?: string;
113
+ mimeType?: string;
114
+ iconLink?: string;
115
+ fileId?: string;
116
+ }>;
117
+ eventType?: 'default' | 'outOfOffice' | 'focusTime' | 'workingLocation';
118
+ };
119
+ export type EventListResponse = {
120
+ kind?: string;
121
+ etag?: string;
122
+ summary?: string;
123
+ description?: string;
124
+ updated?: string;
125
+ timeZone?: string;
126
+ accessRole?: string;
127
+ defaultReminders?: Reminder[];
128
+ nextPageToken?: string;
129
+ nextSyncToken?: string;
130
+ items?: Event[];
131
+ };
132
+ export type FreeBusyRequest = {
133
+ timeMin: string;
134
+ timeMax: string;
135
+ timeZone?: string;
136
+ groupExpansionMax?: number;
137
+ calendarExpansionMax?: number;
138
+ items?: Array<{
139
+ id: string;
140
+ }>;
141
+ };
142
+ export type FreeBusyCalendar = {
143
+ busy?: Array<{
144
+ start?: string;
145
+ end?: string;
146
+ }>;
147
+ errors?: Array<{
148
+ domain?: string;
149
+ reason?: string;
150
+ }>;
151
+ };
152
+ export type FreeBusyResponse = {
153
+ kind?: string;
154
+ calendars?: Record<string, FreeBusyCalendar>;
155
+ groups?: Record<string, {
156
+ calendars?: string[];
157
+ errors?: Array<{
158
+ domain?: string;
159
+ reason?: string;
160
+ }>;
161
+ }>;
162
+ timeMin?: string;
163
+ timeMax?: string;
164
+ };
165
+ export type Calendar = {
166
+ id?: string;
167
+ summary?: string;
168
+ description?: string;
169
+ location?: string;
170
+ timeZone?: string;
171
+ conferenceProperties?: {
172
+ allowedConferenceSolutionTypes?: string[];
173
+ };
174
+ };
175
+ export type CalendarListResponse = {
176
+ kind?: string;
177
+ etag?: string;
178
+ nextPageToken?: string;
179
+ nextSyncToken?: string;
180
+ items?: Calendar[];
181
+ };
182
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { GoogleCalendarWebhooks } from '..';
2
+ export declare const onEventChanged: GoogleCalendarWebhooks['onEventChanged'];
3
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../webhooks/events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,IAAI,CAAC;AA2HjD,eAAO,MAAM,cAAc,EAAE,sBAAsB,CAAC,gBAAgB,CAiHnE,CAAC"}
@@ -0,0 +1,38 @@
1
+ export declare const EventWebhooks: {
2
+ onEventChanged: {
3
+ match: import("corsair/core").CorsairWebhookMatcher;
4
+ handler: import("corsair/core").CorsairWebhookHandler<import("..").GoogleCalendarContext, import("./types").GoogleCalendarWebhookPayload<{
5
+ type: "eventCreated";
6
+ calendarId: string;
7
+ event: import("..").Event;
8
+ timestamp: string;
9
+ } | {
10
+ type: "eventUpdated";
11
+ calendarId: string;
12
+ event: import("..").Event;
13
+ timestamp: string;
14
+ } | {
15
+ type: "eventDeleted";
16
+ calendarId: string;
17
+ timestamp: string;
18
+ eventId: string;
19
+ }>, {
20
+ type: "eventCreated";
21
+ calendarId: string;
22
+ event: import("..").Event;
23
+ timestamp: string;
24
+ } | {
25
+ type: "eventUpdated";
26
+ calendarId: string;
27
+ event: import("..").Event;
28
+ timestamp: string;
29
+ } | {
30
+ type: "eventDeleted";
31
+ calendarId: string;
32
+ timestamp: string;
33
+ eventId: string;
34
+ }>;
35
+ };
36
+ };
37
+ export * from './types';
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../webhooks/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAEzB,CAAC;AAEF,cAAc,SAAS,CAAC"}