google-services-mcp 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.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +225 -0
  3. package/dist/auth/config.d.ts +43 -0
  4. package/dist/auth/config.d.ts.map +1 -0
  5. package/dist/auth/config.js +108 -0
  6. package/dist/auth/config.js.map +1 -0
  7. package/dist/auth/manager.d.ts +50 -0
  8. package/dist/auth/manager.d.ts.map +1 -0
  9. package/dist/auth/manager.js +140 -0
  10. package/dist/auth/manager.js.map +1 -0
  11. package/dist/auth/oauth.d.ts +49 -0
  12. package/dist/auth/oauth.d.ts.map +1 -0
  13. package/dist/auth/oauth.js +211 -0
  14. package/dist/auth/oauth.js.map +1 -0
  15. package/dist/auth/store.d.ts +18 -0
  16. package/dist/auth/store.d.ts.map +1 -0
  17. package/dist/auth/store.js +45 -0
  18. package/dist/auth/store.js.map +1 -0
  19. package/dist/cli.d.ts +7 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +112 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/main.d.ts +3 -0
  24. package/dist/main.d.ts.map +1 -0
  25. package/dist/main.js +21 -0
  26. package/dist/main.js.map +1 -0
  27. package/dist/server.d.ts +3 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +11 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/services/calendar.d.ts +77 -0
  32. package/dist/services/calendar.d.ts.map +1 -0
  33. package/dist/services/calendar.js +141 -0
  34. package/dist/services/calendar.js.map +1 -0
  35. package/dist/services/contacts-tasks.d.ts +61 -0
  36. package/dist/services/contacts-tasks.d.ts.map +1 -0
  37. package/dist/services/contacts-tasks.js +103 -0
  38. package/dist/services/contacts-tasks.js.map +1 -0
  39. package/dist/services/docs.d.ts +30 -0
  40. package/dist/services/docs.d.ts.map +1 -0
  41. package/dist/services/docs.js +60 -0
  42. package/dist/services/docs.js.map +1 -0
  43. package/dist/services/drive.d.ts +51 -0
  44. package/dist/services/drive.d.ts.map +1 -0
  45. package/dist/services/drive.js +80 -0
  46. package/dist/services/drive.js.map +1 -0
  47. package/dist/services/forms.d.ts +28 -0
  48. package/dist/services/forms.d.ts.map +1 -0
  49. package/dist/services/forms.js +54 -0
  50. package/dist/services/forms.js.map +1 -0
  51. package/dist/services/gmail.d.ts +64 -0
  52. package/dist/services/gmail.d.ts.map +1 -0
  53. package/dist/services/gmail.js +144 -0
  54. package/dist/services/gmail.js.map +1 -0
  55. package/dist/services/sheets.d.ts +44 -0
  56. package/dist/services/sheets.d.ts.map +1 -0
  57. package/dist/services/sheets.js +53 -0
  58. package/dist/services/sheets.js.map +1 -0
  59. package/dist/services/slides.d.ts +28 -0
  60. package/dist/services/slides.d.ts.map +1 -0
  61. package/dist/services/slides.js +54 -0
  62. package/dist/services/slides.js.map +1 -0
  63. package/dist/services/youtube.d.ts +40 -0
  64. package/dist/services/youtube.d.ts.map +1 -0
  65. package/dist/services/youtube.js +91 -0
  66. package/dist/services/youtube.js.map +1 -0
  67. package/dist/tools/index.d.ts +3 -0
  68. package/dist/tools/index.d.ts.map +1 -0
  69. package/dist/tools/index.js +659 -0
  70. package/dist/tools/index.js.map +1 -0
  71. package/dist/util/result.d.ts +29 -0
  72. package/dist/util/result.d.ts.map +1 -0
  73. package/dist/util/result.js +21 -0
  74. package/dist/util/result.js.map +1 -0
  75. package/package.json +54 -0
@@ -0,0 +1,141 @@
1
+ import { google } from "googleapis";
2
+ function isAllDay(dt) {
3
+ return /^\d{4}-\d{2}-\d{2}$/.test(dt);
4
+ }
5
+ function buildStartEnd(start, end) {
6
+ if (isAllDay(start) || isAllDay(end)) {
7
+ return { start: { date: start }, end: { date: end } };
8
+ }
9
+ return { start: { dateTime: start }, end: { dateTime: end } };
10
+ }
11
+ /** List the user's calendars. */
12
+ export async function listCalendars(client) {
13
+ const calendar = google.calendar({ version: "v3", auth: client });
14
+ const res = await calendar.calendarList.list();
15
+ return (res.data.items ?? []).map((c) => ({
16
+ id: c.id,
17
+ summary: c.summary,
18
+ isPrimary: !!c.primary,
19
+ accessRole: c.accessRole,
20
+ }));
21
+ }
22
+ /** List events in a calendar, optionally filtered by time range / free-text query. */
23
+ export async function listEvents(client, opts) {
24
+ const calendar = google.calendar({ version: "v3", auth: client });
25
+ const res = await calendar.events.list({
26
+ calendarId: opts.calendarId ?? "primary",
27
+ timeMin: opts.timeMin,
28
+ timeMax: opts.timeMax,
29
+ maxResults: opts.maxResults ?? 25,
30
+ q: opts.q,
31
+ singleEvents: true,
32
+ orderBy: "startTime",
33
+ });
34
+ return (res.data.items ?? []).map((e) => ({
35
+ id: e.id,
36
+ summary: e.summary,
37
+ description: e.description,
38
+ location: e.location,
39
+ start: e.start,
40
+ end: e.end,
41
+ hangoutLink: e.hangoutLink,
42
+ htmlLink: e.htmlLink,
43
+ }));
44
+ }
45
+ /** Create an event. Returns the created event. */
46
+ export async function createEvent(client, opts) {
47
+ const startMs = Date.parse(opts.start.replace(" ", "T"));
48
+ const endMs = Date.parse(opts.end.replace(" ", "T"));
49
+ if (!Number.isNaN(startMs) && !Number.isNaN(endMs) && endMs <= startMs) {
50
+ throw new Error("Event end must not be before start.");
51
+ }
52
+ const calendar = google.calendar({ version: "v3", auth: client });
53
+ const requestBody = {
54
+ summary: opts.summary,
55
+ description: opts.description,
56
+ location: opts.location,
57
+ ...buildStartEnd(opts.start, opts.end),
58
+ attendees: opts.attendees?.map((email) => ({ email })),
59
+ };
60
+ const res = await calendar.events.insert({
61
+ calendarId: opts.calendarId ?? "primary",
62
+ requestBody,
63
+ });
64
+ return mapEvent(res.data);
65
+ }
66
+ /** Get a single event. */
67
+ export async function getEvent(client, opts) {
68
+ const calendar = google.calendar({ version: "v3", auth: client });
69
+ const res = await calendar.events.get({
70
+ calendarId: opts.calendarId ?? "primary",
71
+ eventId: opts.eventId,
72
+ });
73
+ return mapEvent(res.data);
74
+ }
75
+ /** Update an existing event (partial). */
76
+ export async function updateEvent(client, opts) {
77
+ const calendar = google.calendar({ version: "v3", auth: client });
78
+ const requestBody = {};
79
+ if (opts.summary !== undefined)
80
+ requestBody.summary = opts.summary;
81
+ if (opts.description !== undefined)
82
+ requestBody.description = opts.description;
83
+ if (opts.location !== undefined)
84
+ requestBody.location = opts.location;
85
+ if (opts.attendees !== undefined)
86
+ requestBody.attendees = opts.attendees.map((email) => ({ email }));
87
+ if (opts.start !== undefined && opts.end !== undefined) {
88
+ Object.assign(requestBody, buildStartEnd(opts.start, opts.end));
89
+ }
90
+ const res = await calendar.events.update({
91
+ calendarId: opts.calendarId ?? "primary",
92
+ eventId: opts.eventId,
93
+ requestBody,
94
+ });
95
+ return mapEvent(res.data);
96
+ }
97
+ /** Delete an event. */
98
+ export async function deleteEvent(client, opts) {
99
+ const calendar = google.calendar({ version: "v3", auth: client });
100
+ await calendar.events.delete({
101
+ calendarId: opts.calendarId ?? "primary",
102
+ eventId: opts.eventId,
103
+ });
104
+ }
105
+ /** Create an event with an attached Google Meet conference. Returns the hangout link. */
106
+ export async function createMeetLink(client, opts) {
107
+ const calendar = google.calendar({ version: "v3", auth: client });
108
+ const requestBody = {
109
+ summary: opts.summary,
110
+ description: opts.description,
111
+ location: opts.location,
112
+ ...buildStartEnd(opts.start, opts.end),
113
+ attendees: opts.attendees?.map((email) => ({ email })),
114
+ conferenceData: {
115
+ createRequest: {
116
+ requestId: `gmcp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`,
117
+ conferenceSolutionKey: { type: "hangoutsMeet" },
118
+ },
119
+ },
120
+ };
121
+ const res = await calendar.events.insert({
122
+ calendarId: opts.calendarId ?? "primary",
123
+ requestBody,
124
+ conferenceDataVersion: 1,
125
+ });
126
+ return mapEvent(res.data);
127
+ }
128
+ function mapEvent(data) {
129
+ return {
130
+ id: data.id,
131
+ summary: data.summary,
132
+ description: data.description,
133
+ location: data.location,
134
+ start: data.start,
135
+ end: data.end,
136
+ hangoutLink: data.hangoutLink,
137
+ htmlLink: data.htmlLink,
138
+ attendees: data.attendees,
139
+ };
140
+ }
141
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/services/calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { Auth } from "googleapis";
2
+ export interface ListContactsOptions {
3
+ pageSize?: number;
4
+ }
5
+ export interface SearchContactsOptions {
6
+ query: string;
7
+ pageSize?: number;
8
+ }
9
+ export interface CreateContactOptions {
10
+ name: string;
11
+ email?: string;
12
+ phone?: string;
13
+ }
14
+ export interface ListTasksOptions {
15
+ tasklistId?: string;
16
+ }
17
+ export interface CreateTaskOptions {
18
+ tasklistId?: string;
19
+ title: string;
20
+ notes?: string;
21
+ due?: string;
22
+ }
23
+ export interface TaskRefOptions {
24
+ tasklistId?: string;
25
+ taskId: string;
26
+ }
27
+ export interface ContactSummary {
28
+ resourceName: string;
29
+ name?: string;
30
+ emails: string[];
31
+ phones: string[];
32
+ }
33
+ export interface TaskSummary {
34
+ id: string;
35
+ title?: string;
36
+ status?: string;
37
+ notes?: string;
38
+ due?: string;
39
+ }
40
+ /** List the signed-in user's contacts. */
41
+ export declare function listContacts(client: Auth.OAuth2Client, opts: ListContactsOptions): Promise<ContactSummary[]>;
42
+ /** Search all contacts (including not-connected ones) by name/email/phone. */
43
+ export declare function searchContacts(client: Auth.OAuth2Client, opts: SearchContactsOptions): Promise<ContactSummary[]>;
44
+ /** Create a new contact. */
45
+ export declare function createContact(client: Auth.OAuth2Client, opts: CreateContactOptions): Promise<{
46
+ resourceName: string;
47
+ }>;
48
+ /** List the user's task lists. */
49
+ export declare function listTaskLists(client: Auth.OAuth2Client): Promise<Array<{
50
+ id: string;
51
+ title?: string;
52
+ }>>;
53
+ /** List tasks in a task list. */
54
+ export declare function listTasks(client: Auth.OAuth2Client, opts: ListTasksOptions): Promise<TaskSummary[]>;
55
+ /** Create a task. */
56
+ export declare function createTask(client: Auth.OAuth2Client, opts: CreateTaskOptions): Promise<TaskSummary>;
57
+ /** Mark a task as completed. */
58
+ export declare function completeTask(client: Auth.OAuth2Client, opts: TaskRefOptions): Promise<TaskSummary>;
59
+ /** Delete a task. */
60
+ export declare function deleteTask(client: Auth.OAuth2Client, opts: TaskRefOptions): Promise<void>;
61
+ //# sourceMappingURL=contacts-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts-tasks.d.ts","sourceRoot":"","sources":["../../src/services/contacts-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,0CAA0C;AAC1C,wBAAsB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAalH;AAED,8EAA8E;AAC9E,wBAAsB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAgBtH;AAED,4BAA4B;AAC5B,wBAAsB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAY5H;AAED,kCAAkC;AAClC,wBAAsB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAI7G;AAED,iCAAiC;AACjC,wBAAsB,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAUzG;AAED,qBAAqB;AACrB,wBAAsB,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAWzG;AAED,gCAAgC;AAChC,wBAAsB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAYxG;AAED,qBAAqB;AACrB,wBAAsB,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/F"}
@@ -0,0 +1,103 @@
1
+ import { google } from "googleapis";
2
+ /** List the signed-in user's contacts. */
3
+ export async function listContacts(client, opts) {
4
+ const people = google.people({ version: "v1", auth: client });
5
+ const res = await people.people.connections.list({
6
+ resourceName: "people/me",
7
+ personFields: "names,emailAddresses,phoneNumbers",
8
+ pageSize: opts.pageSize ?? 100,
9
+ });
10
+ return (res.data.connections ?? []).map((c) => ({
11
+ resourceName: c.resourceName,
12
+ name: c.names?.[0]?.displayName,
13
+ emails: (c.emailAddresses ?? []).map((e) => e.value),
14
+ phones: (c.phoneNumbers ?? []).map((p) => p.value),
15
+ }));
16
+ }
17
+ /** Search all contacts (including not-connected ones) by name/email/phone. */
18
+ export async function searchContacts(client, opts) {
19
+ const people = google.people({ version: "v1", auth: client });
20
+ const res = await people.otherContacts.search({
21
+ query: opts.query,
22
+ readMask: "names,emailAddresses,phoneNumbers",
23
+ pageSize: opts.pageSize ?? 25,
24
+ });
25
+ return (res.data.results ?? []).map((r) => {
26
+ const c = r.person ?? {};
27
+ return {
28
+ resourceName: (c.resourceName ?? ""),
29
+ name: c.names?.[0]?.displayName,
30
+ emails: (c.emailAddresses ?? []).map((e) => e.value),
31
+ phones: (c.phoneNumbers ?? []).map((p) => p.value),
32
+ };
33
+ });
34
+ }
35
+ /** Create a new contact. */
36
+ export async function createContact(client, opts) {
37
+ const people = google.people({ version: "v1", auth: client });
38
+ const requestBody = {
39
+ names: [{ displayName: opts.name, givenName: opts.name }],
40
+ };
41
+ if (opts.email)
42
+ requestBody.emailAddresses = [{ value: opts.email }];
43
+ if (opts.phone)
44
+ requestBody.phoneNumbers = [{ value: opts.phone }];
45
+ const res = await people.people.createContact({
46
+ requestBody,
47
+ personFields: "names,emailAddresses,phoneNumbers",
48
+ });
49
+ return { resourceName: res.data.resourceName ?? "" };
50
+ }
51
+ /** List the user's task lists. */
52
+ export async function listTaskLists(client) {
53
+ const tasks = google.tasks({ version: "v1", auth: client });
54
+ const res = await tasks.tasklists.list();
55
+ return (res.data.items ?? []).map((l) => ({ id: l.id, title: l.title }));
56
+ }
57
+ /** List tasks in a task list. */
58
+ export async function listTasks(client, opts) {
59
+ const tasks = google.tasks({ version: "v1", auth: client });
60
+ const res = await tasks.tasks.list({ tasklist: opts.tasklistId ?? "@default" });
61
+ return (res.data.items ?? []).map((t) => ({
62
+ id: t.id,
63
+ title: t.title,
64
+ status: t.status,
65
+ notes: t.notes,
66
+ due: t.due,
67
+ }));
68
+ }
69
+ /** Create a task. */
70
+ export async function createTask(client, opts) {
71
+ const tasks = google.tasks({ version: "v1", auth: client });
72
+ const requestBody = { title: opts.title };
73
+ if (opts.notes)
74
+ requestBody.notes = opts.notes;
75
+ if (opts.due)
76
+ requestBody.due = opts.due;
77
+ const res = await tasks.tasks.insert({ tasklist: opts.tasklistId ?? "@default", requestBody });
78
+ return {
79
+ id: res.data.id,
80
+ title: res.data.title,
81
+ status: res.data.status,
82
+ };
83
+ }
84
+ /** Mark a task as completed. */
85
+ export async function completeTask(client, opts) {
86
+ const tasks = google.tasks({ version: "v1", auth: client });
87
+ const res = await tasks.tasks.patch({
88
+ tasklist: opts.tasklistId ?? "@default",
89
+ task: opts.taskId,
90
+ requestBody: { status: "completed" },
91
+ });
92
+ return {
93
+ id: res.data.id,
94
+ title: res.data.title,
95
+ status: res.data.status,
96
+ };
97
+ }
98
+ /** Delete a task. */
99
+ export async function deleteTask(client, opts) {
100
+ const tasks = google.tasks({ version: "v1", auth: client });
101
+ await tasks.tasks.delete({ tasklist: opts.tasklistId ?? "@default", task: opts.taskId });
102
+ }
103
+ //# sourceMappingURL=contacts-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts-tasks.js","sourceRoot":"","sources":["../../src/services/contacts-tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Auth, docs_v1 } from "googleapis";
2
+ export interface GetDocumentArgs {
3
+ documentId: string;
4
+ }
5
+ export interface InsertTextArgs {
6
+ documentId: string;
7
+ text: string;
8
+ /** Optional 0-based character index to insert at. Defaults to end of document. */
9
+ index?: number;
10
+ }
11
+ export interface ReplaceAllTextArgs {
12
+ documentId: string;
13
+ find: string;
14
+ replace: string;
15
+ matchCase?: boolean;
16
+ }
17
+ export interface BatchUpdateArgs {
18
+ documentId: string;
19
+ requests: docs_v1.Schema$Request[];
20
+ }
21
+ export declare function getDocument(client: Auth.OAuth2Client, { documentId }: GetDocumentArgs): Promise<any>;
22
+ /** Extract plain text from the body's paragraph elements (text runs only). */
23
+ export declare function getDocumentText(client: Auth.OAuth2Client, { documentId }: GetDocumentArgs): Promise<string>;
24
+ export declare function createDocument(client: Auth.OAuth2Client, { title }: {
25
+ title: string;
26
+ }): Promise<any>;
27
+ export declare function insertText(client: Auth.OAuth2Client, { documentId, text, index }: InsertTextArgs): Promise<any>;
28
+ export declare function replaceAllText(client: Auth.OAuth2Client, { documentId, find, replace, matchCase }: ReplaceAllTextArgs): Promise<any>;
29
+ export declare function batchUpdateDocument(client: Auth.OAuth2Client, { documentId, requests }: BatchUpdateArgs): Promise<any>;
30
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/services/docs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;CACpC;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAI1G;AAED,8EAA8E;AAC9E,wBAAsB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAcjH;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAI1G;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,cAAc,GAC1C,OAAO,CAAC,GAAG,CAAC,CAad;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,SAAgB,EAAE,EAAE,kBAAkB,GAClE,OAAO,CAAC,GAAG,CAAC,CAWd;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,eAAe,GACxC,OAAO,CAAC,GAAG,CAAC,CAId"}
@@ -0,0 +1,60 @@
1
+ import { google } from "googleapis";
2
+ export async function getDocument(client, { documentId }) {
3
+ const docs = google.docs({ version: "v1", auth: client });
4
+ const res = await docs.documents.get({ documentId });
5
+ return res.data;
6
+ }
7
+ /** Extract plain text from the body's paragraph elements (text runs only). */
8
+ export async function getDocumentText(client, { documentId }) {
9
+ const docs = google.docs({ version: "v1", auth: client });
10
+ const doc = await docs.documents.get({ documentId });
11
+ const content = doc.data.body?.content ?? [];
12
+ const parts = [];
13
+ for (const element of content) {
14
+ if (element.paragraph) {
15
+ const line = (element.paragraph.elements ?? [])
16
+ .map((e) => e.textRun?.content ?? "")
17
+ .join("");
18
+ parts.push(line);
19
+ }
20
+ }
21
+ return parts.join("\n") + (parts.length ? "\n" : "");
22
+ }
23
+ export async function createDocument(client, { title }) {
24
+ const docs = google.docs({ version: "v1", auth: client });
25
+ const res = await docs.documents.create({ requestBody: { title } });
26
+ return res.data;
27
+ }
28
+ export async function insertText(client, { documentId, text, index }) {
29
+ const docs = google.docs({ version: "v1", auth: client });
30
+ let location;
31
+ if (index !== undefined) {
32
+ location = { location: { index } };
33
+ }
34
+ else {
35
+ location = { endOfSegmentLocation: {} };
36
+ }
37
+ await docs.documents.batchUpdate({
38
+ documentId,
39
+ requestBody: { requests: [{ insertText: { ...location, text } }] },
40
+ });
41
+ return { inserted: true };
42
+ }
43
+ export async function replaceAllText(client, { documentId, find, replace, matchCase = true }) {
44
+ const docs = google.docs({ version: "v1", auth: client });
45
+ const res = await docs.documents.batchUpdate({
46
+ documentId,
47
+ requestBody: {
48
+ requests: [
49
+ { replaceAllText: { containsText: { text: find, matchCase }, replaceText: replace } },
50
+ ],
51
+ },
52
+ });
53
+ return res.data.replies?.[0]?.replaceAllText ?? { occurrencesChanged: 0 };
54
+ }
55
+ export async function batchUpdateDocument(client, { documentId, requests }) {
56
+ const docs = google.docs({ version: "v1", auth: client });
57
+ const res = await docs.documents.batchUpdate({ documentId, requestBody: { requests } });
58
+ return res.data;
59
+ }
60
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/services/docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { Auth } from "googleapis";
2
+ export interface ListDriveOptions {
3
+ query?: string;
4
+ pageSize?: number;
5
+ }
6
+ export interface GetDriveOptions {
7
+ fileId: string;
8
+ }
9
+ export interface UploadDriveOptions {
10
+ name: string;
11
+ mimeType: string;
12
+ /** Text content to upload. Omit to create a blank Google-native file. */
13
+ content?: string;
14
+ parentFolderId?: string;
15
+ }
16
+ export interface UpdateDriveOptions {
17
+ fileId: string;
18
+ name?: string;
19
+ mimeType?: string;
20
+ content?: string;
21
+ }
22
+ export interface ShareDriveOptions {
23
+ fileId: string;
24
+ email: string;
25
+ role: "reader" | "writer" | "commenter";
26
+ sendNotificationEmail?: boolean;
27
+ }
28
+ export interface DriveFile {
29
+ id: string;
30
+ name?: string;
31
+ mimeType?: string;
32
+ size?: string;
33
+ createdTime?: string;
34
+ modifiedTime?: string;
35
+ webViewLink?: string;
36
+ }
37
+ /** List files, optionally filtered by a Drive query (e.g. "'<folderId>' in parents"). */
38
+ export declare function listDriveFiles(client: Auth.OAuth2Client, opts: ListDriveOptions): Promise<DriveFile[]>;
39
+ /** Get metadata for a single file. */
40
+ export declare function getDriveFile(client: Auth.OAuth2Client, opts: GetDriveOptions): Promise<DriveFile>;
41
+ /** Create a file (text content) or a blank Google-native file (Doc/Sheet/Slides). */
42
+ export declare function uploadDriveFile(client: Auth.OAuth2Client, opts: UploadDriveOptions): Promise<DriveFile>;
43
+ /** Update a file's metadata and/or content. */
44
+ export declare function updateDriveFile(client: Auth.OAuth2Client, opts: UpdateDriveOptions): Promise<DriveFile>;
45
+ /** Permanently delete a file. */
46
+ export declare function deleteDriveFile(client: Auth.OAuth2Client, opts: GetDriveOptions): Promise<void>;
47
+ /** Share a file with a user by email. */
48
+ export declare function shareDriveFile(client: Auth.OAuth2Client, opts: ShareDriveOptions): Promise<{
49
+ id: string;
50
+ }>;
51
+ //# sourceMappingURL=drive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive.d.ts","sourceRoot":"","sources":["../../src/services/drive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IACxC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,yFAAyF;AACzF,wBAAsB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAS5G;AAED,sCAAsC;AACtC,wBAAsB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAOvG;AAED,qFAAqF;AACrF,wBAAsB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAU7G;AAED,+CAA+C;AAC/C,wBAAsB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAW7G;AAED,iCAAiC;AACjC,wBAAsB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrG;AAED,yCAAyC;AACzC,wBAAsB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAYhH"}
@@ -0,0 +1,80 @@
1
+ import { google } from "googleapis";
2
+ /** List files, optionally filtered by a Drive query (e.g. "'<folderId>' in parents"). */
3
+ export async function listDriveFiles(client, opts) {
4
+ const drive = google.drive({ version: "v3", auth: client });
5
+ const res = await drive.files.list({
6
+ q: opts.query || undefined,
7
+ pageSize: opts.pageSize ?? 25,
8
+ orderBy: "modifiedTime desc",
9
+ fields: "files(id,name,mimeType,size,createdTime,modifiedTime,webViewLink)",
10
+ });
11
+ return (res.data.files ?? []).map((f) => mapFile(f));
12
+ }
13
+ /** Get metadata for a single file. */
14
+ export async function getDriveFile(client, opts) {
15
+ const drive = google.drive({ version: "v3", auth: client });
16
+ const res = await drive.files.get({
17
+ fileId: opts.fileId,
18
+ fields: "id,name,mimeType,size,createdTime,modifiedTime,webViewLink",
19
+ });
20
+ return mapFile(res.data);
21
+ }
22
+ /** Create a file (text content) or a blank Google-native file (Doc/Sheet/Slides). */
23
+ export async function uploadDriveFile(client, opts) {
24
+ const drive = google.drive({ version: "v3", auth: client });
25
+ const requestBody = { name: opts.name, mimeType: opts.mimeType };
26
+ if (opts.parentFolderId)
27
+ requestBody.parents = [opts.parentFolderId];
28
+ const params = { requestBody };
29
+ if (opts.content !== undefined) {
30
+ params.media = { mimeType: opts.mimeType, body: opts.content };
31
+ }
32
+ const res = await drive.files.create(params);
33
+ return mapFile(res.data);
34
+ }
35
+ /** Update a file's metadata and/or content. */
36
+ export async function updateDriveFile(client, opts) {
37
+ const drive = google.drive({ version: "v3", auth: client });
38
+ const requestBody = {};
39
+ if (opts.name !== undefined)
40
+ requestBody.name = opts.name;
41
+ if (opts.mimeType !== undefined)
42
+ requestBody.mimeType = opts.mimeType;
43
+ const params = { fileId: opts.fileId, requestBody };
44
+ if (opts.content !== undefined) {
45
+ params.media = { mimeType: opts.mimeType ?? "text/plain", body: opts.content };
46
+ }
47
+ const res = await drive.files.update(params);
48
+ return mapFile(res.data);
49
+ }
50
+ /** Permanently delete a file. */
51
+ export async function deleteDriveFile(client, opts) {
52
+ const drive = google.drive({ version: "v3", auth: client });
53
+ await drive.files.delete({ fileId: opts.fileId });
54
+ }
55
+ /** Share a file with a user by email. */
56
+ export async function shareDriveFile(client, opts) {
57
+ const drive = google.drive({ version: "v3", auth: client });
58
+ const res = await drive.permissions.create({
59
+ fileId: opts.fileId,
60
+ requestBody: {
61
+ type: "user",
62
+ role: opts.role,
63
+ emailAddress: opts.email,
64
+ },
65
+ sendNotificationEmail: opts.sendNotificationEmail !== false,
66
+ });
67
+ return { id: (res.data.id ?? "") };
68
+ }
69
+ function mapFile(f) {
70
+ return {
71
+ id: f.id,
72
+ name: f.name,
73
+ mimeType: f.mimeType,
74
+ size: f.size,
75
+ createdTime: f.createdTime,
76
+ modifiedTime: f.modifiedTime,
77
+ webViewLink: f.webViewLink,
78
+ };
79
+ }
80
+ //# sourceMappingURL=drive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive.js","sourceRoot":"","sources":["../../src/services/drive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Auth, forms_v1 } from "googleapis";
2
+ export interface GetFormArgs {
3
+ formId: string;
4
+ }
5
+ export interface AddQuestionArgs {
6
+ formId: string;
7
+ title: string;
8
+ description?: string;
9
+ /** Question type: text (default) or multiple_choice. */
10
+ type?: "text" | "multiple_choice";
11
+ /** Required for multiple_choice. */
12
+ options?: string[];
13
+ required?: boolean;
14
+ }
15
+ export declare function getForm(client: Auth.OAuth2Client, { formId }: GetFormArgs): Promise<any>;
16
+ export declare function getFormResponses(client: Auth.OAuth2Client, { formId, pageSize }: GetFormArgs & {
17
+ pageSize?: number;
18
+ }): Promise<any[]>;
19
+ export declare function createForm(client: Auth.OAuth2Client, { title }: {
20
+ title: string;
21
+ }): Promise<any>;
22
+ export declare function addQuestion(client: Auth.OAuth2Client, { formId, title, description, type, options, required }: AddQuestionArgs): Promise<any>;
23
+ export type BatchUpdateArgs = {
24
+ formId: string;
25
+ requests: forms_v1.Schema$Request[];
26
+ };
27
+ export declare function batchUpdateForm(client: Auth.OAuth2Client, { formId, requests }: BatchUpdateArgs): Promise<any>;
28
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../src/services/forms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGjD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC;IAClC,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAI9F;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,MAAM,EAAE,QAAc,EAAE,EAAE,WAAW,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,OAAO,CAAC,GAAG,EAAE,CAAC,CAIhB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAItG;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAsB,EAAE,OAAO,EAAE,QAAgB,EAAE,EAAE,eAAe,GACjG,OAAO,CAAC,GAAG,CAAC,CA8Bd;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;CACrC,CAAC;AAEF,wBAAsB,eAAe,CACnC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,eAAe,GACpC,OAAO,CAAC,GAAG,CAAC,CAId"}