@assemblyline-agents/google-drive 2.0.0 → 3.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/LICENSE +1 -1
- package/README.md +2 -2
- package/dist/auth.d.ts +3 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +30 -0
- package/dist/auth.js.map +1 -0
- package/dist/events.d.ts +3 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +77 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -3
- package/dist/index.js.map +1 -1
- package/dist/operations.d.ts +3 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +86 -0
- package/dist/operations.js.map +1 -0
- package/package.json +4 -5
- package/skills/google-drive/SKILL.md +0 -13
- package/skills/google-drive/references/drive.md +0 -40
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Official Assembly Line Google Drive connection plugin.
|
|
4
4
|
|
|
5
|
-
It exposes file search, downloads, uploads, organization, and sharing through a
|
|
5
|
+
It exposes file search, downloads, exports, uploads, organization, and sharing through a reviewed direct Google Drive REST API connection. Drive authorization is stored independently from Gmail and Google Calendar. The package exports `defineGoogleDriveConnection(options)`.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -10,7 +10,7 @@ It exposes file search, downloads, uploads, organization, and sharing through a
|
|
|
10
10
|
npm install @assemblyline-agents/google-drive
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Create a Google OAuth web client, enable the Google Drive API, and set `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET`. Optionally set `GOOGLE_REDIRECT_URI` or `GOOGLE_DRIVE_API_BASE_URL`. Assembly Line runs Authorization Code + PKCE, requests offline access, and stores the refreshable grant host-side. Downloads and exports return byte-preserving base64; content uploads accept base64 plus an explicit media type. Set `access: "approval-required"` if uploads, moves, renames, sharing, and deletes should pause for approval, or `access: "read-only"` to request `drive.readonly` and omit mutations.
|
|
14
14
|
|
|
15
15
|
## Part of Assembly Line
|
|
16
16
|
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,EACrC,MAAM,2BAA2B,CAAC;AAKnC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,+BAA+B,GAAG,SAAS,GAAG,wBAAwB,CAoB9G"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { defineOAuthAuthorization } from "@assemblyline-agents/core";
|
|
2
|
+
const READ_SCOPE = "https://www.googleapis.com/auth/drive.readonly";
|
|
3
|
+
const WRITE_SCOPE = "https://www.googleapis.com/auth/drive";
|
|
4
|
+
export function googleDriveOAuth(access) {
|
|
5
|
+
return ({ env }) => {
|
|
6
|
+
const clientId = env.GOOGLE_CLIENT_ID?.trim();
|
|
7
|
+
const clientSecret = env.GOOGLE_CLIENT_SECRET?.trim();
|
|
8
|
+
const redirectUri = env.GOOGLE_REDIRECT_URI?.trim();
|
|
9
|
+
if (!clientId || !clientSecret) {
|
|
10
|
+
throw new Error("Google Drive OAuth requires GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET.");
|
|
11
|
+
}
|
|
12
|
+
return defineOAuthAuthorization({
|
|
13
|
+
displayName: "Google Drive",
|
|
14
|
+
authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
15
|
+
tokenUrl: "https://oauth2.googleapis.com/token",
|
|
16
|
+
clientId,
|
|
17
|
+
clientSecret,
|
|
18
|
+
scopes: [writesEnabled(access) ? WRITE_SCOPE : READ_SCOPE],
|
|
19
|
+
...(redirectUri ? { redirectUri } : {}),
|
|
20
|
+
authorizationParams: { access_type: "offline", prompt: "consent" },
|
|
21
|
+
pkce: true
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function writesEnabled(access) {
|
|
26
|
+
if (access === "read-only")
|
|
27
|
+
return false;
|
|
28
|
+
return typeof access !== "object" || access.write !== false;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EAGzB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,UAAU,GAAG,gDAAgD,CAAC;AACpE,MAAM,WAAW,GAAG,uCAAuC,CAAC;AAE5D,MAAM,UAAU,gBAAgB,CAAC,MAAmD;IAClF,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;QACjB,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,wBAAwB,CAAC;YAC9B,WAAW,EAAE,cAAc;YAC3B,YAAY,EAAE,8CAA8C;YAC5D,QAAQ,EAAE,qCAAqC;YAC/C,QAAQ;YACR,YAAY;YACZ,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;YAC1D,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,mBAAmB,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;YAClE,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAmD;IACxE,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;AAC9D,CAAC"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,4BAA4B,EAGlC,MAAM,2BAA2B,CAAC;AAInC,eAAO,MAAM,iBAAiB,EAAE,4BAmD/B,CAAC"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { randomBytes, randomUUID } from "node:crypto";
|
|
2
|
+
import { ConnectionEventError, headerValue, providerJson, stringField } from "@assemblyline-agents/core";
|
|
3
|
+
export const googleDriveEvents = {
|
|
4
|
+
prepare(context) {
|
|
5
|
+
const key = JSON.stringify([context.callbackUrl, context.resources]);
|
|
6
|
+
if (stringField(context.state ?? {}, "desiredKey") === key)
|
|
7
|
+
return context.state;
|
|
8
|
+
const resources = context.resources.length ? context.resources : [{}];
|
|
9
|
+
return {
|
|
10
|
+
desiredKey: key,
|
|
11
|
+
channels: resources.map((resource) => {
|
|
12
|
+
const driveId = stringField(resource, "driveId");
|
|
13
|
+
return { id: randomUUID(), token: randomBytes(32).toString("base64url"), ...(driveId ? { driveId } : {}) };
|
|
14
|
+
}),
|
|
15
|
+
previous: channels(context.state, "channels")
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
async reconcile(context) {
|
|
19
|
+
const token = (await context.getToken()).token;
|
|
20
|
+
for (const prior of channels(context.state, "previous"))
|
|
21
|
+
await stop(context.fetch, token, prior);
|
|
22
|
+
const desired = channels(context.state, "channels");
|
|
23
|
+
if (desired.every((channel) => channel.resourceId))
|
|
24
|
+
return activeResult(context.state, desired);
|
|
25
|
+
const active = [];
|
|
26
|
+
for (const channel of desired) {
|
|
27
|
+
const driveQuery = channel.driveId ? `&driveId=${encodeURIComponent(channel.driveId)}&supportsAllDrives=true` : "";
|
|
28
|
+
const starting = await providerJson(context.fetch, `https://www.googleapis.com/drive/v3/changes/startPageToken?supportsAllDrives=true${channel.driveId ? `&driveId=${encodeURIComponent(channel.driveId)}` : ""}`, { headers: auth(token) });
|
|
29
|
+
const pageToken = required(starting, "startPageToken");
|
|
30
|
+
const watched = await providerJson(context.fetch, `https://www.googleapis.com/drive/v3/changes/watch?pageToken=${encodeURIComponent(pageToken)}${driveQuery}`, {
|
|
31
|
+
method: "POST", headers: auth(token), body: JSON.stringify({ id: channel.id, type: "web_hook", address: context.callbackUrl, token: channel.token })
|
|
32
|
+
});
|
|
33
|
+
active.push({ ...channel, pageToken, resourceId: required(watched, "resourceId"), ...(watched.expiration ? { expiration: new Date(Number(watched.expiration)).toISOString() } : {}) });
|
|
34
|
+
}
|
|
35
|
+
return activeResult({ desiredKey: stringField(context.state ?? {}, "desiredKey") ?? "", channels: active, previous: [] }, active);
|
|
36
|
+
},
|
|
37
|
+
async remove(context) { const token = (await context.getToken()).token; for (const channel of channels(context.state, "channels"))
|
|
38
|
+
await stop(context.fetch, token, channel); },
|
|
39
|
+
check(context) {
|
|
40
|
+
const active = channels(context.state, "channels");
|
|
41
|
+
if (!active.length || active.some((channel) => !channel.resourceId))
|
|
42
|
+
return { status: "needs_setup", detail: "Google Drive watch channel is not active." };
|
|
43
|
+
const expiration = earliestExpiration(active);
|
|
44
|
+
return expiration && Date.parse(expiration) <= Date.now()
|
|
45
|
+
? { status: "degraded", detail: "Google Drive watch channel expired.", expiresAt: expiration }
|
|
46
|
+
: { status: "active", detail: `${active.length} Google Drive watch channel${active.length === 1 ? " is" : "s are"} active.`, ...(expiration ? { expiresAt: expiration } : {}) };
|
|
47
|
+
},
|
|
48
|
+
ingress(request, context) {
|
|
49
|
+
const channelId = headerValue(request.headers, "x-goog-channel-id");
|
|
50
|
+
const channelToken = headerValue(request.headers, "x-goog-channel-token");
|
|
51
|
+
const channel = channels(context.state, "channels").find((candidate) => candidate.id === channelId && candidate.token === channelToken);
|
|
52
|
+
if (!channel)
|
|
53
|
+
throw new ConnectionEventError("Google Drive channel token is invalid.", 401);
|
|
54
|
+
const resourceState = headerValue(request.headers, "x-goog-resource-state") ?? "change";
|
|
55
|
+
if (resourceState === "sync")
|
|
56
|
+
return { events: [], response: { status: 200, body: { ok: true } }, audit: { challenge: true } };
|
|
57
|
+
const messageNumber = headerValue(request.headers, "x-goog-message-number") ?? "unknown";
|
|
58
|
+
const payload = { resourceState, resourceId: headerValue(request.headers, "x-goog-resource-id") ?? "", messageNumber, ...(channel.driveId ? { driveId: channel.driveId } : {}), ...(channel.pageToken ? { pageToken: channel.pageToken } : {}) };
|
|
59
|
+
return { events: [{ event: "drive.changed", eventId: `${channel.id}:${messageNumber}`, payload }], response: { status: 200, body: { ok: true } }, audit: { event: "drive.changed" } };
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
function channels(state, key) {
|
|
63
|
+
const value = state?.[key];
|
|
64
|
+
if (!Array.isArray(value))
|
|
65
|
+
return [];
|
|
66
|
+
return value.flatMap((item) => { if (!item || typeof item !== "object" || Array.isArray(item))
|
|
67
|
+
return []; const record = item; const id = stringField(record, "id"); const token = stringField(record, "token"); if (!id || !token)
|
|
68
|
+
return []; const driveId = stringField(record, "driveId"); const pageToken = stringField(record, "pageToken"); const resourceId = stringField(record, "resourceId"); const expiration = stringField(record, "expiration"); return [{ id, token, ...(driveId ? { driveId } : {}), ...(pageToken ? { pageToken } : {}), ...(resourceId ? { resourceId } : {}), ...(expiration ? { expiration } : {}) }]; });
|
|
69
|
+
}
|
|
70
|
+
function auth(token) { return { authorization: `Bearer ${token}`, "content-type": "application/json" }; }
|
|
71
|
+
async function stop(fetchImpl, token, channel) { if (!channel.resourceId)
|
|
72
|
+
return; await providerJson(fetchImpl, "https://www.googleapis.com/drive/v3/channels/stop", { method: "POST", headers: auth(token), body: JSON.stringify({ id: channel.id, resourceId: channel.resourceId }) }, [200, 204, 404]); }
|
|
73
|
+
function required(value, name) { const result = stringField(value, name); if (!result)
|
|
74
|
+
throw new Error(`Google Drive watch response omitted ${name}.`); return result; }
|
|
75
|
+
function earliestExpiration(value) { return value.map((channel) => channel.expiration).filter((item) => Boolean(item)).sort()[0]; }
|
|
76
|
+
function activeResult(state, active) { const expiresAt = earliestExpiration(active); return { status: "active", state, detail: `${active.length} Google Drive watch channel${active.length === 1 ? " is" : "s are"} active.`, ...(expiresAt ? { expiresAt } : {}) }; }
|
|
77
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
export
|
|
3
|
-
|
|
1
|
+
import { type ConnectionAuthDefinition, type HttpApiPluginConnectionOptions } from "@assemblyline-agents/core";
|
|
2
|
+
export interface GoogleDriveConnectionOptions extends Omit<HttpApiPluginConnectionOptions, "auth" | "operations"> {
|
|
3
|
+
auth?: ConnectionAuthDefinition | false;
|
|
4
|
+
}
|
|
5
|
+
export declare function defineGoogleDriveConnection(options?: GoogleDriveConnectionOptions): import("@assemblyline-agents/core").HttpApiConnectionDefinition;
|
|
4
6
|
export declare const assemblyLinePlugin: import("@assemblyline-agents/core").PluginModule;
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACpC,MAAM,2BAA2B,CAAC;AAOnC,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CAAC,8BAA8B,EAAE,MAAM,GAAG,YAAY,CAAC;IAC/G,IAAI,CAAC,EAAE,wBAAwB,GAAG,KAAK,CAAC;CACzC;AAED,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,4BAAiC,mEAUrF;AAED,eAAO,MAAM,kBAAkB,kDAA0C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
|
-
import { connectionPluginMetadata,
|
|
1
|
+
import { connectionPluginMetadata, defineConnectionPluginEvents, defineHttpApiPluginConnection, definePlugin } from "@assemblyline-agents/core";
|
|
2
|
+
import { googleDriveOAuth } from "./auth.js";
|
|
3
|
+
import { googleDriveEvents } from "./events.js";
|
|
4
|
+
import { GOOGLE_DRIVE_OPERATIONS } from "./operations.js";
|
|
2
5
|
const PLUGIN = connectionPluginMetadata("google-drive");
|
|
3
|
-
export function defineGoogleDriveConnection(options) {
|
|
4
|
-
|
|
6
|
+
export function defineGoogleDriveConnection(options = {}) {
|
|
7
|
+
const { auth, ...connection } = options;
|
|
8
|
+
const definition = defineHttpApiPluginConnection(PLUGIN, {
|
|
9
|
+
...connection,
|
|
10
|
+
operations: GOOGLE_DRIVE_OPERATIONS,
|
|
11
|
+
auth: auth === false ? false : auth ?? googleDriveOAuth(options.access)
|
|
12
|
+
});
|
|
13
|
+
const events = defineConnectionPluginEvents(PLUGIN, options.events, googleDriveEvents);
|
|
14
|
+
if (events)
|
|
15
|
+
definition.events = events;
|
|
16
|
+
return definition;
|
|
5
17
|
}
|
|
6
18
|
export const assemblyLinePlugin = definePlugin({ connections: [PLUGIN] });
|
|
7
19
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,6BAA6B,EAC7B,YAAY,EAGb,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,MAAM,GAAG,wBAAwB,CAAC,cAAc,CAAE,CAAC;AAMzD,MAAM,UAAU,2BAA2B,CAAC,UAAwC,EAAE;IACpF,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IACxC,MAAM,UAAU,GAAG,6BAA6B,CAAC,MAAM,EAAE;QACvD,GAAG,UAAU;QACb,UAAU,EAAE,uBAAuB;QACnC,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;KACxE,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACvF,IAAI,MAAM;QAAE,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;IACvC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAc,MAAM,2BAA2B,CAAC;AAaxF,eAAO,MAAM,uBAAuB,EAAE,0BAA0B,EAoE/D,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
const string = (description) => ({ type: "string", minLength: 1, description });
|
|
2
|
+
const path = (name, description) => ({ name, in: "path", required: true, schema: string(description) });
|
|
3
|
+
const query = (name, schema, required = false) => ({ name, in: "query", required, schema });
|
|
4
|
+
const fixedQuery = (name, value) => ({ name, in: "query", value });
|
|
5
|
+
const fileId = () => path("fileId", "Google Drive file id.");
|
|
6
|
+
const permissionId = () => path("permissionId", "Google Drive permission id.");
|
|
7
|
+
const supportsAllDrives = () => query("supportsAllDrives", { type: "boolean" });
|
|
8
|
+
const fields = () => query("fields", string("Google Drive partial-response fields selector."));
|
|
9
|
+
const fileBody = { type: "object", description: "Google Drive File resource metadata.", additionalProperties: true };
|
|
10
|
+
const permissionBody = { type: "object", description: "Google Drive Permission resource.", additionalProperties: true };
|
|
11
|
+
export const GOOGLE_DRIVE_OPERATIONS = [
|
|
12
|
+
read("google_drive_get_about", "Get connected-user and storage information from Drive.", "/drive/v3/about", [query("fields", string("Required About fields selector, such as user,storageQuota."), true)]),
|
|
13
|
+
read("google_drive_list_shared_drives", "List shared drives available to the connected user.", "/drive/v3/drives", [
|
|
14
|
+
query("pageSize", { type: "integer", minimum: 1, maximum: 100 }), query("pageToken", string("Opaque next-page token.")),
|
|
15
|
+
query("q", string("Shared-drive query expression.")), query("useDomainAdminAccess", { type: "boolean" })
|
|
16
|
+
]),
|
|
17
|
+
read("google_drive_get_shared_drive", "Get one shared drive by id.", "/drive/v3/drives/{driveId}", [path("driveId", "Shared drive id."), query("useDomainAdminAccess", { type: "boolean" })]),
|
|
18
|
+
read("google_drive_list_files", "Search or list Drive files and folders, including shared-drive content when requested.", "/drive/v3/files", [
|
|
19
|
+
query("q", string("Drive file query, such as name contains 'quarterly' and trashed = false.")), fields(),
|
|
20
|
+
query("pageSize", { type: "integer", minimum: 1, maximum: 1000 }), query("pageToken", string("Opaque next-page token.")),
|
|
21
|
+
query("orderBy", string("Comma-separated Drive sort keys.")), query("spaces", string("Comma-separated spaces, commonly drive.")),
|
|
22
|
+
query("corpora", { type: "string", enum: ["user", "domain", "drive", "allDrives"] }), query("driveId", string("Shared drive id when corpora is drive.")),
|
|
23
|
+
query("includeItemsFromAllDrives", { type: "boolean" }), query("includePermissionsForView", { type: "string", enum: ["published"] })
|
|
24
|
+
]),
|
|
25
|
+
read("google_drive_get_file", "Get metadata for one Drive file or folder.", "/drive/v3/files/{fileId}", [
|
|
26
|
+
fileId(), fields(), supportsAllDrives(), query("acknowledgeAbuse", { type: "boolean" }),
|
|
27
|
+
query("includePermissionsForView", { type: "string", enum: ["published"] })
|
|
28
|
+
]),
|
|
29
|
+
{
|
|
30
|
+
name: "google_drive_download_file",
|
|
31
|
+
description: "Download a blob file from Drive. The response body contains base64 data and its content type.",
|
|
32
|
+
method: "GET",
|
|
33
|
+
path: "/drive/v3/files/{fileId}",
|
|
34
|
+
parameters: [fileId(), fixedQuery("alt", "media"), supportsAllDrives(), query("acknowledgeAbuse", { type: "boolean" })],
|
|
35
|
+
responseBody: { encoding: "base64" }
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "google_drive_export_file",
|
|
39
|
+
description: "Export a Google Workspace-native file. The response body contains base64 data and its content type.",
|
|
40
|
+
method: "GET",
|
|
41
|
+
path: "/drive/v3/files/{fileId}/export",
|
|
42
|
+
parameters: [fileId(), query("mimeType", string("Requested export MIME type."), true)],
|
|
43
|
+
responseBody: { encoding: "base64" }
|
|
44
|
+
},
|
|
45
|
+
read("google_drive_list_permissions", "List permissions on one file or shared drive.", "/drive/v3/files/{fileId}/permissions", [
|
|
46
|
+
fileId(), fields(), supportsAllDrives(), query("pageSize", { type: "integer", minimum: 1, maximum: 100 }), query("pageToken", string("Opaque next-page token.")),
|
|
47
|
+
query("useDomainAdminAccess", { type: "boolean" }), query("includePermissionsForView", { type: "string", enum: ["published"] })
|
|
48
|
+
]),
|
|
49
|
+
read("google_drive_get_permission", "Get one permission on a file or shared drive.", "/drive/v3/files/{fileId}/permissions/{permissionId}", [fileId(), permissionId(), fields(), supportsAllDrives(), query("useDomainAdminAccess", { type: "boolean" })]),
|
|
50
|
+
write("google_drive_create_file", "Create a Drive file or folder from metadata. Upload content separately for blob files.", "POST", "/drive/v3/files", fileBody, [
|
|
51
|
+
fields(), supportsAllDrives(), query("ignoreDefaultVisibility", { type: "boolean" }), query("keepRevisionForever", { type: "boolean" })
|
|
52
|
+
]),
|
|
53
|
+
write("google_drive_update_file", "Patch file metadata, rename or trash a file, or move it with addParents/removeParents.", "PATCH", "/drive/v3/files/{fileId}", fileBody, [
|
|
54
|
+
fileId(), fields(), supportsAllDrives(), query("addParents", string("Comma-separated parent folder ids to add.")),
|
|
55
|
+
query("removeParents", string("Comma-separated parent folder ids to remove.")), query("keepRevisionForever", { type: "boolean" })
|
|
56
|
+
]),
|
|
57
|
+
{
|
|
58
|
+
name: "google_drive_upload_file_content",
|
|
59
|
+
description: "Replace a blob file's content with model-supplied base64 bytes and an explicit media type.",
|
|
60
|
+
method: "PATCH",
|
|
61
|
+
path: "/upload/drive/v3/files/{fileId}",
|
|
62
|
+
parameters: [fileId(), fixedQuery("uploadType", "media"), supportsAllDrives(), fields()],
|
|
63
|
+
body: {
|
|
64
|
+
field: "data",
|
|
65
|
+
schema: { type: "string", contentEncoding: "base64", description: "File bytes encoded as standard base64." },
|
|
66
|
+
contentTypeField: "contentType",
|
|
67
|
+
encoding: "base64",
|
|
68
|
+
required: true
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
write("google_drive_copy_file", "Copy a file, optionally with new metadata or a new parent.", "POST", "/drive/v3/files/{fileId}/copy", fileBody, [fileId(), fields(), supportsAllDrives(), query("ignoreDefaultVisibility", { type: "boolean" }), query("keepRevisionForever", { type: "boolean" })]),
|
|
72
|
+
{ name: "google_drive_delete_file", description: "Permanently delete a file owned by the connected user.", method: "DELETE", path: "/drive/v3/files/{fileId}", parameters: [fileId(), supportsAllDrives()] },
|
|
73
|
+
write("google_drive_create_permission", "Share a file or shared drive by creating a permission.", "POST", "/drive/v3/files/{fileId}/permissions", permissionBody, [
|
|
74
|
+
fileId(), fields(), supportsAllDrives(), query("sendNotificationEmail", { type: "boolean" }), query("emailMessage", string("Custom notification message.")),
|
|
75
|
+
query("transferOwnership", { type: "boolean" }), query("useDomainAdminAccess", { type: "boolean" })
|
|
76
|
+
]),
|
|
77
|
+
write("google_drive_update_permission", "Patch an existing Drive permission.", "PATCH", "/drive/v3/files/{fileId}/permissions/{permissionId}", permissionBody, [fileId(), permissionId(), fields(), supportsAllDrives(), query("removeExpiration", { type: "boolean" }), query("transferOwnership", { type: "boolean" }), query("useDomainAdminAccess", { type: "boolean" })]),
|
|
78
|
+
{ name: "google_drive_delete_permission", description: "Delete one permission from a file or shared drive.", method: "DELETE", path: "/drive/v3/files/{fileId}/permissions/{permissionId}", parameters: [fileId(), permissionId(), supportsAllDrives(), query("useDomainAdminAccess", { type: "boolean" })] }
|
|
79
|
+
];
|
|
80
|
+
function read(name, description, operationPath, parameters) {
|
|
81
|
+
return { name, description, method: "GET", path: operationPath, ...(parameters ? { parameters } : {}) };
|
|
82
|
+
}
|
|
83
|
+
function write(name, description, method, operationPath, schema, parameters) {
|
|
84
|
+
return { name, description, method, path: operationPath, ...(parameters ? { parameters } : {}), body: { contentType: "application/json", field: "body", schema, required: true } };
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assemblyline-agents/google-drive",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -9,12 +9,11 @@
|
|
|
9
9
|
}
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@assemblyline-agents/core": "
|
|
12
|
+
"@assemblyline-agents/core": "3.1.0"
|
|
13
13
|
},
|
|
14
|
-
"description": "Official Assembly Line Google Drive connection plugin.",
|
|
14
|
+
"description": "Official Assembly Line direct Google Drive API connection plugin.",
|
|
15
15
|
"files": [
|
|
16
|
-
"dist"
|
|
17
|
-
"skills"
|
|
16
|
+
"dist"
|
|
18
17
|
],
|
|
19
18
|
"engines": {
|
|
20
19
|
"node": ">=22.19.0"
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: google-drive
|
|
3
|
-
description: Use a configured, independently authorized Google Drive connection for file search, downloads, uploads, organization, and sharing.
|
|
4
|
-
---
|
|
5
|
-
# Google Drive
|
|
6
|
-
|
|
7
|
-
Use the `google-drive` connection only for Drive work. Its authorization is independent from Gmail and Google Calendar; never assume either service is connected because Drive is connected.
|
|
8
|
-
|
|
9
|
-
Search narrowly, resolve the exact file or folder id, and inspect current metadata before proposing a change. Prefer an open link for browser access and the provider's supported export path for Google-native files. The deployment owner configures the Drive OAuth grant or MCP bridge. Never request, print, or store tokens or client secrets.
|
|
10
|
-
|
|
11
|
-
The scaffold is read-only. Uploads, creates, moves, renames, sharing or permission changes, trashing, and deletion require explicit write access and the configured approval gate. Do not mutate a file while multiple plausible search results remain.
|
|
12
|
-
|
|
13
|
-
Read `references/drive.md` when the task needs Drive query syntax, native-file exports, shared-drive handling, or mutation safety.
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# Google Drive
|
|
2
|
-
|
|
3
|
-
Use the configured `google-drive` connection for file search, open, download, upload, create, move, rename, share, and delete operations.
|
|
4
|
-
|
|
5
|
-
Official documentation:
|
|
6
|
-
|
|
7
|
-
- https://developers.google.com/workspace/drive/api/reference/rest/v3/files
|
|
8
|
-
- https://developers.google.com/workspace/drive/api/guides/manage-uploads
|
|
9
|
-
|
|
10
|
-
## Search And Open
|
|
11
|
-
|
|
12
|
-
Request only the fields needed to identify and use a file. Useful Drive query patterns include:
|
|
13
|
-
|
|
14
|
-
```text
|
|
15
|
-
name contains 'proposal'
|
|
16
|
-
'{folderId}' in parents
|
|
17
|
-
trashed = false
|
|
18
|
-
fullText contains 'contract'
|
|
19
|
-
modifiedTime > '2026-05-01T00:00:00'
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
Keep searches bounded. If several plausible files match, ask which file. Prefer `webViewLink` for browser access. For downloadable files, use the provider's content/download operation. Google-native files require export to a supported format.
|
|
23
|
-
|
|
24
|
-
## Writes
|
|
25
|
-
|
|
26
|
-
Before a write, resolve the exact file or folder id and inspect current metadata. Approval must cover the exact target and operation, including content, destination, recipients, or permissions where applicable.
|
|
27
|
-
|
|
28
|
-
Writes include:
|
|
29
|
-
|
|
30
|
-
- file and folder creation
|
|
31
|
-
- uploads
|
|
32
|
-
- renames and moves
|
|
33
|
-
- permission and sharing changes
|
|
34
|
-
- trash and deletion
|
|
35
|
-
|
|
36
|
-
Never overwrite, move, share, trash, or delete when multiple search results remain plausible.
|
|
37
|
-
|
|
38
|
-
## Shared Drives
|
|
39
|
-
|
|
40
|
-
Include shared drives and provider-specific shared-drive options when needed. A missing shared-drive file can mean the account lacks access or the search omitted shared-drive support.
|