@digitalpresence/cliclaw 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.
- package/dist/__tests__/calendar.integration.test.d.ts +2 -0
- package/dist/__tests__/calendar.integration.test.d.ts.map +1 -0
- package/dist/__tests__/calendar.integration.test.js +98 -0
- package/dist/__tests__/calendar.integration.test.js.map +1 -0
- package/dist/__tests__/forms.integration.test.d.ts +2 -0
- package/dist/__tests__/forms.integration.test.d.ts.map +1 -0
- package/dist/__tests__/forms.integration.test.js +243 -0
- package/dist/__tests__/forms.integration.test.js.map +1 -0
- package/dist/__tests__/gdrive.integration.test.d.ts +2 -0
- package/dist/__tests__/gdrive.integration.test.d.ts.map +1 -0
- package/dist/__tests__/gdrive.integration.test.js +186 -0
- package/dist/__tests__/gdrive.integration.test.js.map +1 -0
- package/dist/__tests__/gmail.integration.test.d.ts +2 -0
- package/dist/__tests__/gmail.integration.test.d.ts.map +1 -0
- package/dist/__tests__/gmail.integration.test.js +197 -0
- package/dist/__tests__/gmail.integration.test.js.map +1 -0
- package/dist/__tests__/gslides.integration.test.d.ts +2 -0
- package/dist/__tests__/gslides.integration.test.d.ts.map +1 -0
- package/dist/__tests__/gslides.integration.test.js +124 -0
- package/dist/__tests__/gslides.integration.test.js.map +1 -0
- package/dist/__tests__/sheets.integration.test.d.ts +2 -0
- package/dist/__tests__/sheets.integration.test.d.ts.map +1 -0
- package/dist/__tests__/sheets.integration.test.js +150 -0
- package/dist/__tests__/sheets.integration.test.js.map +1 -0
- package/dist/agent/crud.d.ts +6 -0
- package/dist/agent/crud.d.ts.map +1 -0
- package/dist/agent/crud.js +41 -0
- package/dist/agent/crud.js.map +1 -0
- package/dist/agent/memory.d.ts +14 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +66 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/permissions.d.ts +4 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +32 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/calendar/accounts.d.ts +3 -0
- package/dist/calendar/accounts.d.ts.map +1 -0
- package/dist/calendar/accounts.js +21 -0
- package/dist/calendar/accounts.js.map +1 -0
- package/dist/calendar/auth.d.ts +3 -0
- package/dist/calendar/auth.d.ts.map +1 -0
- package/dist/calendar/auth.js +41 -0
- package/dist/calendar/auth.js.map +1 -0
- package/dist/calendar/calendars.d.ts +3 -0
- package/dist/calendar/calendars.d.ts.map +1 -0
- package/dist/calendar/calendars.js +28 -0
- package/dist/calendar/calendars.js.map +1 -0
- package/dist/calendar/create.d.ts +3 -0
- package/dist/calendar/create.d.ts.map +1 -0
- package/dist/calendar/create.js +31 -0
- package/dist/calendar/create.js.map +1 -0
- package/dist/calendar/delete.d.ts +3 -0
- package/dist/calendar/delete.d.ts.map +1 -0
- package/dist/calendar/delete.js +21 -0
- package/dist/calendar/delete.js.map +1 -0
- package/dist/calendar/events.d.ts +3 -0
- package/dist/calendar/events.d.ts.map +1 -0
- package/dist/calendar/events.js +37 -0
- package/dist/calendar/events.js.map +1 -0
- package/dist/calendar/get.d.ts +3 -0
- package/dist/calendar/get.d.ts.map +1 -0
- package/dist/calendar/get.js +21 -0
- package/dist/calendar/get.js.map +1 -0
- package/dist/calendar/update.d.ts +3 -0
- package/dist/calendar/update.d.ts.map +1 -0
- package/dist/calendar/update.js +31 -0
- package/dist/calendar/update.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent.d.ts +6 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +107 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/calendar.d.ts +9 -0
- package/dist/commands/calendar.d.ts.map +1 -0
- package/dist/commands/calendar.js +104 -0
- package/dist/commands/calendar.js.map +1 -0
- package/dist/commands/cron.d.ts +6 -0
- package/dist/commands/cron.d.ts.map +1 -0
- package/dist/commands/cron.js +103 -0
- package/dist/commands/cron.js.map +1 -0
- package/dist/commands/forms.d.ts +9 -0
- package/dist/commands/forms.d.ts.map +1 -0
- package/dist/commands/forms.js +139 -0
- package/dist/commands/forms.js.map +1 -0
- package/dist/commands/gdrive.d.ts +9 -0
- package/dist/commands/gdrive.d.ts.map +1 -0
- package/dist/commands/gdrive.js +198 -0
- package/dist/commands/gdrive.js.map +1 -0
- package/dist/commands/gmail.d.ts +9 -0
- package/dist/commands/gmail.d.ts.map +1 -0
- package/dist/commands/gmail.js +231 -0
- package/dist/commands/gmail.js.map +1 -0
- package/dist/commands/gslides.d.ts +9 -0
- package/dist/commands/gslides.d.ts.map +1 -0
- package/dist/commands/gslides.js +167 -0
- package/dist/commands/gslides.js.map +1 -0
- package/dist/commands/sheets.d.ts +9 -0
- package/dist/commands/sheets.d.ts.map +1 -0
- package/dist/commands/sheets.js +174 -0
- package/dist/commands/sheets.js.map +1 -0
- package/dist/cron/daemon.d.ts +3 -0
- package/dist/cron/daemon.d.ts.map +1 -0
- package/dist/cron/daemon.js +127 -0
- package/dist/cron/daemon.js.map +1 -0
- package/dist/cron/handlers.d.ts +6 -0
- package/dist/cron/handlers.d.ts.map +1 -0
- package/dist/cron/handlers.js +58 -0
- package/dist/cron/handlers.js.map +1 -0
- package/dist/cron/logger.d.ts +4 -0
- package/dist/cron/logger.d.ts.map +1 -0
- package/dist/cron/logger.js +11 -0
- package/dist/cron/logger.js.map +1 -0
- package/dist/cron/progress.d.ts +25 -0
- package/dist/cron/progress.d.ts.map +1 -0
- package/dist/cron/progress.js +71 -0
- package/dist/cron/progress.js.map +1 -0
- package/dist/cron/ralph-wiggum.d.ts +18 -0
- package/dist/cron/ralph-wiggum.d.ts.map +1 -0
- package/dist/cron/ralph-wiggum.js +143 -0
- package/dist/cron/ralph-wiggum.js.map +1 -0
- package/dist/forms/accounts.d.ts +3 -0
- package/dist/forms/accounts.d.ts.map +1 -0
- package/dist/forms/accounts.js +20 -0
- package/dist/forms/accounts.js.map +1 -0
- package/dist/forms/auth.d.ts +3 -0
- package/dist/forms/auth.d.ts.map +1 -0
- package/dist/forms/auth.js +41 -0
- package/dist/forms/auth.js.map +1 -0
- package/dist/forms/create.d.ts +3 -0
- package/dist/forms/create.d.ts.map +1 -0
- package/dist/forms/create.js +28 -0
- package/dist/forms/create.js.map +1 -0
- package/dist/forms/get.d.ts +3 -0
- package/dist/forms/get.d.ts.map +1 -0
- package/dist/forms/get.js +21 -0
- package/dist/forms/get.js.map +1 -0
- package/dist/forms/list.d.ts +3 -0
- package/dist/forms/list.d.ts.map +1 -0
- package/dist/forms/list.js +33 -0
- package/dist/forms/list.js.map +1 -0
- package/dist/forms/questions.d.ts +6 -0
- package/dist/forms/questions.d.ts.map +1 -0
- package/dist/forms/questions.js +179 -0
- package/dist/forms/questions.js.map +1 -0
- package/dist/forms/responses.d.ts +4 -0
- package/dist/forms/responses.d.ts.map +1 -0
- package/dist/forms/responses.js +40 -0
- package/dist/forms/responses.js.map +1 -0
- package/dist/forms/update.d.ts +3 -0
- package/dist/forms/update.d.ts.map +1 -0
- package/dist/forms/update.js +44 -0
- package/dist/forms/update.js.map +1 -0
- package/dist/gdrive/about.d.ts +3 -0
- package/dist/gdrive/about.d.ts.map +1 -0
- package/dist/gdrive/about.js +31 -0
- package/dist/gdrive/about.js.map +1 -0
- package/dist/gdrive/accounts.d.ts +3 -0
- package/dist/gdrive/accounts.d.ts.map +1 -0
- package/dist/gdrive/accounts.js +20 -0
- package/dist/gdrive/accounts.js.map +1 -0
- package/dist/gdrive/auth.d.ts +3 -0
- package/dist/gdrive/auth.d.ts.map +1 -0
- package/dist/gdrive/auth.js +51 -0
- package/dist/gdrive/auth.js.map +1 -0
- package/dist/gdrive/files.d.ts +12 -0
- package/dist/gdrive/files.d.ts.map +1 -0
- package/dist/gdrive/files.js +174 -0
- package/dist/gdrive/files.js.map +1 -0
- package/dist/gdrive/folders.d.ts +4 -0
- package/dist/gdrive/folders.d.ts.map +1 -0
- package/dist/gdrive/folders.js +46 -0
- package/dist/gdrive/folders.js.map +1 -0
- package/dist/gdrive/search.d.ts +3 -0
- package/dist/gdrive/search.d.ts.map +1 -0
- package/dist/gdrive/search.js +23 -0
- package/dist/gdrive/search.js.map +1 -0
- package/dist/gdrive/sharing.d.ts +5 -0
- package/dist/gdrive/sharing.d.ts.map +1 -0
- package/dist/gdrive/sharing.js +54 -0
- package/dist/gdrive/sharing.js.map +1 -0
- package/dist/gmail/accounts.d.ts +3 -0
- package/dist/gmail/accounts.d.ts.map +1 -0
- package/dist/gmail/accounts.js +18 -0
- package/dist/gmail/accounts.js.map +1 -0
- package/dist/gmail/auth.d.ts +3 -0
- package/dist/gmail/auth.d.ts.map +1 -0
- package/dist/gmail/auth.js +50 -0
- package/dist/gmail/auth.js.map +1 -0
- package/dist/gmail/drafts.d.ts +7 -0
- package/dist/gmail/drafts.d.ts.map +1 -0
- package/dist/gmail/drafts.js +103 -0
- package/dist/gmail/drafts.js.map +1 -0
- package/dist/gmail/get.d.ts +4 -0
- package/dist/gmail/get.d.ts.map +1 -0
- package/dist/gmail/get.js +140 -0
- package/dist/gmail/get.js.map +1 -0
- package/dist/gmail/inbox.d.ts +4 -0
- package/dist/gmail/inbox.d.ts.map +1 -0
- package/dist/gmail/inbox.js +45 -0
- package/dist/gmail/inbox.js.map +1 -0
- package/dist/gmail/labels.d.ts +5 -0
- package/dist/gmail/labels.d.ts.map +1 -0
- package/dist/gmail/labels.js +45 -0
- package/dist/gmail/labels.js.map +1 -0
- package/dist/gmail/modify.d.ts +5 -0
- package/dist/gmail/modify.d.ts.map +1 -0
- package/dist/gmail/modify.js +68 -0
- package/dist/gmail/modify.js.map +1 -0
- package/dist/gmail/send.d.ts +5 -0
- package/dist/gmail/send.d.ts.map +1 -0
- package/dist/gmail/send.js +310 -0
- package/dist/gmail/send.js.map +1 -0
- package/dist/gmail/threads.d.ts +4 -0
- package/dist/gmail/threads.d.ts.map +1 -0
- package/dist/gmail/threads.js +47 -0
- package/dist/gmail/threads.js.map +1 -0
- package/dist/gslides/accounts.d.ts +3 -0
- package/dist/gslides/accounts.d.ts.map +1 -0
- package/dist/gslides/accounts.js +20 -0
- package/dist/gslides/accounts.js.map +1 -0
- package/dist/gslides/auth.d.ts +3 -0
- package/dist/gslides/auth.d.ts.map +1 -0
- package/dist/gslides/auth.js +50 -0
- package/dist/gslides/auth.js.map +1 -0
- package/dist/gslides/presentations.d.ts +29 -0
- package/dist/gslides/presentations.d.ts.map +1 -0
- package/dist/gslides/presentations.js +320 -0
- package/dist/gslides/presentations.js.map +1 -0
- package/dist/lib/config.d.ts +6 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +12 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/media-utils.d.ts +5 -0
- package/dist/lib/media-utils.d.ts.map +1 -0
- package/dist/lib/media-utils.js +79 -0
- package/dist/lib/media-utils.js.map +1 -0
- package/dist/lib/output.d.ts +4 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +12 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/sheets/accounts.d.ts +3 -0
- package/dist/sheets/accounts.d.ts.map +1 -0
- package/dist/sheets/accounts.js +20 -0
- package/dist/sheets/accounts.js.map +1 -0
- package/dist/sheets/auth.d.ts +3 -0
- package/dist/sheets/auth.d.ts.map +1 -0
- package/dist/sheets/auth.js +56 -0
- package/dist/sheets/auth.js.map +1 -0
- package/dist/sheets/cells.d.ts +6 -0
- package/dist/sheets/cells.d.ts.map +1 -0
- package/dist/sheets/cells.js +89 -0
- package/dist/sheets/cells.js.map +1 -0
- package/dist/sheets/format.d.ts +8 -0
- package/dist/sheets/format.d.ts.map +1 -0
- package/dist/sheets/format.js +97 -0
- package/dist/sheets/format.js.map +1 -0
- package/dist/sheets/sheets-tab.d.ts +6 -0
- package/dist/sheets/sheets-tab.d.ts.map +1 -0
- package/dist/sheets/sheets-tab.js +88 -0
- package/dist/sheets/sheets-tab.js.map +1 -0
- package/dist/sheets/spreadsheets.d.ts +6 -0
- package/dist/sheets/spreadsheets.d.ts.map +1 -0
- package/dist/sheets/spreadsheets.js +88 -0
- package/dist/sheets/spreadsheets.js.map +1 -0
- package/package.json +33 -0
- package/src/__tests__/calendar.integration.test.ts +152 -0
- package/src/__tests__/forms.integration.test.ts +403 -0
- package/src/__tests__/gdrive.integration.test.ts +253 -0
- package/src/__tests__/gmail.integration.test.ts +294 -0
- package/src/__tests__/gslides.integration.test.ts +195 -0
- package/src/__tests__/sheets.integration.test.ts +234 -0
- package/src/agent/crud.ts +54 -0
- package/src/agent/memory.ts +95 -0
- package/src/agent/permissions.ts +54 -0
- package/src/calendar/accounts.ts +25 -0
- package/src/calendar/auth.ts +45 -0
- package/src/calendar/calendars.ts +32 -0
- package/src/calendar/create.ts +44 -0
- package/src/calendar/delete.ts +27 -0
- package/src/calendar/events.ts +45 -0
- package/src/calendar/get.ts +27 -0
- package/src/calendar/update.ts +44 -0
- package/src/cli.ts +41 -0
- package/src/commands/agent.ts +128 -0
- package/src/commands/calendar.ts +127 -0
- package/src/commands/cron.ts +126 -0
- package/src/commands/forms.ts +158 -0
- package/src/commands/gdrive.ts +225 -0
- package/src/commands/gmail.ts +290 -0
- package/src/commands/gslides.ts +188 -0
- package/src/commands/sheets.ts +193 -0
- package/src/cron/daemon.ts +143 -0
- package/src/cron/handlers.ts +78 -0
- package/src/cron/logger.ts +20 -0
- package/src/cron/progress.ts +90 -0
- package/src/cron/ralph-wiggum.ts +172 -0
- package/src/forms/accounts.ts +24 -0
- package/src/forms/auth.ts +45 -0
- package/src/forms/create.ts +34 -0
- package/src/forms/get.ts +26 -0
- package/src/forms/list.ts +38 -0
- package/src/forms/questions.ts +209 -0
- package/src/forms/responses.ts +50 -0
- package/src/forms/update.ts +57 -0
- package/src/gdrive/about.ts +36 -0
- package/src/gdrive/accounts.ts +24 -0
- package/src/gdrive/auth.ts +55 -0
- package/src/gdrive/files.ts +237 -0
- package/src/gdrive/folders.ts +58 -0
- package/src/gdrive/search.ts +30 -0
- package/src/gdrive/sharing.ts +72 -0
- package/src/gmail/accounts.ts +22 -0
- package/src/gmail/auth.ts +53 -0
- package/src/gmail/drafts.ts +166 -0
- package/src/gmail/get.ts +195 -0
- package/src/gmail/inbox.ts +78 -0
- package/src/gmail/labels.ts +69 -0
- package/src/gmail/modify.ts +89 -0
- package/src/gmail/send.ts +424 -0
- package/src/gmail/threads.ts +68 -0
- package/src/gslides/accounts.ts +24 -0
- package/src/gslides/auth.ts +54 -0
- package/src/gslides/presentations.ts +384 -0
- package/src/lib/config.ts +14 -0
- package/src/lib/media-utils.ts +82 -0
- package/src/lib/output.ts +13 -0
- package/src/sheets/accounts.ts +24 -0
- package/src/sheets/auth.ts +60 -0
- package/src/sheets/cells.ts +112 -0
- package/src/sheets/format.ts +114 -0
- package/src/sheets/sheets-tab.ts +109 -0
- package/src/sheets/spreadsheets.ts +106 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +7 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
import { outputJson, outputError, outputAuthRequired } from "../lib/output.js";
|
|
3
|
+
function getForms(clientManager, tokenKey) {
|
|
4
|
+
const client = clientManager.getClient(tokenKey);
|
|
5
|
+
if (!client.credentials?.access_token && !client.credentials?.refresh_token) {
|
|
6
|
+
outputAuthRequired("forms");
|
|
7
|
+
}
|
|
8
|
+
return google.forms({ version: "v1", auth: client });
|
|
9
|
+
}
|
|
10
|
+
export async function handleQuestions(clientManager, account, formId) {
|
|
11
|
+
const tokenKey = `forms:${account}`;
|
|
12
|
+
try {
|
|
13
|
+
const forms = getForms(clientManager, tokenKey);
|
|
14
|
+
const res = await forms.forms.get({ formId });
|
|
15
|
+
const items = res.data.items ?? [];
|
|
16
|
+
const questions = items
|
|
17
|
+
.filter((item) => item.questionItem)
|
|
18
|
+
.map((item) => ({
|
|
19
|
+
itemId: item.itemId,
|
|
20
|
+
title: item.title,
|
|
21
|
+
description: item.description,
|
|
22
|
+
questionId: item.questionItem?.question?.questionId,
|
|
23
|
+
required: item.questionItem?.question?.required ?? false,
|
|
24
|
+
type: getQuestionType(item.questionItem?.question),
|
|
25
|
+
}));
|
|
26
|
+
outputJson(questions);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
outputError("questions_failed", err instanceof Error ? err.message : String(err));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function getQuestionType(question) {
|
|
33
|
+
if (!question || typeof question !== "object")
|
|
34
|
+
return "unknown";
|
|
35
|
+
const q = question;
|
|
36
|
+
if (q.choiceQuestion)
|
|
37
|
+
return "choice";
|
|
38
|
+
if (q.textQuestion)
|
|
39
|
+
return "text";
|
|
40
|
+
if (q.scaleQuestion)
|
|
41
|
+
return "scale";
|
|
42
|
+
if (q.dateQuestion)
|
|
43
|
+
return "date";
|
|
44
|
+
if (q.timeQuestion)
|
|
45
|
+
return "time";
|
|
46
|
+
if (q.fileUploadQuestion)
|
|
47
|
+
return "fileUpload";
|
|
48
|
+
return "unknown";
|
|
49
|
+
}
|
|
50
|
+
export async function handleAddQuestion(clientManager, account, formId, title, type, required, options, index) {
|
|
51
|
+
const tokenKey = `forms:${account}`;
|
|
52
|
+
try {
|
|
53
|
+
const forms = getForms(clientManager, tokenKey);
|
|
54
|
+
const question = { required };
|
|
55
|
+
switch (type) {
|
|
56
|
+
case "text":
|
|
57
|
+
question.textQuestion = { paragraph: false };
|
|
58
|
+
break;
|
|
59
|
+
case "paragraph":
|
|
60
|
+
question.textQuestion = { paragraph: true };
|
|
61
|
+
break;
|
|
62
|
+
case "choice":
|
|
63
|
+
question.choiceQuestion = {
|
|
64
|
+
type: "RADIO",
|
|
65
|
+
options: (options ?? ["Option 1"]).map((o) => ({ value: o })),
|
|
66
|
+
};
|
|
67
|
+
break;
|
|
68
|
+
case "checkbox":
|
|
69
|
+
question.choiceQuestion = {
|
|
70
|
+
type: "CHECKBOX",
|
|
71
|
+
options: (options ?? ["Option 1"]).map((o) => ({ value: o })),
|
|
72
|
+
};
|
|
73
|
+
break;
|
|
74
|
+
case "dropdown":
|
|
75
|
+
question.choiceQuestion = {
|
|
76
|
+
type: "DROP_DOWN",
|
|
77
|
+
options: (options ?? ["Option 1"]).map((o) => ({ value: o })),
|
|
78
|
+
};
|
|
79
|
+
break;
|
|
80
|
+
case "scale":
|
|
81
|
+
question.scaleQuestion = { low: 1, high: 5 };
|
|
82
|
+
break;
|
|
83
|
+
case "date":
|
|
84
|
+
question.dateQuestion = {};
|
|
85
|
+
break;
|
|
86
|
+
case "time":
|
|
87
|
+
question.timeQuestion = {};
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
question.textQuestion = { paragraph: false };
|
|
91
|
+
}
|
|
92
|
+
const res = await forms.forms.batchUpdate({
|
|
93
|
+
formId,
|
|
94
|
+
requestBody: {
|
|
95
|
+
requests: [
|
|
96
|
+
{
|
|
97
|
+
createItem: {
|
|
98
|
+
item: {
|
|
99
|
+
title,
|
|
100
|
+
questionItem: { question },
|
|
101
|
+
},
|
|
102
|
+
location: { index: index ?? 0 },
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
outputJson({ success: true, ...res.data });
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
outputError("add_question_failed", err instanceof Error ? err.message : String(err));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export async function handleUpdateQuestion(clientManager, account, formId, itemIndex, title, required) {
|
|
115
|
+
const tokenKey = `forms:${account}`;
|
|
116
|
+
try {
|
|
117
|
+
const forms = getForms(clientManager, tokenKey);
|
|
118
|
+
// First get the current form to find the item
|
|
119
|
+
const current = await forms.forms.get({ formId });
|
|
120
|
+
const items = current.data.items ?? [];
|
|
121
|
+
if (itemIndex >= items.length) {
|
|
122
|
+
outputError("update_question_failed", `Item index ${itemIndex} out of range (form has ${items.length} items)`);
|
|
123
|
+
}
|
|
124
|
+
const item = items[itemIndex];
|
|
125
|
+
const updateMasks = [];
|
|
126
|
+
if (title !== undefined) {
|
|
127
|
+
item.title = title;
|
|
128
|
+
updateMasks.push("title");
|
|
129
|
+
}
|
|
130
|
+
if (required !== undefined && item.questionItem?.question) {
|
|
131
|
+
item.questionItem.question.required = required;
|
|
132
|
+
updateMasks.push("questionItem.question.required");
|
|
133
|
+
}
|
|
134
|
+
if (updateMasks.length === 0) {
|
|
135
|
+
outputError("update_question_failed", "No fields to update.");
|
|
136
|
+
}
|
|
137
|
+
const res = await forms.forms.batchUpdate({
|
|
138
|
+
formId,
|
|
139
|
+
requestBody: {
|
|
140
|
+
requests: [
|
|
141
|
+
{
|
|
142
|
+
updateItem: {
|
|
143
|
+
item,
|
|
144
|
+
location: { index: itemIndex },
|
|
145
|
+
updateMask: updateMasks.join(","),
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
outputJson({ success: true, ...res.data });
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
outputError("update_question_failed", err instanceof Error ? err.message : String(err));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export async function handleDeleteQuestion(clientManager, account, formId, itemIndex) {
|
|
158
|
+
const tokenKey = `forms:${account}`;
|
|
159
|
+
try {
|
|
160
|
+
const forms = getForms(clientManager, tokenKey);
|
|
161
|
+
const res = await forms.forms.batchUpdate({
|
|
162
|
+
formId,
|
|
163
|
+
requestBody: {
|
|
164
|
+
requests: [
|
|
165
|
+
{
|
|
166
|
+
deleteItem: {
|
|
167
|
+
location: { index: itemIndex },
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
outputJson({ success: true, ...res.data });
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
outputError("delete_question_failed", err instanceof Error ? err.message : String(err));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=questions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questions.js","sourceRoot":"","sources":["../../src/forms/questions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { OAuthClientManager } from "@digitalpresence/cliclaw-auth";
|
|
2
|
+
export declare function handleResponses(clientManager: OAuthClientManager, account: string, formId: string): Promise<void>;
|
|
3
|
+
export declare function handleGetResponse(clientManager: OAuthClientManager, account: string, formId: string, responseId: string): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=responses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/forms/responses.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAWxE,wBAAsB,eAAe,CACnC,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CASf"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
import { outputJson, outputError, outputAuthRequired } from "../lib/output.js";
|
|
3
|
+
function getForms(clientManager, tokenKey) {
|
|
4
|
+
const client = clientManager.getClient(tokenKey);
|
|
5
|
+
if (!client.credentials?.access_token && !client.credentials?.refresh_token) {
|
|
6
|
+
outputAuthRequired("forms");
|
|
7
|
+
}
|
|
8
|
+
return google.forms({ version: "v1", auth: client });
|
|
9
|
+
}
|
|
10
|
+
export async function handleResponses(clientManager, account, formId) {
|
|
11
|
+
const tokenKey = `forms:${account}`;
|
|
12
|
+
try {
|
|
13
|
+
const forms = getForms(clientManager, tokenKey);
|
|
14
|
+
const res = await forms.forms.responses.list({ formId });
|
|
15
|
+
const responses = (res.data.responses ?? []).map((r) => ({
|
|
16
|
+
responseId: r.responseId,
|
|
17
|
+
createTime: r.createTime,
|
|
18
|
+
lastSubmittedTime: r.lastSubmittedTime,
|
|
19
|
+
respondentEmail: r.respondentEmail,
|
|
20
|
+
totalScore: r.totalScore,
|
|
21
|
+
answers: r.answers,
|
|
22
|
+
}));
|
|
23
|
+
outputJson(responses);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
outputError("responses_failed", err instanceof Error ? err.message : String(err));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function handleGetResponse(clientManager, account, formId, responseId) {
|
|
30
|
+
const tokenKey = `forms:${account}`;
|
|
31
|
+
try {
|
|
32
|
+
const forms = getForms(clientManager, tokenKey);
|
|
33
|
+
const res = await forms.forms.responses.get({ formId, responseId });
|
|
34
|
+
outputJson(res.data);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
outputError("get_response_failed", err instanceof Error ? err.message : String(err));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=responses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/forms/responses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,SAAS,QAAQ,CAAC,aAAiC,EAAE,QAAgB;IACnE,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;QAC5E,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,aAAiC,EACjC,OAAe,EACf,MAAc;IAEd,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvD,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;YACtC,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC,CAAC;QACJ,UAAU,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,kBAAkB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACpF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,aAAiC,EACjC,OAAe,EACf,MAAc,EACd,UAAkB;IAElB,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACpE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,qBAAqB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACvF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { OAuthClientManager } from "@digitalpresence/cliclaw-auth";
|
|
2
|
+
export declare function handleUpdateForm(clientManager: OAuthClientManager, account: string, formId: string, title?: string, description?: string): Promise<void>;
|
|
3
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/forms/update.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAWxE,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAsCf"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
import { outputJson, outputError, outputAuthRequired } from "../lib/output.js";
|
|
3
|
+
function getForms(clientManager, tokenKey) {
|
|
4
|
+
const client = clientManager.getClient(tokenKey);
|
|
5
|
+
if (!client.credentials?.access_token && !client.credentials?.refresh_token) {
|
|
6
|
+
outputAuthRequired("forms");
|
|
7
|
+
}
|
|
8
|
+
return google.forms({ version: "v1", auth: client });
|
|
9
|
+
}
|
|
10
|
+
export async function handleUpdateForm(clientManager, account, formId, title, description) {
|
|
11
|
+
const tokenKey = `forms:${account}`;
|
|
12
|
+
try {
|
|
13
|
+
const forms = getForms(clientManager, tokenKey);
|
|
14
|
+
const requests = [];
|
|
15
|
+
if (title) {
|
|
16
|
+
requests.push({
|
|
17
|
+
updateFormInfo: {
|
|
18
|
+
info: { title },
|
|
19
|
+
updateMask: "title",
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (description) {
|
|
24
|
+
requests.push({
|
|
25
|
+
updateFormInfo: {
|
|
26
|
+
info: { description },
|
|
27
|
+
updateMask: "description",
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (requests.length === 0) {
|
|
32
|
+
outputError("update_form_failed", "No fields to update. Provide --title or --description.");
|
|
33
|
+
}
|
|
34
|
+
const res = await forms.forms.batchUpdate({
|
|
35
|
+
formId,
|
|
36
|
+
requestBody: { requests },
|
|
37
|
+
});
|
|
38
|
+
outputJson({ success: true, ...res.data });
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
outputError("update_form_failed", err instanceof Error ? err.message : String(err));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/forms/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,SAAS,QAAQ,CAAC,aAAiC,EAAE,QAAgB;IACnE,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;QAC5E,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAiC,EACjC,OAAe,EACf,MAAc,EACd,KAAc,EACd,WAAoB;IAEpB,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAEhD,MAAM,QAAQ,GAAmC,EAAE,CAAC;QAEpD,IAAI,KAAK,EAAE,CAAC;YACV,QAAQ,CAAC,IAAI,CAAC;gBACZ,cAAc,EAAE;oBACd,IAAI,EAAE,EAAE,KAAK,EAAE;oBACf,UAAU,EAAE,OAAO;iBACpB;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC;gBACZ,cAAc,EAAE;oBACd,IAAI,EAAE,EAAE,WAAW,EAAE;oBACrB,UAAU,EAAE,aAAa;iBAC1B;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,WAAW,CAAC,oBAAoB,EAAE,wDAAwD,CAAC,CAAC;QAC9F,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;YACxC,MAAM;YACN,WAAW,EAAE,EAAE,QAAQ,EAAE;SAC1B,CAAC,CAAC;QAEH,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,oBAAoB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACtF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"about.d.ts","sourceRoot":"","sources":["../../src/gdrive/about.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,wBAAsB,WAAW,CAC/B,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
import { outputJson, outputError, outputAuthRequired } from "../lib/output.js";
|
|
3
|
+
export async function handleAbout(clientManager, account) {
|
|
4
|
+
const tokenKey = `gdrive:${account}`;
|
|
5
|
+
try {
|
|
6
|
+
const client = clientManager.getClient(tokenKey);
|
|
7
|
+
if (!client.credentials?.access_token && !client.credentials?.refresh_token) {
|
|
8
|
+
outputAuthRequired("gdrive");
|
|
9
|
+
}
|
|
10
|
+
const drive = google.drive({ version: "v3", auth: client });
|
|
11
|
+
const res = await drive.about.get({
|
|
12
|
+
fields: "user, storageQuota",
|
|
13
|
+
});
|
|
14
|
+
const quota = res.data.storageQuota;
|
|
15
|
+
outputJson({
|
|
16
|
+
user: res.data.user,
|
|
17
|
+
storageQuota: quota
|
|
18
|
+
? {
|
|
19
|
+
limit: quota.limit ? `${(Number(quota.limit) / 1e9).toFixed(2)} GB` : "unlimited",
|
|
20
|
+
usage: `${(Number(quota.usage ?? 0) / 1e9).toFixed(2)} GB`,
|
|
21
|
+
usageInDrive: `${(Number(quota.usageInDrive ?? 0) / 1e9).toFixed(2)} GB`,
|
|
22
|
+
usageInDriveTrash: `${(Number(quota.usageInDriveTrash ?? 0) / 1e9).toFixed(2)} GB`,
|
|
23
|
+
}
|
|
24
|
+
: null,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
outputError("about_failed", err instanceof Error ? err.message : String(err));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=about.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/gdrive/about.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,aAAiC,EACjC,OAAe;IAEf,MAAM,QAAQ,GAAG,UAAU,OAAO,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;YAC5E,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAE5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;YAChC,MAAM,EAAE,oBAAoB;SAC7B,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;QACpC,UAAU,CAAC;YACT,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;YACnB,YAAY,EAAE,KAAK;gBACjB,CAAC,CAAC;oBACE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW;oBACjF,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;oBAC1D,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;oBACxE,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;iBACnF;gBACH,CAAC,CAAC,IAAI;SACT,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,cAAc,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/gdrive/accounts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,wBAAsB,cAAc,CAAC,aAAa,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
import { outputJson } from "../lib/output.js";
|
|
3
|
+
export async function handleAccounts(clientManager) {
|
|
4
|
+
const allAccounts = clientManager.listAccounts();
|
|
5
|
+
const gdriveAccounts = allAccounts.filter((a) => a.startsWith("gdrive:"));
|
|
6
|
+
const accounts = await Promise.all(gdriveAccounts.map(async (tokenKey) => {
|
|
7
|
+
const account = tokenKey.replace("gdrive:", "");
|
|
8
|
+
try {
|
|
9
|
+
const client = clientManager.getClient(tokenKey);
|
|
10
|
+
const drive = google.drive({ version: "v3", auth: client });
|
|
11
|
+
const about = await drive.about.get({ fields: "user" });
|
|
12
|
+
return { account, email: about.data.user?.emailAddress ?? null };
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return { account, email: null };
|
|
16
|
+
}
|
|
17
|
+
}));
|
|
18
|
+
outputJson({ accounts });
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/gdrive/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,aAAiC;IACpE,MAAM,WAAW,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC;IACjD,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAE1E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACxD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,IAAI,IAAI,EAAE,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/gdrive/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAIxE,wBAAsB,UAAU,CAAC,aAAa,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDhH"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
import { waitForOAuthCallback, getGDriveAuthUrl } from "@digitalpresence/cliclaw-auth";
|
|
3
|
+
import { outputJson, outputError } from "../lib/output.js";
|
|
4
|
+
export async function handleAuth(clientManager, port, account) {
|
|
5
|
+
const tokenKey = `gdrive:${account}`;
|
|
6
|
+
// Check if already authenticated
|
|
7
|
+
try {
|
|
8
|
+
const client = clientManager.getClient(tokenKey);
|
|
9
|
+
const creds = client.credentials;
|
|
10
|
+
if (creds && (creds.refresh_token || creds.access_token)) {
|
|
11
|
+
const drive = google.drive({ version: "v3", auth: client });
|
|
12
|
+
const about = await drive.about.get({ fields: "user" });
|
|
13
|
+
outputJson({
|
|
14
|
+
status: "already_authenticated",
|
|
15
|
+
account,
|
|
16
|
+
email: about.data.user?.emailAddress ?? "unknown",
|
|
17
|
+
message: "Existing session is still valid. No re-authentication needed.",
|
|
18
|
+
});
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Tokens invalid — proceed with re-auth
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const open = (await import("open")).default;
|
|
27
|
+
const rawClient = clientManager.getRawClient();
|
|
28
|
+
const tokens = await waitForOAuthCallback(rawClient, port, (url) => {
|
|
29
|
+
console.error(`Opening browser for Google Drive authentication...`);
|
|
30
|
+
console.error(url);
|
|
31
|
+
open(url).catch(() => {
|
|
32
|
+
console.error("Could not open browser. Please visit the URL above manually.");
|
|
33
|
+
});
|
|
34
|
+
}, getGDriveAuthUrl);
|
|
35
|
+
const client = clientManager.setCredentials(tokenKey, tokens);
|
|
36
|
+
const drive = google.drive({ version: "v3", auth: client });
|
|
37
|
+
let email = "unknown";
|
|
38
|
+
try {
|
|
39
|
+
const about = await drive.about.get({ fields: "user" });
|
|
40
|
+
email = about.data.user?.emailAddress ?? "unknown";
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Non-fatal
|
|
44
|
+
}
|
|
45
|
+
outputJson({ status: "authenticated", account, email });
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
outputError("auth_failed", err instanceof Error ? err.message : String(err));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/gdrive/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,aAAiC,EAAE,IAAY,EAAE,OAAe;IAC/F,MAAM,QAAQ,GAAG,UAAU,OAAO,EAAE,CAAC;IAErC,iCAAiC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACzD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACxD,UAAU,CAAC;gBACT,MAAM,EAAE,uBAAuB;gBAC/B,OAAO;gBACP,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,IAAI,SAAS;gBACjD,OAAO,EAAE,+DAA+D;aACzE,CAAC,CAAC;YACH,OAAO;QACT,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5C,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC;QAE/C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YACjE,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACnB,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;YAChF,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAErB,MAAM,MAAM,GAAG,aAAa,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE9D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5D,IAAI,KAAK,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACxD,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,IAAI,SAAS,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QAED,UAAU,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,CAAC,aAAa,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { OAuthClientManager } from "@digitalpresence/cliclaw-auth";
|
|
2
|
+
export declare function handleList(clientManager: OAuthClientManager, account: string, maxResults: number, query?: string): Promise<void>;
|
|
3
|
+
export declare function handleGet(clientManager: OAuthClientManager, account: string, fileId: string): Promise<void>;
|
|
4
|
+
export declare function handleDownload(clientManager: OAuthClientManager, account: string, fileId: string, saveDir: string, filename?: string): Promise<void>;
|
|
5
|
+
export declare function handleUpload(clientManager: OAuthClientManager, account: string, filePath: string, name?: string, parentId?: string): Promise<void>;
|
|
6
|
+
export declare function handleDelete(clientManager: OAuthClientManager, account: string, fileId: string): Promise<void>;
|
|
7
|
+
export declare function handleTrash(clientManager: OAuthClientManager, account: string, fileId: string): Promise<void>;
|
|
8
|
+
export declare function handleUntrash(clientManager: OAuthClientManager, account: string, fileId: string): Promise<void>;
|
|
9
|
+
export declare function handleMove(clientManager: OAuthClientManager, account: string, fileId: string, newParentId: string): Promise<void>;
|
|
10
|
+
export declare function handleCopy(clientManager: OAuthClientManager, account: string, fileId: string, name?: string): Promise<void>;
|
|
11
|
+
export declare function handleRename(clientManager: OAuthClientManager, account: string, fileId: string, name: string): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/gdrive/files.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAWxE,wBAAsB,UAAU,CAC9B,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,SAAS,CAC7B,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,cAAc,CAClC,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED,wBAAsB,YAAY,CAChC,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,YAAY,CAChC,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,WAAW,CAC/B,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,aAAa,CACjC,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,UAAU,CAC9B,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,UAAU,CAC9B,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAsB,YAAY,CAChC,aAAa,EAAE,kBAAkB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
import { createReadStream, createWriteStream } from "fs";
|
|
3
|
+
import { basename, join } from "path";
|
|
4
|
+
import { lookup } from "mime-types";
|
|
5
|
+
import { outputJson, outputError, outputAuthRequired } from "../lib/output.js";
|
|
6
|
+
function getDrive(clientManager, tokenKey) {
|
|
7
|
+
const client = clientManager.getClient(tokenKey);
|
|
8
|
+
if (!client.credentials?.access_token && !client.credentials?.refresh_token) {
|
|
9
|
+
outputAuthRequired("gdrive");
|
|
10
|
+
}
|
|
11
|
+
return google.drive({ version: "v3", auth: client });
|
|
12
|
+
}
|
|
13
|
+
export async function handleList(clientManager, account, maxResults, query) {
|
|
14
|
+
const tokenKey = `gdrive:${account}`;
|
|
15
|
+
try {
|
|
16
|
+
const drive = getDrive(clientManager, tokenKey);
|
|
17
|
+
const q = query ? query : "trashed = false";
|
|
18
|
+
const res = await drive.files.list({
|
|
19
|
+
q,
|
|
20
|
+
pageSize: maxResults,
|
|
21
|
+
fields: "files(id, name, mimeType, size, modifiedTime, parents, webViewLink)",
|
|
22
|
+
orderBy: "modifiedTime desc",
|
|
23
|
+
});
|
|
24
|
+
outputJson(res.data.files ?? []);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
outputError("list_failed", err instanceof Error ? err.message : String(err));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function handleGet(clientManager, account, fileId) {
|
|
31
|
+
const tokenKey = `gdrive:${account}`;
|
|
32
|
+
try {
|
|
33
|
+
const drive = getDrive(clientManager, tokenKey);
|
|
34
|
+
const res = await drive.files.get({
|
|
35
|
+
fileId,
|
|
36
|
+
fields: "id, name, mimeType, size, modifiedTime, createdTime, parents, webViewLink, description, starred, trashed, owners, permissions",
|
|
37
|
+
});
|
|
38
|
+
outputJson(res.data);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
outputError("get_failed", err instanceof Error ? err.message : String(err));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function handleDownload(clientManager, account, fileId, saveDir, filename) {
|
|
45
|
+
const tokenKey = `gdrive:${account}`;
|
|
46
|
+
try {
|
|
47
|
+
const drive = getDrive(clientManager, tokenKey);
|
|
48
|
+
// Get file metadata for name
|
|
49
|
+
const meta = await drive.files.get({ fileId, fields: "name, mimeType" });
|
|
50
|
+
const saveName = filename ?? meta.data.name ?? fileId;
|
|
51
|
+
const savePath = join(saveDir, saveName);
|
|
52
|
+
const res = await drive.files.get({ fileId, alt: "media" }, { responseType: "stream" });
|
|
53
|
+
await new Promise((resolve, reject) => {
|
|
54
|
+
const dest = createWriteStream(savePath);
|
|
55
|
+
res.data
|
|
56
|
+
.pipe(dest)
|
|
57
|
+
.on("finish", resolve)
|
|
58
|
+
.on("error", reject);
|
|
59
|
+
});
|
|
60
|
+
outputJson({ success: true, path: savePath, name: saveName });
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
outputError("download_failed", err instanceof Error ? err.message : String(err));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function handleUpload(clientManager, account, filePath, name, parentId) {
|
|
67
|
+
const tokenKey = `gdrive:${account}`;
|
|
68
|
+
try {
|
|
69
|
+
const drive = getDrive(clientManager, tokenKey);
|
|
70
|
+
const fileName = name ?? basename(filePath);
|
|
71
|
+
const mimeType = lookup(filePath) || "application/octet-stream";
|
|
72
|
+
const fileMetadata = { name: fileName };
|
|
73
|
+
if (parentId)
|
|
74
|
+
fileMetadata.parents = [parentId];
|
|
75
|
+
const res = await drive.files.create({
|
|
76
|
+
requestBody: fileMetadata,
|
|
77
|
+
media: {
|
|
78
|
+
mimeType,
|
|
79
|
+
body: createReadStream(filePath),
|
|
80
|
+
},
|
|
81
|
+
fields: "id, name, mimeType, size, webViewLink",
|
|
82
|
+
});
|
|
83
|
+
outputJson({ success: true, ...res.data });
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
outputError("upload_failed", err instanceof Error ? err.message : String(err));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export async function handleDelete(clientManager, account, fileId) {
|
|
90
|
+
const tokenKey = `gdrive:${account}`;
|
|
91
|
+
try {
|
|
92
|
+
const drive = getDrive(clientManager, tokenKey);
|
|
93
|
+
await drive.files.delete({ fileId });
|
|
94
|
+
outputJson({ success: true, fileId });
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
outputError("delete_failed", err instanceof Error ? err.message : String(err));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export async function handleTrash(clientManager, account, fileId) {
|
|
101
|
+
const tokenKey = `gdrive:${account}`;
|
|
102
|
+
try {
|
|
103
|
+
const drive = getDrive(clientManager, tokenKey);
|
|
104
|
+
await drive.files.update({ fileId, requestBody: { trashed: true } });
|
|
105
|
+
outputJson({ success: true, fileId, action: "trash" });
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
outputError("trash_failed", err instanceof Error ? err.message : String(err));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export async function handleUntrash(clientManager, account, fileId) {
|
|
112
|
+
const tokenKey = `gdrive:${account}`;
|
|
113
|
+
try {
|
|
114
|
+
const drive = getDrive(clientManager, tokenKey);
|
|
115
|
+
await drive.files.update({ fileId, requestBody: { trashed: false } });
|
|
116
|
+
outputJson({ success: true, fileId, action: "untrash" });
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
outputError("untrash_failed", err instanceof Error ? err.message : String(err));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export async function handleMove(clientManager, account, fileId, newParentId) {
|
|
123
|
+
const tokenKey = `gdrive:${account}`;
|
|
124
|
+
try {
|
|
125
|
+
const drive = getDrive(clientManager, tokenKey);
|
|
126
|
+
// Get current parents
|
|
127
|
+
const file = await drive.files.get({ fileId, fields: "parents" });
|
|
128
|
+
const previousParents = (file.data.parents ?? []).join(",");
|
|
129
|
+
const res = await drive.files.update({
|
|
130
|
+
fileId,
|
|
131
|
+
addParents: newParentId,
|
|
132
|
+
removeParents: previousParents,
|
|
133
|
+
fields: "id, name, parents",
|
|
134
|
+
});
|
|
135
|
+
outputJson({ success: true, ...res.data });
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
outputError("move_failed", err instanceof Error ? err.message : String(err));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export async function handleCopy(clientManager, account, fileId, name) {
|
|
142
|
+
const tokenKey = `gdrive:${account}`;
|
|
143
|
+
try {
|
|
144
|
+
const drive = getDrive(clientManager, tokenKey);
|
|
145
|
+
const requestBody = {};
|
|
146
|
+
if (name)
|
|
147
|
+
requestBody.name = name;
|
|
148
|
+
const res = await drive.files.copy({
|
|
149
|
+
fileId,
|
|
150
|
+
requestBody,
|
|
151
|
+
fields: "id, name, mimeType, size, webViewLink",
|
|
152
|
+
});
|
|
153
|
+
outputJson({ success: true, ...res.data });
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
outputError("copy_failed", err instanceof Error ? err.message : String(err));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export async function handleRename(clientManager, account, fileId, name) {
|
|
160
|
+
const tokenKey = `gdrive:${account}`;
|
|
161
|
+
try {
|
|
162
|
+
const drive = getDrive(clientManager, tokenKey);
|
|
163
|
+
const res = await drive.files.update({
|
|
164
|
+
fileId,
|
|
165
|
+
requestBody: { name },
|
|
166
|
+
fields: "id, name, mimeType",
|
|
167
|
+
});
|
|
168
|
+
outputJson({ success: true, ...res.data });
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
outputError("rename_failed", err instanceof Error ? err.message : String(err));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=files.js.map
|