@open-neko/connector-google-workspace 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/plugin.js ADDED
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Google Workspace connector plugin.
3
+ *
4
+ * Two surfaces:
5
+ *
6
+ * 1. `connect` — per-operator OAuth2 + PKCE flow against the
7
+ * operator's own Google Cloud OAuth client. Each operator on
8
+ * this deployment authorises independently; the worker
9
+ * persists the resulting credentials in the per-operator
10
+ * section of the secrets store.
11
+ *
12
+ * 2. `action` — Gmail / Calendar / Sheets actions backed by the
13
+ * connected operator's account. At action-execution time the
14
+ * worker injects the operator's credential as the
15
+ * OPENNEKO_CONNECTOR_CREDENTIAL_TOKENS env var (JSON-encoded
16
+ * access_token + refresh_token); the action handler reads it,
17
+ * makes the API call, and returns the outcome.
18
+ *
19
+ * No tokens cross the sandbox boundary except via this env-var
20
+ * injection — the plugin never persists anything to disk; the
21
+ * worker is the only writer to secrets.json.
22
+ */
23
+ import { createHash } from "node:crypto";
24
+ import { definePlugin, } from "@open-neko/plugin-types";
25
+ import { GoogleClient } from "./google-client.js";
26
+ export class GoogleWorkspaceError extends Error {
27
+ cause;
28
+ constructor(message, cause) {
29
+ super(message);
30
+ this.cause = cause;
31
+ this.name = "GoogleWorkspaceError";
32
+ }
33
+ }
34
+ function resolveClientEnv() {
35
+ const clientId = process.env.GOOGLE_CLIENT_ID;
36
+ const clientSecret = process.env.GOOGLE_CLIENT_SECRET;
37
+ const missing = [];
38
+ if (!clientId)
39
+ missing.push("GOOGLE_CLIENT_ID");
40
+ if (!clientSecret)
41
+ missing.push("GOOGLE_CLIENT_SECRET");
42
+ if (missing.length > 0) {
43
+ throw new GoogleWorkspaceError(`${missing.join(", ")} not set. Create an OAuth client in your Google Cloud Console project, then \`openneko secrets set @open-neko/connector-google-workspace ${missing[0]} …\`.`);
44
+ }
45
+ return { clientId: clientId, clientSecret: clientSecret };
46
+ }
47
+ function clientOrDefault(options) {
48
+ const env = resolveClientEnv();
49
+ const make = options.createClient ??
50
+ ((e) => new GoogleClient({
51
+ clientId: e.clientId,
52
+ clientSecret: e.clientSecret,
53
+ }));
54
+ return make(env);
55
+ }
56
+ function pkceChallengeS256(codeVerifier) {
57
+ return createHash("sha256").update(codeVerifier).digest("base64url");
58
+ }
59
+ export async function runBeginConnect(params, options = {}) {
60
+ if (!params.codeVerifier) {
61
+ throw new GoogleWorkspaceError("params.codeVerifier is required — Google connect requires PKCE");
62
+ }
63
+ if (params.scopes.length === 0) {
64
+ throw new GoogleWorkspaceError("params.scopes must not be empty");
65
+ }
66
+ const client = clientOrDefault(options);
67
+ const authorizationUrl = client.buildAuthorizationUrl({
68
+ redirectUri: params.redirectUri,
69
+ state: params.state,
70
+ scopes: params.scopes,
71
+ codeChallenge: pkceChallengeS256(params.codeVerifier),
72
+ });
73
+ return { authorizationUrl };
74
+ }
75
+ export async function runCompleteConnect(params, options = {}) {
76
+ if (!params.codeVerifier) {
77
+ throw new GoogleWorkspaceError("params.codeVerifier is required — Google connect requires PKCE");
78
+ }
79
+ const client = clientOrDefault(options);
80
+ const tokens = await client.exchangeCode({
81
+ code: params.code,
82
+ redirectUri: params.redirectUri,
83
+ codeVerifier: params.codeVerifier,
84
+ });
85
+ if (!tokens.access_token) {
86
+ throw new GoogleWorkspaceError("Google's code-exchange response had no access_token");
87
+ }
88
+ const credential = {
89
+ tokens: tokens,
90
+ scopes: tokens.scope
91
+ ? tokens.scope.split(/\s+/).filter(Boolean)
92
+ : params.scopes,
93
+ providerLabel: "Google Workspace",
94
+ connectedAt: new Date().toISOString(),
95
+ };
96
+ return { credential };
97
+ }
98
+ export async function runRefreshConnect(params, options = {}) {
99
+ const refreshToken = typeof params.current.tokens.refresh_token === "string"
100
+ ? params.current.tokens.refresh_token
101
+ : null;
102
+ if (!refreshToken) {
103
+ throw new GoogleWorkspaceError("Stored credential has no refresh_token — operator must reconnect to re-grant offline access");
104
+ }
105
+ const client = clientOrDefault(options);
106
+ const fresh = await client.refreshTokens(refreshToken);
107
+ // Google omits refresh_token from refresh responses when keeping the
108
+ // existing one. Carry the prior refresh_token forward if absent.
109
+ const mergedTokens = {
110
+ ...params.current.tokens,
111
+ ...fresh,
112
+ };
113
+ if (!fresh.refresh_token) {
114
+ mergedTokens.refresh_token = refreshToken;
115
+ }
116
+ return {
117
+ credential: {
118
+ tokens: mergedTokens,
119
+ scopes: fresh.scope?.split(/\s+/).filter(Boolean) ??
120
+ params.current.scopes,
121
+ providerLabel: "Google Workspace",
122
+ connectedAt: params.current.connectedAt,
123
+ refreshedAt: new Date().toISOString(),
124
+ },
125
+ };
126
+ }
127
+ // ─── Action handlers ─────────────────────────────────────────────────
128
+ function readInjectedTokens() {
129
+ const raw = process.env.OPENNEKO_CONNECTOR_CREDENTIAL_TOKENS;
130
+ if (!raw) {
131
+ throw new GoogleWorkspaceError("OPENNEKO_CONNECTOR_CREDENTIAL_TOKENS not injected — action invoked without an operator credential. The operator must Connect via /integrations first.");
132
+ }
133
+ let parsed;
134
+ try {
135
+ parsed = JSON.parse(raw);
136
+ }
137
+ catch (err) {
138
+ throw new GoogleWorkspaceError(`OPENNEKO_CONNECTOR_CREDENTIAL_TOKENS is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
139
+ }
140
+ if (typeof parsed !== "object" ||
141
+ parsed === null ||
142
+ typeof parsed.access_token !== "string") {
143
+ throw new GoogleWorkspaceError("OPENNEKO_CONNECTOR_CREDENTIAL_TOKENS missing access_token");
144
+ }
145
+ return { access_token: parsed.access_token };
146
+ }
147
+ export async function runSendGmail(request, options = {}) {
148
+ const payload = request.payload;
149
+ const to = typeof payload?.to === "string" ? payload.to : "";
150
+ const subject = typeof payload?.subject === "string" ? payload.subject : "";
151
+ const body = typeof payload?.body === "string" ? payload.body : "";
152
+ if (!to || !subject) {
153
+ throw new GoogleWorkspaceError('send_gmail payload missing "to" or "subject"');
154
+ }
155
+ const tokens = (options.readTokens ?? readInjectedTokens)();
156
+ const client = clientOrDefault(options);
157
+ const sent = await client.sendGmail(tokens.access_token, {
158
+ to,
159
+ subject,
160
+ body,
161
+ cc: typeof payload?.cc === "string" ? payload.cc : undefined,
162
+ });
163
+ return {
164
+ result: sent,
165
+ externalRef: sent.id,
166
+ commandOrOperation: `gmail.send → ${to}`,
167
+ };
168
+ }
169
+ export async function runListCalendarEvents(request, options = {}) {
170
+ const payload = request.payload;
171
+ const maxResults = typeof payload?.maxResults === "number" ? payload.maxResults : 10;
172
+ const timeMin = typeof payload?.timeMin === "string" ? payload.timeMin : undefined;
173
+ const tokens = (options.readTokens ?? readInjectedTokens)();
174
+ const client = clientOrDefault(options);
175
+ const out = await client.listCalendarEvents(tokens.access_token, {
176
+ maxResults,
177
+ timeMin,
178
+ });
179
+ return {
180
+ result: { events: out.items },
181
+ externalRef: null,
182
+ commandOrOperation: `calendar.list (${out.items.length} events)`,
183
+ };
184
+ }
185
+ export async function runAppendSheetRow(request, options = {}) {
186
+ const payload = request.payload;
187
+ const spreadsheetId = typeof payload?.spreadsheetId === "string" ? payload.spreadsheetId : "";
188
+ const range = typeof payload?.range === "string" ? payload.range : "";
189
+ const values = Array.isArray(payload?.values)
190
+ ? payload.values.map((v) => String(v))
191
+ : [];
192
+ if (!spreadsheetId || !range || values.length === 0) {
193
+ throw new GoogleWorkspaceError('append_sheet_row payload requires "spreadsheetId", "range", and non-empty "values" array');
194
+ }
195
+ const tokens = (options.readTokens ?? readInjectedTokens)();
196
+ const client = clientOrDefault(options);
197
+ const out = await client.appendSheetRow(tokens.access_token, {
198
+ spreadsheetId,
199
+ range,
200
+ values,
201
+ });
202
+ return {
203
+ result: out,
204
+ externalRef: out.updates.updatedRange,
205
+ commandOrOperation: `sheets.append → ${out.updates.updatedRange}`,
206
+ };
207
+ }
208
+ export default definePlugin({
209
+ name: "@open-neko/connector-google-workspace",
210
+ version: "0.1.0",
211
+ capabilities: {
212
+ connect: {
213
+ providerLabel: "Google Workspace",
214
+ scopes: [
215
+ "openid",
216
+ "https://www.googleapis.com/auth/userinfo.email",
217
+ "https://www.googleapis.com/auth/gmail.send",
218
+ "https://www.googleapis.com/auth/calendar.events.readonly",
219
+ "https://www.googleapis.com/auth/spreadsheets",
220
+ "https://www.googleapis.com/auth/documents",
221
+ ],
222
+ flow: "oauth2-pkce",
223
+ begin: (params) => runBeginConnect(params),
224
+ complete: (params) => runCompleteConnect(params),
225
+ refresh: (params) => runRefreshConnect(params),
226
+ },
227
+ action: {
228
+ kinds: [
229
+ {
230
+ kind: "send_gmail",
231
+ description: "Send an email from the connected operator's Gmail account.",
232
+ handler: (req) => runSendGmail(req),
233
+ },
234
+ {
235
+ kind: "list_calendar_events",
236
+ description: "List upcoming events on the connected operator's primary calendar.",
237
+ handler: (req) => runListCalendarEvents(req),
238
+ },
239
+ {
240
+ kind: "append_sheet_row",
241
+ description: "Append a row to a Google Sheet the connected operator can edit.",
242
+ handler: (req) => runAppendSheetRow(req),
243
+ },
244
+ ],
245
+ },
246
+ },
247
+ });
248
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/dist/run.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":""}