@plotday/tool-google-contacts 0.2.1 → 0.2.2

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,17 @@
1
+ import { Tool, type ToolBuilder } from "@plotday/agent";
2
+ import { type Callback } from "@plotday/agent/tools/callbacks";
3
+ import { type Authorization, Integrations } from "@plotday/agent/tools/integrations";
4
+ import type { Contact, ContactAuth, GoogleContacts as IGoogleContacts } from "./types";
5
+ export default class GoogleContacts extends Tool<GoogleContacts> implements IGoogleContacts {
6
+ static readonly id = "google-contacts";
7
+ build(build: ToolBuilder): {
8
+ integrations: Promise<Integrations>;
9
+ };
10
+ requestAuth<TCallback extends (auth: ContactAuth, ...args: any[]) => any>(callback: TCallback, ...extraArgs: any[]): Promise<any>;
11
+ getContacts(authToken: string): Promise<Contact[]>;
12
+ startSync<TCallback extends (contacts: Contact[], ...args: any[]) => any>(authToken: string, callback: TCallback, ...extraArgs: any[]): Promise<void>;
13
+ stopSync(authToken: string): Promise<void>;
14
+ syncBatch(_args: any, batchNumber: number, authToken: string): Promise<void>;
15
+ private processContacts;
16
+ onAuthSuccess(authResult: Authorization, opaqueToken: string, callbackToken: Callback): Promise<void>;
17
+ }
@@ -0,0 +1,270 @@
1
+ import { Tool } from "@plotday/agent";
2
+ import { AuthLevel, AuthProvider, Integrations, } from "@plotday/agent/tools/integrations";
3
+ class GoogleApi {
4
+ accessToken;
5
+ constructor(accessToken) {
6
+ this.accessToken = accessToken;
7
+ }
8
+ async call(method, url, params, body) {
9
+ const query = params ? `?${new URLSearchParams(params)}` : "";
10
+ const headers = {
11
+ Authorization: `Bearer ${this.accessToken}`,
12
+ Accept: "application/json",
13
+ ...(body ? { "Content-Type": "application/json" } : {}),
14
+ };
15
+ const response = await fetch(url + query, {
16
+ method,
17
+ headers,
18
+ ...(body ? { body: JSON.stringify(body) } : {}),
19
+ });
20
+ switch (response.status) {
21
+ case 400:
22
+ const responseBody = await response.json();
23
+ if (responseBody.status === "FAILED_PRECONDITION") {
24
+ return null;
25
+ }
26
+ throw new Error("Invalid request", { cause: responseBody });
27
+ case 401:
28
+ throw new Error("Authentication failed - token may be expired");
29
+ case 410:
30
+ return null;
31
+ case 200:
32
+ return await response.json();
33
+ default:
34
+ throw new Error(await response.text());
35
+ }
36
+ }
37
+ }
38
+ function parseContact(contact) {
39
+ const name = contact.names?.[0]?.displayName;
40
+ const avatar = contact.photos?.filter((p) => !p.default && p.metadata?.primary)?.[0]?.url;
41
+ return { name, avatar };
42
+ }
43
+ async function getGoogleContacts(api, scopes, state) {
44
+ let tokens = JSON.parse(state.state ?? "{}");
45
+ const contacts = {};
46
+ let more = false;
47
+ if (!state.more || tokens.connections?.nextPageToken) {
48
+ if (scopes?.some?.((scope) => scope === "https://www.googleapis.com/auth/contacts.readonly")) {
49
+ let response;
50
+ while (true) {
51
+ response = (await api.call("GET", "https://people.googleapis.com/v1/people/me/connections", {
52
+ requestSyncToken: true,
53
+ ...(tokens.connections?.nextPageToken
54
+ ? {
55
+ pageToken: tokens.connections?.nextPageToken,
56
+ }
57
+ : tokens.connections?.nextSyncToken
58
+ ? {
59
+ syncToken: tokens.connections?.nextSyncToken,
60
+ }
61
+ : {}),
62
+ personFields: "names,emailAddresses,photos",
63
+ }));
64
+ if (response !== null)
65
+ break;
66
+ if (!tokens.connections)
67
+ break;
68
+ tokens.connections = undefined;
69
+ continue;
70
+ }
71
+ if (response) {
72
+ for (const c of response.connections ?? []) {
73
+ for (const e of c.emailAddresses ?? []) {
74
+ if (!e.value)
75
+ continue;
76
+ const { name, avatar } = parseContact(c);
77
+ contacts[e.value] = {
78
+ ...contacts[e.value],
79
+ email: e.value,
80
+ ...(name ? { name } : {}),
81
+ ...(avatar ? { avatar } : {}),
82
+ };
83
+ }
84
+ }
85
+ more = true;
86
+ tokens = {
87
+ ...tokens,
88
+ connections: {
89
+ nextPageToken: response.nextPageToken ?? undefined,
90
+ nextSyncToken: response.nextSyncToken ?? undefined,
91
+ },
92
+ };
93
+ }
94
+ }
95
+ else {
96
+ more = true;
97
+ tokens = {
98
+ ...tokens,
99
+ connections: {},
100
+ };
101
+ }
102
+ }
103
+ else {
104
+ if (scopes?.some?.((scope) => scope === "https://www.googleapis.com/auth/contacts.other.readonly")) {
105
+ let response;
106
+ while (true) {
107
+ response = (await api.call("GET", "https://people.googleapis.com/v1/otherContacts", {
108
+ requestSyncToken: true,
109
+ ...(tokens.other?.nextPageToken
110
+ ? {
111
+ pageToken: tokens.other?.nextPageToken,
112
+ }
113
+ : tokens.other?.nextSyncToken
114
+ ? {
115
+ syncToken: tokens.other?.nextSyncToken,
116
+ }
117
+ : {}),
118
+ readMask: "names,emailAddresses,photos",
119
+ }));
120
+ if (response !== null)
121
+ break;
122
+ if (!tokens.other)
123
+ break;
124
+ tokens.other = undefined;
125
+ continue;
126
+ }
127
+ if (response) {
128
+ for (const c of response.otherContacts ?? []) {
129
+ for (const e of c.emailAddresses ?? []) {
130
+ if (!e.value)
131
+ continue;
132
+ const { name, avatar } = parseContact(c);
133
+ contacts[e.value] = {
134
+ ...contacts[e.value],
135
+ email: e.value,
136
+ ...(name ? { name } : {}),
137
+ ...(avatar ? { avatar } : {}),
138
+ };
139
+ }
140
+ }
141
+ more = !!response.nextPageToken;
142
+ tokens = {
143
+ ...tokens,
144
+ other: {
145
+ nextPageToken: response.nextPageToken ?? undefined,
146
+ nextSyncToken: response.nextSyncToken ?? undefined,
147
+ },
148
+ };
149
+ }
150
+ }
151
+ else {
152
+ more = false;
153
+ tokens = {
154
+ ...tokens,
155
+ other: {},
156
+ };
157
+ }
158
+ }
159
+ return {
160
+ contacts: Object.values(contacts),
161
+ state: {
162
+ more,
163
+ state: JSON.stringify(tokens),
164
+ },
165
+ };
166
+ }
167
+ export default class GoogleContacts extends Tool {
168
+ static id = "google-contacts";
169
+ build(build) {
170
+ return {
171
+ integrations: build(Integrations),
172
+ };
173
+ }
174
+ async requestAuth(callback, ...extraArgs) {
175
+ const contactsScopes = [
176
+ "https://www.googleapis.com/auth/contacts.readonly",
177
+ "https://www.googleapis.com/auth/contacts.other.readonly",
178
+ ];
179
+ const opaqueToken = crypto.randomUUID();
180
+ // Create callback token for parent
181
+ const callbackToken = await this.tools.callbacks.createFromParent(callback, ...extraArgs);
182
+ // Request auth and return the activity link
183
+ return await this.tools.integrations.request({
184
+ provider: AuthProvider.Google,
185
+ level: AuthLevel.User,
186
+ scopes: contactsScopes,
187
+ }, this.onAuthSuccess, opaqueToken, callbackToken);
188
+ }
189
+ async getContacts(authToken) {
190
+ const storedAuthToken = await this.get(`auth_token:${authToken}`);
191
+ if (!storedAuthToken) {
192
+ throw new Error("No Google authentication token available for the provided authToken");
193
+ }
194
+ const api = new GoogleApi(storedAuthToken.token);
195
+ const result = await getGoogleContacts(api, storedAuthToken.scopes, {
196
+ more: false,
197
+ });
198
+ return result.contacts;
199
+ }
200
+ async startSync(authToken, callback, ...extraArgs) {
201
+ const storedAuthToken = await this.get(`auth_token:${authToken}`);
202
+ if (!storedAuthToken) {
203
+ throw new Error("No Google authentication token available for the provided authToken");
204
+ }
205
+ // Create callback token for parent
206
+ const callbackToken = await this.tools.callbacks.createFromParent(callback, ...extraArgs);
207
+ await this.set(`contacts_callback_token:${authToken}`, callbackToken);
208
+ // Start initial sync
209
+ const initialState = {
210
+ more: false,
211
+ };
212
+ await this.set(`sync_state:${authToken}`, initialState);
213
+ // Start sync batch using run tool for long-running operation
214
+ const syncCallback = await this.callback(this.syncBatch, 1, authToken);
215
+ await this.run(syncCallback);
216
+ }
217
+ async stopSync(authToken) {
218
+ // Clear sync state for this specific auth token
219
+ await this.clear(`sync_state:${authToken}`);
220
+ await this.clear(`contacts_callback_token:${authToken}`);
221
+ }
222
+ async syncBatch(_args, batchNumber, authToken) {
223
+ console.log(`Starting Google Contacts sync batch ${batchNumber}`);
224
+ try {
225
+ const storedAuthToken = await this.get(`auth_token:${authToken}`);
226
+ if (!storedAuthToken) {
227
+ throw new Error("No authentication token available for the provided authToken");
228
+ }
229
+ const state = await this.get(`sync_state:${authToken}`);
230
+ if (!state) {
231
+ throw new Error("No sync state found");
232
+ }
233
+ const api = new GoogleApi(storedAuthToken.token);
234
+ const result = await getGoogleContacts(api, storedAuthToken.scopes, state);
235
+ if (result.contacts.length > 0) {
236
+ await this.processContacts(result.contacts, authToken);
237
+ console.log(`Synced ${result.contacts.length} contacts in batch ${batchNumber}`);
238
+ }
239
+ await this.set(`sync_state:${authToken}`, result.state);
240
+ if (result.state.more) {
241
+ const nextCallback = await this.callback(this.syncBatch, batchNumber + 1, authToken);
242
+ await this.run(nextCallback);
243
+ }
244
+ else {
245
+ console.log(`Google Contacts sync completed after ${batchNumber} batches`);
246
+ await this.clear(`sync_state:${authToken}`);
247
+ }
248
+ }
249
+ catch (error) {
250
+ console.error(`Error in sync batch ${batchNumber}:`, error);
251
+ throw error;
252
+ }
253
+ }
254
+ async processContacts(contacts, authToken) {
255
+ const callbackToken = await this.get(`contacts_callback_token:${authToken}`);
256
+ if (callbackToken) {
257
+ await this.run(callbackToken, contacts);
258
+ }
259
+ }
260
+ async onAuthSuccess(authResult, opaqueToken, callbackToken) {
261
+ console.log("Google Contacts authentication successful", authResult);
262
+ // Store the actual auth token using opaque token as key
263
+ await this.set(`auth_token:${opaqueToken}`, authResult);
264
+ const authSuccessResult = {
265
+ authToken: opaqueToken,
266
+ };
267
+ await this.run(callbackToken, authSuccessResult);
268
+ }
269
+ }
270
+ //# sourceMappingURL=google-contacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-contacts.js","sourceRoot":"","sources":["../src/google-contacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./types";
2
+ export { default } from "./google-contacts";
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./types";
2
+ export { default } from "./google-contacts";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ActivityLink, ITool } from "@plotday/agent";
2
+ export type Contact = {
3
+ email: string;
4
+ name?: string;
5
+ avatar?: string;
6
+ };
7
+ export type ContactAuth = {
8
+ authToken: string;
9
+ };
10
+ export interface GoogleContacts extends ITool {
11
+ requestAuth<TCallback extends (auth: ContactAuth, ...args: any[]) => any>(callback: TCallback, ...extraArgs: any[]): Promise<ActivityLink>;
12
+ getContacts(authToken: string): Promise<Contact[]>;
13
+ startSync<TCallback extends (contacts: Contact[], ...args: any[]) => any>(authToken: string, callback: TCallback, ...extraArgs: any[]): Promise<void>;
14
+ stopSync(authToken: string): Promise<void>;
15
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "description": "Sync with Google Contacts",
5
5
  "author": "Plot <team@plot.day> (https://plot.day)",
6
6
  "license": "MIT",
7
- "version": "0.2.1",
7
+ "version": "0.2.2",
8
8
  "type": "module",
9
9
  "main": "./dist/index.js",
10
10
  "types": "./dist/index.d.ts",
@@ -20,7 +20,7 @@
20
20
  "LICENSE"
21
21
  ],
22
22
  "dependencies": {
23
- "@plotday/agent": "^0.18.0"
23
+ "@plotday/agent": "^0.18.3"
24
24
  },
25
25
  "devDependencies": {
26
26
  "typescript": "^5.9.3"