@elizaos/plugin-google 2.0.3-beta.6 → 2.0.3-beta.7
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/auth.d.ts +9 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +45 -0
- package/dist/auth.js.map +1 -0
- package/dist/calendar.d.ts +26 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +237 -0
- package/dist/calendar.js.map +1 -0
- package/dist/client-factory.d.ts +17 -0
- package/dist/client-factory.d.ts.map +1 -0
- package/dist/client-factory.js +74 -0
- package/dist/client-factory.js.map +1 -0
- package/dist/connector-account-provider.d.ts +23 -0
- package/dist/connector-account-provider.d.ts.map +1 -0
- package/dist/connector-account-provider.js +361 -0
- package/dist/connector-account-provider.js.map +1 -0
- package/dist/connector-credential-refs.d.ts +43 -0
- package/dist/connector-credential-refs.d.ts.map +1 -0
- package/dist/connector-credential-refs.js +252 -0
- package/dist/connector-credential-refs.js.map +1 -0
- package/dist/credential-resolver.d.ts +45 -0
- package/dist/credential-resolver.d.ts.map +1 -0
- package/dist/credential-resolver.js +529 -0
- package/dist/credential-resolver.js.map +1 -0
- package/dist/drive.d.ts +41 -0
- package/dist/drive.d.ts.map +1 -0
- package/dist/drive.js +207 -0
- package/dist/drive.js.map +1 -0
- package/dist/gmail.d.ts +89 -0
- package/dist/gmail.d.ts.map +1 -0
- package/dist/gmail.js +765 -0
- package/dist/gmail.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/lifeops-message-adapter.d.ts +23 -0
- package/dist/lifeops-message-adapter.d.ts.map +1 -0
- package/dist/lifeops-message-adapter.js +268 -0
- package/dist/lifeops-message-adapter.js.map +1 -0
- package/dist/meet.d.ts +61 -0
- package/dist/meet.d.ts.map +1 -0
- package/dist/meet.js +329 -0
- package/dist/meet.js.map +1 -0
- package/dist/scopes.d.ts +59 -0
- package/dist/scopes.d.ts.map +1 -0
- package/dist/scopes.js +142 -0
- package/dist/scopes.js.map +1 -0
- package/dist/service.d.ts +165 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +170 -0
- package/dist/service.js.map +1 -0
- package/dist/types.d.ts +492 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google ConnectorAccountManager provider.
|
|
3
|
+
*
|
|
4
|
+
* Bridges plugin-google to the @elizaos/core ConnectorAccountManager so the
|
|
5
|
+
* generic HTTP CRUD + OAuth surface (packages/agent/src/api/connector-account-routes.ts)
|
|
6
|
+
* can list, create, patch, delete, and run the OAuth flow for Google accounts
|
|
7
|
+
* using a single consolidated grant covering Gmail, Calendar, Drive, and Meet.
|
|
8
|
+
*
|
|
9
|
+
* Single OAuth grant per account: callers may pass `scopes` to the manager's
|
|
10
|
+
* startOAuth to limit which capabilities are requested. By default all
|
|
11
|
+
* capabilities (gmail.read+send+manage, calendar.read+write, drive.read+write,
|
|
12
|
+
* meet.create+read) are requested; granted capabilities are recorded on the
|
|
13
|
+
* returned account so downstream consumers know which surfaces are usable.
|
|
14
|
+
*/
|
|
15
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
16
|
+
import { logger, } from "@elizaos/core";
|
|
17
|
+
import { GOOGLE_OAUTH_PROVIDER_METADATA } from "./auth.js";
|
|
18
|
+
import { persistConnectorCredentialRefs } from "./connector-credential-refs.js";
|
|
19
|
+
import { GOOGLE_CAPABILITIES, GOOGLE_IDENTITY_SCOPES, isGoogleCapability, scopesForGoogleCapabilities, } from "./scopes.js";
|
|
20
|
+
import { GOOGLE_SERVICE_NAME } from "./types.js";
|
|
21
|
+
const GOOGLE_USERINFO_ENDPOINT = "https://openidconnect.googleapis.com/v1/userinfo";
|
|
22
|
+
const GROUP_PURPOSE = {
|
|
23
|
+
gmail: "messaging",
|
|
24
|
+
calendar: "calendar",
|
|
25
|
+
drive: "drive",
|
|
26
|
+
meet: "meet",
|
|
27
|
+
};
|
|
28
|
+
function createCodeVerifier() {
|
|
29
|
+
return randomBytes(64).toString("base64url");
|
|
30
|
+
}
|
|
31
|
+
function createCodeChallenge(codeVerifier) {
|
|
32
|
+
return createHash("sha256").update(codeVerifier).digest("base64url");
|
|
33
|
+
}
|
|
34
|
+
function nonEmptyString(value) {
|
|
35
|
+
if (typeof value !== "string")
|
|
36
|
+
return undefined;
|
|
37
|
+
const trimmed = value.trim();
|
|
38
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
39
|
+
}
|
|
40
|
+
function readSetting(runtime, key) {
|
|
41
|
+
return nonEmptyString(runtime.getSetting?.(key));
|
|
42
|
+
}
|
|
43
|
+
function readClientConfig(runtime) {
|
|
44
|
+
const clientId = readSetting(runtime, "GOOGLE_CLIENT_ID");
|
|
45
|
+
const clientSecret = readSetting(runtime, "GOOGLE_CLIENT_SECRET");
|
|
46
|
+
const redirectUri = readSetting(runtime, "GOOGLE_REDIRECT_URI");
|
|
47
|
+
if (!clientId || !clientSecret || !redirectUri) {
|
|
48
|
+
throw new Error("Google OAuth requires GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, and GOOGLE_REDIRECT_URI to be configured.");
|
|
49
|
+
}
|
|
50
|
+
return { clientId, clientSecret, redirectUri };
|
|
51
|
+
}
|
|
52
|
+
function normalizeRequestedCapabilities(scopes) {
|
|
53
|
+
if (!scopes || scopes.length === 0) {
|
|
54
|
+
return [...GOOGLE_CAPABILITIES];
|
|
55
|
+
}
|
|
56
|
+
// The caller passes either capability identifiers (e.g. "gmail.read") OR raw
|
|
57
|
+
// OAuth scope URLs. Both shapes are accepted so the manager's startOAuth API
|
|
58
|
+
// surface stays uniform with other providers (which use raw scopes).
|
|
59
|
+
const requested = new Set();
|
|
60
|
+
for (const value of scopes) {
|
|
61
|
+
if (isGoogleCapability(value)) {
|
|
62
|
+
requested.add(value);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const matched = matchCapabilityFromScope(value);
|
|
66
|
+
if (matched) {
|
|
67
|
+
requested.add(matched);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (requested.size === 0) {
|
|
71
|
+
return [...GOOGLE_CAPABILITIES];
|
|
72
|
+
}
|
|
73
|
+
return [...requested];
|
|
74
|
+
}
|
|
75
|
+
function matchCapabilityFromScope(scope) {
|
|
76
|
+
// Scope URL → capability ID mapping. Pulls from the canonical capability
|
|
77
|
+
// metadata so additions to scopes.ts propagate automatically.
|
|
78
|
+
const trimmed = scope.trim().toLowerCase();
|
|
79
|
+
for (const capability of GOOGLE_CAPABILITIES) {
|
|
80
|
+
const capabilityScopes = scopesForGoogleCapabilities([capability], {
|
|
81
|
+
includeIdentityScopes: false,
|
|
82
|
+
});
|
|
83
|
+
if (capabilityScopes.some((value) => value.toLowerCase() === trimmed)) {
|
|
84
|
+
return capability;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
function purposesForCapabilities(capabilities) {
|
|
90
|
+
const groups = new Set();
|
|
91
|
+
for (const capability of capabilities) {
|
|
92
|
+
groups.add(capability.split(".")[0]);
|
|
93
|
+
}
|
|
94
|
+
return [...groups].map((group) => GROUP_PURPOSE[group]);
|
|
95
|
+
}
|
|
96
|
+
function parseScopeString(value) {
|
|
97
|
+
if (!value)
|
|
98
|
+
return [];
|
|
99
|
+
return value
|
|
100
|
+
.split(/\s+/)
|
|
101
|
+
.map((scope) => scope.trim())
|
|
102
|
+
.filter(Boolean);
|
|
103
|
+
}
|
|
104
|
+
function roleFromMetadata(metadata) {
|
|
105
|
+
const record = metadata && typeof metadata === "object" && !Array.isArray(metadata)
|
|
106
|
+
? metadata
|
|
107
|
+
: {};
|
|
108
|
+
// Cloud OAuth writes `connectionRole` (uppercase canonical) and a legacy
|
|
109
|
+
// lowercase `agentGoogleSide`. Local UI flows pass `role`/`accountRole`/
|
|
110
|
+
// `requestedRole`. Accept all five shapes so the role survives whichever
|
|
111
|
+
// path the OAuth start metadata came through.
|
|
112
|
+
//
|
|
113
|
+
// Precedence: most-explicit cloud field first, then the original local
|
|
114
|
+
// fields in their original order (`role` first, `requestedRole` last so a
|
|
115
|
+
// stale earlier-step value can't override a later correction), then the
|
|
116
|
+
// legacy `agentGoogleSide` as the final fallback.
|
|
117
|
+
const raw = nonEmptyString(record.connectionRole ??
|
|
118
|
+
record.role ??
|
|
119
|
+
record.accountRole ??
|
|
120
|
+
record.requestedRole ??
|
|
121
|
+
record.agentGoogleSide);
|
|
122
|
+
if (!raw)
|
|
123
|
+
return "OWNER";
|
|
124
|
+
const normalized = raw.toUpperCase();
|
|
125
|
+
if (normalized === "OWNER" || normalized === "AGENT" || normalized === "TEAM") {
|
|
126
|
+
return normalized;
|
|
127
|
+
}
|
|
128
|
+
return "OWNER";
|
|
129
|
+
}
|
|
130
|
+
function parseIdTokenClaims(idToken) {
|
|
131
|
+
if (!idToken)
|
|
132
|
+
return {};
|
|
133
|
+
const segments = idToken.split(".");
|
|
134
|
+
if (segments.length < 2)
|
|
135
|
+
return {};
|
|
136
|
+
try {
|
|
137
|
+
const payload = Buffer.from(segments[1] ?? "", "base64url").toString("utf-8");
|
|
138
|
+
const parsed = JSON.parse(payload);
|
|
139
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return {};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async function fetchGoogleUserInfo(accessToken) {
|
|
146
|
+
const response = await fetch(GOOGLE_USERINFO_ENDPOINT, {
|
|
147
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
148
|
+
});
|
|
149
|
+
if (!response.ok) {
|
|
150
|
+
throw new Error(`Google userinfo request failed with ${response.status}`);
|
|
151
|
+
}
|
|
152
|
+
const parsed = (await response.json());
|
|
153
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
154
|
+
throw new Error("Google userinfo returned an invalid payload.");
|
|
155
|
+
}
|
|
156
|
+
return parsed;
|
|
157
|
+
}
|
|
158
|
+
async function exchangeAuthorizationCode(args) {
|
|
159
|
+
const params = new URLSearchParams({
|
|
160
|
+
client_id: args.clientId,
|
|
161
|
+
client_secret: args.clientSecret,
|
|
162
|
+
redirect_uri: args.redirectUri,
|
|
163
|
+
grant_type: "authorization_code",
|
|
164
|
+
code: args.code,
|
|
165
|
+
});
|
|
166
|
+
if (args.codeVerifier) {
|
|
167
|
+
params.set("code_verifier", args.codeVerifier);
|
|
168
|
+
}
|
|
169
|
+
const response = await fetch(GOOGLE_OAUTH_PROVIDER_METADATA.tokenEndpoint, {
|
|
170
|
+
method: "POST",
|
|
171
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
172
|
+
body: params.toString(),
|
|
173
|
+
});
|
|
174
|
+
if (!response.ok) {
|
|
175
|
+
const body = await response.text();
|
|
176
|
+
throw new Error(`Google token exchange failed with ${response.status}: ${body}`);
|
|
177
|
+
}
|
|
178
|
+
const parsed = (await response.json());
|
|
179
|
+
if (!parsed.access_token || !Number.isFinite(parsed.expires_in)) {
|
|
180
|
+
throw new Error("Google token exchange returned an invalid payload.");
|
|
181
|
+
}
|
|
182
|
+
return parsed;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Build the Google ConnectorAccountManager provider. Exposes listAccounts (from
|
|
186
|
+
* manager-owned storage), CRUD adapters, and a single consolidated PKCE OAuth
|
|
187
|
+
* flow that returns a Google account hydrated with the granted capabilities,
|
|
188
|
+
* scopes, and userinfo identity.
|
|
189
|
+
*/
|
|
190
|
+
export function createGoogleConnectorAccountProvider(runtime) {
|
|
191
|
+
return {
|
|
192
|
+
provider: GOOGLE_SERVICE_NAME,
|
|
193
|
+
label: GOOGLE_OAUTH_PROVIDER_METADATA.label,
|
|
194
|
+
listAccounts: async (manager) => {
|
|
195
|
+
return manager.getStorage().listAccounts(GOOGLE_SERVICE_NAME);
|
|
196
|
+
},
|
|
197
|
+
createAccount: async (input, _manager) => {
|
|
198
|
+
// Persistence is owned by the manager; this adapter just normalizes the
|
|
199
|
+
// patch into a Google-shaped account so role/purpose/status defaults are
|
|
200
|
+
// sensible when an upstream caller creates the row before OAuth runs.
|
|
201
|
+
return {
|
|
202
|
+
...input,
|
|
203
|
+
provider: GOOGLE_SERVICE_NAME,
|
|
204
|
+
role: input.role ?? "OWNER",
|
|
205
|
+
purpose: input.purpose ?? ["messaging", "calendar", "drive", "meet"],
|
|
206
|
+
accessGate: input.accessGate ?? "open",
|
|
207
|
+
status: input.status ?? "pending",
|
|
208
|
+
};
|
|
209
|
+
},
|
|
210
|
+
patchAccount: async (_accountId, patch, _manager) => {
|
|
211
|
+
return { ...patch, provider: GOOGLE_SERVICE_NAME };
|
|
212
|
+
},
|
|
213
|
+
deleteAccount: async (_accountId, _manager) => {
|
|
214
|
+
// Credential cleanup is the credential store's responsibility; the
|
|
215
|
+
// manager removes the account row after this resolves.
|
|
216
|
+
},
|
|
217
|
+
startOAuth: async (request, _manager) => {
|
|
218
|
+
const config = readClientConfig(runtime);
|
|
219
|
+
const redirectUri = request.redirectUri ?? config.redirectUri;
|
|
220
|
+
const capabilities = normalizeRequestedCapabilities(request.scopes);
|
|
221
|
+
const oauthScopes = scopesForGoogleCapabilities(capabilities);
|
|
222
|
+
const codeVerifier = createCodeVerifier();
|
|
223
|
+
const codeChallenge = createCodeChallenge(codeVerifier);
|
|
224
|
+
const params = new URLSearchParams({
|
|
225
|
+
client_id: config.clientId,
|
|
226
|
+
redirect_uri: redirectUri,
|
|
227
|
+
response_type: "code",
|
|
228
|
+
scope: oauthScopes.join(" "),
|
|
229
|
+
state: request.flow.state,
|
|
230
|
+
access_type: "offline",
|
|
231
|
+
prompt: "consent",
|
|
232
|
+
code_challenge: codeChallenge,
|
|
233
|
+
code_challenge_method: "S256",
|
|
234
|
+
include_granted_scopes: "true",
|
|
235
|
+
});
|
|
236
|
+
return {
|
|
237
|
+
authUrl: `${GOOGLE_OAUTH_PROVIDER_METADATA.authorizationEndpoint}?${params.toString()}`,
|
|
238
|
+
codeVerifier,
|
|
239
|
+
metadata: {
|
|
240
|
+
...request.metadata,
|
|
241
|
+
requestedCapabilities: capabilities,
|
|
242
|
+
requestedScopes: oauthScopes,
|
|
243
|
+
redirectUri,
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
},
|
|
247
|
+
completeOAuth: async (request, manager) => {
|
|
248
|
+
const code = nonEmptyString(request.code);
|
|
249
|
+
if (!code) {
|
|
250
|
+
throw new Error("Google OAuth callback is missing an authorization code.");
|
|
251
|
+
}
|
|
252
|
+
const config = readClientConfig(runtime);
|
|
253
|
+
const redirectUri = nonEmptyString(request.flow.redirectUri) ??
|
|
254
|
+
nonEmptyString(request.flow.metadata?.redirectUri) ??
|
|
255
|
+
config.redirectUri;
|
|
256
|
+
const tokens = await exchangeAuthorizationCode({
|
|
257
|
+
clientId: config.clientId,
|
|
258
|
+
clientSecret: config.clientSecret,
|
|
259
|
+
redirectUri,
|
|
260
|
+
code,
|
|
261
|
+
codeVerifier: request.flow.codeVerifier,
|
|
262
|
+
});
|
|
263
|
+
const grantedScopes = parseScopeString(tokens.scope);
|
|
264
|
+
const grantedCapabilities = normalizeRequestedCapabilities(grantedScopes.length > 0
|
|
265
|
+
? grantedScopes
|
|
266
|
+
: request.flow.metadata?.requestedScopes);
|
|
267
|
+
const purposes = purposesForCapabilities(grantedCapabilities);
|
|
268
|
+
let identity = parseIdTokenClaims(tokens.id_token);
|
|
269
|
+
if (!identity.email) {
|
|
270
|
+
identity = { ...identity, ...(await fetchGoogleUserInfo(tokens.access_token)) };
|
|
271
|
+
}
|
|
272
|
+
const externalId = nonEmptyString(identity.sub) ?? nonEmptyString(identity.email);
|
|
273
|
+
if (!externalId) {
|
|
274
|
+
throw new Error("Google identity payload did not include sub or email.");
|
|
275
|
+
}
|
|
276
|
+
const expiresAt = Date.now() + tokens.expires_in * 1000;
|
|
277
|
+
const oauthCredentialVersion = String(Date.now());
|
|
278
|
+
const accountMetadata = {
|
|
279
|
+
email: identity.email ?? null,
|
|
280
|
+
emailVerified: identity.email_verified ?? null,
|
|
281
|
+
name: identity.name ?? null,
|
|
282
|
+
picture: identity.picture ?? null,
|
|
283
|
+
locale: identity.locale ?? null,
|
|
284
|
+
grantedCapabilities,
|
|
285
|
+
grantedScopes: grantedScopes.length > 0
|
|
286
|
+
? grantedScopes
|
|
287
|
+
: scopesForGoogleCapabilities(grantedCapabilities),
|
|
288
|
+
identityScopes: [...GOOGLE_IDENTITY_SCOPES],
|
|
289
|
+
tokenType: tokens.token_type ?? "Bearer",
|
|
290
|
+
hasRefreshToken: Boolean(tokens.refresh_token),
|
|
291
|
+
expiresAt,
|
|
292
|
+
oauthCredentialVersion,
|
|
293
|
+
};
|
|
294
|
+
const pendingAccount = await manager.upsertAccount(GOOGLE_SERVICE_NAME, {
|
|
295
|
+
provider: GOOGLE_SERVICE_NAME,
|
|
296
|
+
role: roleFromMetadata(request.flow.metadata),
|
|
297
|
+
purpose: purposes,
|
|
298
|
+
accessGate: "open",
|
|
299
|
+
status: "pending",
|
|
300
|
+
externalId,
|
|
301
|
+
displayHandle: nonEmptyString(identity.email) ?? nonEmptyString(identity.name),
|
|
302
|
+
label: nonEmptyString(identity.name) ??
|
|
303
|
+
nonEmptyString(identity.email) ??
|
|
304
|
+
GOOGLE_OAUTH_PROVIDER_METADATA.label,
|
|
305
|
+
metadata: accountMetadata,
|
|
306
|
+
}, request.flow.accountId);
|
|
307
|
+
const credentialPersist = await persistConnectorCredentialRefs({
|
|
308
|
+
runtime,
|
|
309
|
+
manager,
|
|
310
|
+
provider: GOOGLE_SERVICE_NAME,
|
|
311
|
+
accountIdForRef: pendingAccount.id,
|
|
312
|
+
storageAccountId: pendingAccount.id,
|
|
313
|
+
caller: "plugin-google",
|
|
314
|
+
credentials: [
|
|
315
|
+
{
|
|
316
|
+
credentialType: "oauth.tokens",
|
|
317
|
+
value: JSON.stringify({
|
|
318
|
+
access_token: tokens.access_token,
|
|
319
|
+
...(tokens.refresh_token ? { refresh_token: tokens.refresh_token } : {}),
|
|
320
|
+
...(tokens.id_token ? { id_token: tokens.id_token } : {}),
|
|
321
|
+
token_type: tokens.token_type ?? "Bearer",
|
|
322
|
+
scope: grantedScopes.length > 0
|
|
323
|
+
? grantedScopes.join(" ")
|
|
324
|
+
: scopesForGoogleCapabilities(grantedCapabilities).join(" "),
|
|
325
|
+
expiry_date: expiresAt,
|
|
326
|
+
}),
|
|
327
|
+
expiresAt,
|
|
328
|
+
metadata: {
|
|
329
|
+
provider: GOOGLE_SERVICE_NAME,
|
|
330
|
+
hasRefreshToken: Boolean(tokens.refresh_token),
|
|
331
|
+
},
|
|
332
|
+
},
|
|
333
|
+
],
|
|
334
|
+
});
|
|
335
|
+
const accountPatch = {
|
|
336
|
+
...pendingAccount,
|
|
337
|
+
id: pendingAccount.id,
|
|
338
|
+
provider: GOOGLE_SERVICE_NAME,
|
|
339
|
+
status: "connected",
|
|
340
|
+
metadata: {
|
|
341
|
+
...accountMetadata,
|
|
342
|
+
credentialRefs: credentialPersist.refs,
|
|
343
|
+
credentialRefStorage: {
|
|
344
|
+
vaultAvailable: credentialPersist.vaultAvailable,
|
|
345
|
+
storageAvailable: credentialPersist.storageAvailable,
|
|
346
|
+
},
|
|
347
|
+
},
|
|
348
|
+
};
|
|
349
|
+
logger.info({
|
|
350
|
+
src: "plugin:google:connector",
|
|
351
|
+
externalId,
|
|
352
|
+
capabilities: grantedCapabilities,
|
|
353
|
+
}, "Google OAuth completed");
|
|
354
|
+
return {
|
|
355
|
+
account: accountPatch,
|
|
356
|
+
flow: { status: "completed" },
|
|
357
|
+
};
|
|
358
|
+
},
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=connector-account-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector-account-provider.js","sourceRoot":"","sources":["../src/connector-account-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type ConnectorAccountManager, type IAgentRuntime } from "@elizaos/core";
|
|
2
|
+
type JsonValue = string | number | boolean | null | undefined | JsonValue[] | {
|
|
3
|
+
readonly [key: string]: JsonValue;
|
|
4
|
+
};
|
|
5
|
+
type JsonRecord = Record<string, JsonValue>;
|
|
6
|
+
export interface ConnectorCredentialRefMetadata extends JsonRecord {
|
|
7
|
+
credentialType: string;
|
|
8
|
+
vaultRef: string;
|
|
9
|
+
expiresAt?: number;
|
|
10
|
+
metadata?: JsonRecord;
|
|
11
|
+
}
|
|
12
|
+
export interface ConnectorCredentialRefRecordLike {
|
|
13
|
+
credentialType: string;
|
|
14
|
+
vaultRef?: string | null;
|
|
15
|
+
metadata?: JsonRecord | null;
|
|
16
|
+
expiresAt?: number | string | Date | null;
|
|
17
|
+
updatedAt?: number | string | Date | null;
|
|
18
|
+
version?: string | number | null;
|
|
19
|
+
}
|
|
20
|
+
export interface ConnectorCredentialPersistResult {
|
|
21
|
+
refs: ConnectorCredentialRefMetadata[];
|
|
22
|
+
vaultAvailable: boolean;
|
|
23
|
+
storageAvailable: boolean;
|
|
24
|
+
}
|
|
25
|
+
interface ConnectorCredentialInput {
|
|
26
|
+
credentialType: string;
|
|
27
|
+
value: string;
|
|
28
|
+
expiresAt?: number;
|
|
29
|
+
metadata?: JsonRecord;
|
|
30
|
+
}
|
|
31
|
+
interface PersistConnectorCredentialRefsParams {
|
|
32
|
+
runtime: IAgentRuntime;
|
|
33
|
+
manager?: ConnectorAccountManager;
|
|
34
|
+
provider: string;
|
|
35
|
+
accountIdForRef: string;
|
|
36
|
+
storageAccountId?: string;
|
|
37
|
+
credentials: ConnectorCredentialInput[];
|
|
38
|
+
caller: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function persistConnectorCredentialRefs(params: PersistConnectorCredentialRefsParams): Promise<ConnectorCredentialPersistResult>;
|
|
41
|
+
export declare function credentialRefRecordsFromMetadata(metadata: unknown): ConnectorCredentialRefRecordLike[];
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=connector-credential-refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector-credential-refs.d.ts","sourceRoot":"","sources":["../src/connector-credential-refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAEvB,KAAK,SAAS,GACV,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,SAAS,EAAE,GACX;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAC1C,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE5C,MAAM,WAAW,8BAA+B,SAAQ,UAAU;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,gCAAgC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,8BAA8B,EAAE,CAAC;IACvC,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,wBAAwB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED,UAAU,oCAAoC;IAC5C,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,wBAAwB,EAAE,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;CAChB;AAYD,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,oCAAoC,GAC3C,OAAO,CAAC,gCAAgC,CAAC,CAqD3C;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,OAAO,GAChB,gCAAgC,EAAE,CAUpC"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { CONNECTOR_ACCOUNT_STORAGE_SERVICE_TYPE, } from "@elizaos/core";
|
|
2
|
+
export async function persistConnectorCredentialRefs(params) {
|
|
3
|
+
const refs = [];
|
|
4
|
+
const vaultWriters = resolveVaultWriters(params.runtime, {
|
|
5
|
+
provider: params.provider,
|
|
6
|
+
accountId: params.accountIdForRef,
|
|
7
|
+
caller: params.caller,
|
|
8
|
+
});
|
|
9
|
+
if (vaultWriters.length === 0) {
|
|
10
|
+
throw new Error(`No durable connector credential store or vault writer is available for ${params.provider} account ${params.accountIdForRef}. Refusing to mark OAuth account connected without persisted credentials.`);
|
|
11
|
+
}
|
|
12
|
+
if (!params.storageAccountId) {
|
|
13
|
+
throw new Error(`No durable connector account id is available for ${params.provider} account ${params.accountIdForRef}. Refusing to mark OAuth account connected without persisted credential refs.`);
|
|
14
|
+
}
|
|
15
|
+
const storageWriters = resolveCredentialRefWriters(params.runtime, params.manager, params.storageAccountId);
|
|
16
|
+
if (storageWriters.length === 0) {
|
|
17
|
+
throw new Error(`No durable connector credential ref writer is available for ${params.provider} account ${params.storageAccountId}. Refusing to mark OAuth account connected without persisted credential refs.`);
|
|
18
|
+
}
|
|
19
|
+
for (const credential of params.credentials) {
|
|
20
|
+
const plannedRef = buildConnectorCredentialVaultRef({
|
|
21
|
+
agentId: nonEmptyString(params.runtime.agentId) ?? "agent",
|
|
22
|
+
provider: params.provider,
|
|
23
|
+
accountId: params.accountIdForRef,
|
|
24
|
+
credentialType: credential.credentialType,
|
|
25
|
+
});
|
|
26
|
+
const vaultRef = await writeWithFirstAvailableVault(vaultWriters, plannedRef, credential);
|
|
27
|
+
refs.push({
|
|
28
|
+
credentialType: credential.credentialType,
|
|
29
|
+
vaultRef,
|
|
30
|
+
...(credential.expiresAt !== undefined ? { expiresAt: credential.expiresAt } : {}),
|
|
31
|
+
...(credential.metadata ? { metadata: credential.metadata } : {}),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (refs.length > 0) {
|
|
35
|
+
await writeRefsToStorage(storageWriters, refs);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
refs,
|
|
39
|
+
vaultAvailable: vaultWriters.length > 0,
|
|
40
|
+
storageAvailable: storageWriters.length > 0,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function credentialRefRecordsFromMetadata(metadata) {
|
|
44
|
+
const record = asRecord(metadata);
|
|
45
|
+
if (!record)
|
|
46
|
+
return [];
|
|
47
|
+
const oauth = asRecord(record.oauth);
|
|
48
|
+
return [
|
|
49
|
+
...credentialRefsFromUnknown(record.credentialRefs),
|
|
50
|
+
...credentialRefsFromUnknown(record.oauthCredentialRefs),
|
|
51
|
+
...credentialRefsFromUnknown(oauth?.credentialRefs),
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
function credentialRefsFromUnknown(value) {
|
|
55
|
+
if (Array.isArray(value)) {
|
|
56
|
+
return value.flatMap((entry) => {
|
|
57
|
+
const ref = credentialRefFromRecord(asRecord(entry));
|
|
58
|
+
return ref ? [ref] : [];
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const record = asRecord(value);
|
|
62
|
+
if (!record)
|
|
63
|
+
return [];
|
|
64
|
+
return Object.entries(record).flatMap(([credentialType, entry]) => {
|
|
65
|
+
const entryRecord = asRecord(entry);
|
|
66
|
+
if (entryRecord) {
|
|
67
|
+
const ref = credentialRefFromRecord({
|
|
68
|
+
credentialType,
|
|
69
|
+
...entryRecord,
|
|
70
|
+
});
|
|
71
|
+
return ref ? [ref] : [];
|
|
72
|
+
}
|
|
73
|
+
const vaultRef = nonEmptyString(entry);
|
|
74
|
+
return vaultRef ? [{ credentialType, vaultRef }] : [];
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function credentialRefFromRecord(record) {
|
|
78
|
+
if (!record)
|
|
79
|
+
return null;
|
|
80
|
+
const credentialType = nonEmptyString(record.credentialType ?? record.type ?? record.name);
|
|
81
|
+
const vaultRef = nonEmptyString(record.vaultRef ?? record.ref);
|
|
82
|
+
if (!credentialType || !vaultRef)
|
|
83
|
+
return null;
|
|
84
|
+
return {
|
|
85
|
+
credentialType,
|
|
86
|
+
vaultRef,
|
|
87
|
+
metadata: asRecord(record.metadata) ?? null,
|
|
88
|
+
expiresAt: record.expiresAt,
|
|
89
|
+
updatedAt: record.updatedAt,
|
|
90
|
+
version: (record.version ??
|
|
91
|
+
record.credentialVersion),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function resolveVaultWriters(runtime, context) {
|
|
95
|
+
const writers = [];
|
|
96
|
+
const credentialStore = getFirstService(runtime, [
|
|
97
|
+
"connector_credential_store",
|
|
98
|
+
"CONNECTOR_CREDENTIAL_STORE",
|
|
99
|
+
"connectorCredentialStore",
|
|
100
|
+
"credential_store",
|
|
101
|
+
]);
|
|
102
|
+
if (typeof credentialStore?.putSecret === "function") {
|
|
103
|
+
writers.push({
|
|
104
|
+
name: "connector_credential_store",
|
|
105
|
+
write: async (vaultRef, credential) => credentialStore.putSecret?.({
|
|
106
|
+
vaultRef,
|
|
107
|
+
agentId: nonEmptyString(runtime.agentId) ?? "agent",
|
|
108
|
+
provider: context.provider,
|
|
109
|
+
accountId: context.accountId,
|
|
110
|
+
credentialType: credential.credentialType,
|
|
111
|
+
value: credential.value,
|
|
112
|
+
caller: context.caller,
|
|
113
|
+
}) ?? vaultRef,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const vault = getFirstService(runtime, ["vault", "VAULT"]);
|
|
117
|
+
if (typeof vault?.set === "function") {
|
|
118
|
+
writers.push({
|
|
119
|
+
name: "vault",
|
|
120
|
+
write: async (vaultRef, credential) => {
|
|
121
|
+
await vault.set?.(vaultRef, credential.value, {
|
|
122
|
+
sensitive: true,
|
|
123
|
+
caller: context.caller,
|
|
124
|
+
});
|
|
125
|
+
return vaultRef;
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
const secrets = getService(runtime, "SECRETS");
|
|
130
|
+
if (typeof secrets?.setGlobal === "function" || typeof secrets?.set === "function") {
|
|
131
|
+
writers.push({
|
|
132
|
+
name: "SECRETS",
|
|
133
|
+
write: async (vaultRef, credential) => {
|
|
134
|
+
if (typeof secrets.setGlobal === "function") {
|
|
135
|
+
await secrets.setGlobal(vaultRef, credential.value, { sensitive: true });
|
|
136
|
+
return vaultRef;
|
|
137
|
+
}
|
|
138
|
+
await secrets.set?.(vaultRef, credential.value, { level: "global", agentId: runtime.agentId }, { sensitive: true });
|
|
139
|
+
return vaultRef;
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return writers;
|
|
144
|
+
}
|
|
145
|
+
function resolveCredentialRefWriters(runtime, manager, accountId) {
|
|
146
|
+
const candidates = [
|
|
147
|
+
manager?.getStorage?.(),
|
|
148
|
+
getService(runtime, CONNECTOR_ACCOUNT_STORAGE_SERVICE_TYPE),
|
|
149
|
+
runtime.adapter,
|
|
150
|
+
].filter(Boolean);
|
|
151
|
+
const writers = [];
|
|
152
|
+
for (const candidate of candidates) {
|
|
153
|
+
const writer = candidate;
|
|
154
|
+
if (typeof writer.setConnectorAccountCredentialRef === "function") {
|
|
155
|
+
writers.push({
|
|
156
|
+
name: "setConnectorAccountCredentialRef",
|
|
157
|
+
write: async (ref) => {
|
|
158
|
+
await writer.setConnectorAccountCredentialRef?.({
|
|
159
|
+
accountId,
|
|
160
|
+
credentialType: ref.credentialType,
|
|
161
|
+
vaultRef: ref.vaultRef,
|
|
162
|
+
...(ref.metadata ? { metadata: ref.metadata } : {}),
|
|
163
|
+
...(ref.expiresAt !== undefined ? { expiresAt: ref.expiresAt } : {}),
|
|
164
|
+
});
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
else if (typeof writer.setCredentialRef === "function") {
|
|
169
|
+
writers.push({
|
|
170
|
+
name: "setCredentialRef",
|
|
171
|
+
write: async (ref) => {
|
|
172
|
+
await writer.setCredentialRef?.({
|
|
173
|
+
accountId,
|
|
174
|
+
credentialType: ref.credentialType,
|
|
175
|
+
vaultRef: ref.vaultRef,
|
|
176
|
+
...(ref.metadata ? { metadata: ref.metadata } : {}),
|
|
177
|
+
...(ref.expiresAt !== undefined ? { expiresAt: ref.expiresAt } : {}),
|
|
178
|
+
});
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return writers;
|
|
184
|
+
}
|
|
185
|
+
async function writeWithFirstAvailableVault(writers, plannedRef, credential) {
|
|
186
|
+
const errors = [];
|
|
187
|
+
for (const writer of writers) {
|
|
188
|
+
try {
|
|
189
|
+
return await writer.write(plannedRef, credential);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
errors.push(`${writer.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
throw new Error(`Failed to persist connector credential ref ${plannedRef}: ${errors.join("; ")}`);
|
|
196
|
+
}
|
|
197
|
+
async function writeRefsToStorage(writers, refs) {
|
|
198
|
+
const errors = [];
|
|
199
|
+
for (const writer of writers) {
|
|
200
|
+
try {
|
|
201
|
+
for (const ref of refs) {
|
|
202
|
+
await writer.write(ref);
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
errors.push(`${writer.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
throw new Error(`Failed to persist connector credential refs: ${errors.join("; ")}`);
|
|
211
|
+
}
|
|
212
|
+
function buildConnectorCredentialVaultRef(params) {
|
|
213
|
+
return [
|
|
214
|
+
"connector",
|
|
215
|
+
normalizeVaultSegment(params.agentId),
|
|
216
|
+
normalizeVaultSegment(params.provider),
|
|
217
|
+
normalizeVaultSegment(params.accountId),
|
|
218
|
+
normalizeVaultSegment(params.credentialType),
|
|
219
|
+
].join(".");
|
|
220
|
+
}
|
|
221
|
+
function normalizeVaultSegment(value) {
|
|
222
|
+
const normalized = value
|
|
223
|
+
.trim()
|
|
224
|
+
.replace(/[^a-zA-Z0-9_-]+/g, "_")
|
|
225
|
+
.replace(/^_+|_+$/g, "");
|
|
226
|
+
return (normalized || "unknown").slice(0, 64);
|
|
227
|
+
}
|
|
228
|
+
function getFirstService(runtime, serviceTypes) {
|
|
229
|
+
for (const serviceType of serviceTypes) {
|
|
230
|
+
const service = getService(runtime, serviceType);
|
|
231
|
+
if (service)
|
|
232
|
+
return service;
|
|
233
|
+
}
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
function getService(runtime, serviceType) {
|
|
237
|
+
try {
|
|
238
|
+
return runtime.getService?.(serviceType) ?? null;
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function asRecord(value) {
|
|
245
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
246
|
+
? value
|
|
247
|
+
: undefined;
|
|
248
|
+
}
|
|
249
|
+
function nonEmptyString(value) {
|
|
250
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=connector-credential-refs.js.map
|