@alfe.ai/agent-api-client 0.1.4 → 0.2.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/index.cjs +271 -0
- package/dist/index.d.cts +262 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +262 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +271 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -146,6 +146,14 @@ var AgentApiClient = class {
|
|
|
146
146
|
async getGoogleChatCredentials() {
|
|
147
147
|
return this.request("/agent/google-chat/credentials");
|
|
148
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* @deprecated Returns a single primary credential blob (legacy "pick-the-
|
|
151
|
+
* default-connection" shape). Use `getGithubAccounts()` for the multi-
|
|
152
|
+
* account shape required by Pattern A — explicit selector args on every
|
|
153
|
+
* tool. Retained because the `@alfe.ai/openclaw-github` proxy is the
|
|
154
|
+
* only consumer that knows about Pattern A; legacy env-interpolation
|
|
155
|
+
* callers will keep hitting `/credentials` until they move to the proxy.
|
|
156
|
+
*/
|
|
149
157
|
async getGithubCredentials() {
|
|
150
158
|
const raw = await this.request("/agent/connect/github/credentials");
|
|
151
159
|
return {
|
|
@@ -153,6 +161,37 @@ var AgentApiClient = class {
|
|
|
153
161
|
accessToken: raw.accessToken
|
|
154
162
|
};
|
|
155
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Pattern A: multi-account credential fetch for GitHub.
|
|
166
|
+
*
|
|
167
|
+
* Returns every agent-scoped GitHub connection. The caller is expected
|
|
168
|
+
* to require a `login` selector on every credential-touching tool and
|
|
169
|
+
* look up the matching account at dispatch time.
|
|
170
|
+
*
|
|
171
|
+
* GitHub OAuth tokens have no expiry (`tokenLifecycle: "no_expiry"`),
|
|
172
|
+
* so there is intentionally no `refreshGithubAccountToken` method — if
|
|
173
|
+
* a token is revoked the user must re-run the OAuth flow.
|
|
174
|
+
*
|
|
175
|
+
* Returned `accounts[i].login` is the GitHub username — the stable
|
|
176
|
+
* cross-session identifier the LLM should pass.
|
|
177
|
+
*/
|
|
178
|
+
async getGithubAccounts() {
|
|
179
|
+
return { accounts: (await this.request("/agent/connect/github/accounts")).accounts.map((a) => ({
|
|
180
|
+
connectionId: a.connectionId,
|
|
181
|
+
accountIdentifier: a.accountIdentifier,
|
|
182
|
+
displayName: a.displayName,
|
|
183
|
+
connectedAt: a.connectedAt,
|
|
184
|
+
accessToken: a.accessToken ?? "",
|
|
185
|
+
login: a.login ?? a.accountIdentifier,
|
|
186
|
+
scopes: a.scopes ?? ""
|
|
187
|
+
})) };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* @deprecated Returns a single primary credential blob (legacy "pick-the-
|
|
191
|
+
* default-connection" shape). Use `getXeroAccounts()` for the multi-
|
|
192
|
+
* account shape required by Pattern A — explicit selector args on every
|
|
193
|
+
* tool. This method will be removed once all consumers migrate.
|
|
194
|
+
*/
|
|
156
195
|
async getXeroCredentials() {
|
|
157
196
|
const raw = await this.request("/agent/connect/xero/credentials");
|
|
158
197
|
return {
|
|
@@ -161,9 +200,49 @@ var AgentApiClient = class {
|
|
|
161
200
|
xeroTenantId: raw.xeroTenantId ?? ""
|
|
162
201
|
};
|
|
163
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* Pattern A: multi-account credential fetch for Xero. Returns every
|
|
205
|
+
* agent-scoped Xero connection. The caller is expected to require a
|
|
206
|
+
* selector arg (e.g. `xeroTenantId`) on every credential-touching tool
|
|
207
|
+
* and look up the matching account by that selector at dispatch time.
|
|
208
|
+
*
|
|
209
|
+
* Returned `accounts[i].accountIdentifier` is the Xero tenantId — the
|
|
210
|
+
* stable cross-session identifier the LLM should pass.
|
|
211
|
+
*/
|
|
212
|
+
async getXeroAccounts() {
|
|
213
|
+
return { accounts: (await this.request("/agent/connect/xero/accounts")).accounts.map((a) => ({
|
|
214
|
+
connectionId: a.connectionId,
|
|
215
|
+
accountIdentifier: a.accountIdentifier,
|
|
216
|
+
displayName: a.displayName,
|
|
217
|
+
connectedAt: a.connectedAt,
|
|
218
|
+
accessToken: a.accessToken,
|
|
219
|
+
accessTokenExpiresAt: a.accessTokenExpiresAt ?? "",
|
|
220
|
+
xeroTenantId: a.xeroTenantId ?? a.accountIdentifier
|
|
221
|
+
})) };
|
|
222
|
+
}
|
|
164
223
|
async refreshXeroToken() {
|
|
165
224
|
return this.request("/agent/connect/xero/refresh", { method: "POST" });
|
|
166
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* Pattern A: refresh a specific Xero connection by its `accountIdentifier`
|
|
228
|
+
* (the Xero `tenantId`). The legacy `refreshXeroToken()` only refreshes
|
|
229
|
+
* the *primary* connection, which is wrong for multi-tenant Xero where
|
|
230
|
+
* each tenant has its own non-interchangeable access token.
|
|
231
|
+
*/
|
|
232
|
+
async refreshXeroAccountToken(xeroTenantId) {
|
|
233
|
+
const path = `/agent/connect/xero/accounts/${encodeURIComponent(xeroTenantId)}/refresh`;
|
|
234
|
+
const raw = await this.request(path, { method: "POST" });
|
|
235
|
+
return {
|
|
236
|
+
accessToken: raw.accessToken,
|
|
237
|
+
accessTokenExpiresAt: raw.accessTokenExpiresAt ?? "",
|
|
238
|
+
expiresAt: raw.expiresAt ?? ""
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* @deprecated Returns a single primary credential blob (legacy "pick-the-
|
|
243
|
+
* default-connection" shape). Use `getNotionAccounts()` for the multi-
|
|
244
|
+
* account shape required by Pattern A.
|
|
245
|
+
*/
|
|
167
246
|
async getNotionCredentials() {
|
|
168
247
|
const raw = await this.request("/agent/connect/notion/credentials");
|
|
169
248
|
return {
|
|
@@ -172,6 +251,32 @@ var AgentApiClient = class {
|
|
|
172
251
|
workspaceName: raw.workspaceName ?? ""
|
|
173
252
|
};
|
|
174
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* Pattern A: multi-account credential fetch for Notion. Returns every
|
|
256
|
+
* agent-scoped Notion connection. The caller is expected to require a
|
|
257
|
+
* selector arg (e.g. `workspaceId`) on every credential-touching tool.
|
|
258
|
+
*
|
|
259
|
+
* Returned `accounts[i].accountIdentifier` is the Notion workspaceId.
|
|
260
|
+
*/
|
|
261
|
+
async getNotionAccounts() {
|
|
262
|
+
return { accounts: (await this.request("/agent/connect/notion/accounts")).accounts.map((a) => ({
|
|
263
|
+
connectionId: a.connectionId,
|
|
264
|
+
accountIdentifier: a.accountIdentifier,
|
|
265
|
+
displayName: a.displayName,
|
|
266
|
+
connectedAt: a.connectedAt,
|
|
267
|
+
accessToken: a.accessToken,
|
|
268
|
+
workspaceId: a.workspaceId ?? a.accountIdentifier,
|
|
269
|
+
workspaceName: a.workspaceName ?? a.displayName ?? ""
|
|
270
|
+
})) };
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* @deprecated Returns a single primary Atlassian Connection's credentials
|
|
274
|
+
* (one OAuth user, one cloudId) — the legacy "pick-the-default-connection"
|
|
275
|
+
* shape. Atlassian is multi-site by nature (each OAuth user may have
|
|
276
|
+
* access to multiple Cloud sites), so Pattern A plugins MUST use
|
|
277
|
+
* `getAtlassianAccounts()` to discover the full set and dispatch via
|
|
278
|
+
* the `cloudId` selector arg.
|
|
279
|
+
*/
|
|
175
280
|
async getAtlassianCredentials() {
|
|
176
281
|
const raw = await this.request("/agent/connect/atlassian/credentials");
|
|
177
282
|
return {
|
|
@@ -190,6 +295,72 @@ var AgentApiClient = class {
|
|
|
190
295
|
async refreshAtlassianToken() {
|
|
191
296
|
return this.request("/agent/connect/atlassian/refresh", { method: "POST" });
|
|
192
297
|
}
|
|
298
|
+
/**
|
|
299
|
+
* Pattern A: multi-account / multi-site credential fetch for Atlassian.
|
|
300
|
+
*
|
|
301
|
+
* Returns every agent-scoped Atlassian Connection. Each Connection is
|
|
302
|
+
* one OAuth user with a single access token and N accessible Cloud
|
|
303
|
+
* sites (`availableSites`). The caller is expected to:
|
|
304
|
+
*
|
|
305
|
+
* 1. Flatten (connection × cloudId) into one MCP child per site.
|
|
306
|
+
* 2. Require a `cloudId` selector on every credential-touching tool.
|
|
307
|
+
* 3. Use the access token bound to the Connection that owns the
|
|
308
|
+
* requested `cloudId` (Atlassian shares one access token across
|
|
309
|
+
* all sites accessible to the OAuth user).
|
|
310
|
+
*
|
|
311
|
+
* Per-account token refresh uses `refreshAtlassianAccountToken(email)`
|
|
312
|
+
* — refreshing one Connection rotates its single access token, which
|
|
313
|
+
* then applies to every cloudId for that Connection.
|
|
314
|
+
*
|
|
315
|
+
* Returned `accounts[i].accountIdentifier` is the OAuth user's email
|
|
316
|
+
* — the stable cross-session identifier for refresh purposes. The LLM
|
|
317
|
+
* never sees this directly: it picks a site via the `cloudId` arg
|
|
318
|
+
* instead.
|
|
319
|
+
*/
|
|
320
|
+
async getAtlassianAccounts() {
|
|
321
|
+
return { accounts: (await this.request("/agent/connect/atlassian/accounts")).accounts.map((a) => ({
|
|
322
|
+
connectionId: a.connectionId,
|
|
323
|
+
accountIdentifier: a.accountIdentifier,
|
|
324
|
+
displayName: a.displayName,
|
|
325
|
+
connectedAt: a.connectedAt,
|
|
326
|
+
accessToken: a.accessToken ?? "",
|
|
327
|
+
accessTokenExpiresAt: a.accessTokenExpiresAt ?? "",
|
|
328
|
+
clientId: a.clientId ?? "",
|
|
329
|
+
clientSecret: a.clientSecret ?? "",
|
|
330
|
+
cloudId: a.cloudId ?? "",
|
|
331
|
+
siteName: a.siteName ?? "",
|
|
332
|
+
siteUrl: a.siteUrl ?? "",
|
|
333
|
+
availableSites: a.availableSites ?? []
|
|
334
|
+
})) };
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Pattern A: refresh a specific Atlassian Connection by `accountIdentifier`
|
|
338
|
+
* (the OAuth user's email).
|
|
339
|
+
*
|
|
340
|
+
* Atlassian rotates refresh tokens (`rotatesRefreshToken: true`); the
|
|
341
|
+
* server-side per-account refresh endpoint handles rotation and
|
|
342
|
+
* persistence. Refreshing one Connection updates its single access
|
|
343
|
+
* token, which applies to every accessible Cloud site (cloudId) for
|
|
344
|
+
* that OAuth user.
|
|
345
|
+
*
|
|
346
|
+
* Returns the new access token + expiry. The proxy is responsible for
|
|
347
|
+
* fanning the new token out to every child server it spawned for
|
|
348
|
+
* cloudIds owned by this Connection.
|
|
349
|
+
*/
|
|
350
|
+
async refreshAtlassianAccountToken(accountIdentifier) {
|
|
351
|
+
const path = `/agent/connect/atlassian/accounts/${encodeURIComponent(accountIdentifier)}/refresh`;
|
|
352
|
+
const raw = await this.request(path, { method: "POST" });
|
|
353
|
+
return {
|
|
354
|
+
accessToken: raw.accessToken,
|
|
355
|
+
accessTokenExpiresAt: raw.accessTokenExpiresAt ?? "",
|
|
356
|
+
expiresAt: raw.expiresAt ?? ""
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* @deprecated Returns a single primary credential blob (legacy "pick-the-
|
|
361
|
+
* default-connection" shape). Use `getMYOBAccounts()` for the multi-
|
|
362
|
+
* account shape required by Pattern A.
|
|
363
|
+
*/
|
|
193
364
|
async getMYOBCredentials() {
|
|
194
365
|
const raw = await this.request("/agent/connect/myob/credentials");
|
|
195
366
|
return {
|
|
@@ -199,9 +370,109 @@ var AgentApiClient = class {
|
|
|
199
370
|
clientId: raw.clientId
|
|
200
371
|
};
|
|
201
372
|
}
|
|
373
|
+
/**
|
|
374
|
+
* Pattern A: multi-account credential fetch for MYOB. Returns every
|
|
375
|
+
* agent-scoped MYOB connection. The caller is expected to require a
|
|
376
|
+
* selector arg (e.g. `myobBusinessId` / `accountIdentifier`) on every
|
|
377
|
+
* credential-touching tool.
|
|
378
|
+
*
|
|
379
|
+
* Returned `accounts[i].accountIdentifier` is the MYOB businessId.
|
|
380
|
+
*/
|
|
381
|
+
async getMYOBAccounts() {
|
|
382
|
+
return { accounts: (await this.request("/agent/connect/myob/accounts")).accounts.map((a) => ({
|
|
383
|
+
connectionId: a.connectionId,
|
|
384
|
+
accountIdentifier: a.accountIdentifier,
|
|
385
|
+
displayName: a.displayName,
|
|
386
|
+
connectedAt: a.connectedAt,
|
|
387
|
+
accessToken: a.accessToken,
|
|
388
|
+
accessTokenExpiresAt: a.accessTokenExpiresAt ?? "",
|
|
389
|
+
myobBusinessId: a.myobBusinessId ?? a.accountIdentifier,
|
|
390
|
+
clientId: a.clientId
|
|
391
|
+
})) };
|
|
392
|
+
}
|
|
202
393
|
async refreshMYOBToken() {
|
|
203
394
|
return this.request("/agent/connect/myob/refresh", { method: "POST" });
|
|
204
395
|
}
|
|
396
|
+
/**
|
|
397
|
+
* Microsoft 365 (delegated OAuth) credential fetch — single-account shape.
|
|
398
|
+
*
|
|
399
|
+
* @deprecated Use `getMicrosoftAccounts()` and dispatch via the `email`
|
|
400
|
+
* selector once per-account plugins land. Retained because the existing
|
|
401
|
+
* `integrations/connect/microsoft/hooks/post_activate.mjs` writes
|
|
402
|
+
* `mgc` credentials for the single (default) Microsoft account.
|
|
403
|
+
*
|
|
404
|
+
* Returns the agent's effective Microsoft delegated-OAuth credentials.
|
|
405
|
+
* Distinct from `getTeamsCredentials()` (Azure bot credentials for the
|
|
406
|
+
* Teams adapter, which is admin-consent flow on services/microsoft, not
|
|
407
|
+
* delegated OAuth on services/connect).
|
|
408
|
+
*/
|
|
409
|
+
async getMicrosoftCredentials() {
|
|
410
|
+
const raw = await this.request("/agent/connect/microsoft/credentials");
|
|
411
|
+
return {
|
|
412
|
+
accessToken: raw.accessToken ?? "",
|
|
413
|
+
accessTokenExpiresAt: raw.accessTokenExpiresAt,
|
|
414
|
+
refreshToken: raw.refreshToken ?? "",
|
|
415
|
+
clientId: raw.clientId ?? "",
|
|
416
|
+
clientSecret: raw.clientSecret ?? "",
|
|
417
|
+
email: raw.email ?? raw.accountIdentifier,
|
|
418
|
+
microsoftTenantId: raw.microsoftTenantId,
|
|
419
|
+
workspaceDomain: raw.workspaceDomain
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Pattern A: multi-account credential fetch for Microsoft 365.
|
|
424
|
+
*
|
|
425
|
+
* Returns every agent-scoped Microsoft connection. The caller is expected
|
|
426
|
+
* to require an `email` selector on every credential-touching tool and
|
|
427
|
+
* look up the matching account at dispatch time.
|
|
428
|
+
*
|
|
429
|
+
* Returned `accounts[i].accountIdentifier` is the user's primary email
|
|
430
|
+
* (or the tid claim as fallback) — the stable cross-session identifier
|
|
431
|
+
* the LLM should pass.
|
|
432
|
+
*
|
|
433
|
+
* Per-account token refresh is exposed via `refreshMicrosoftAccountToken`,
|
|
434
|
+
* NOT `refreshXeroAccountToken` — Microsoft refresh tokens are not
|
|
435
|
+
* interchangeable across (tenant, user) pairs.
|
|
436
|
+
*/
|
|
437
|
+
async getMicrosoftAccounts() {
|
|
438
|
+
return { accounts: (await this.request("/agent/connect/microsoft/accounts")).accounts.map((a) => ({
|
|
439
|
+
connectionId: a.connectionId,
|
|
440
|
+
accountIdentifier: a.accountIdentifier,
|
|
441
|
+
displayName: a.displayName,
|
|
442
|
+
connectedAt: a.connectedAt,
|
|
443
|
+
accessToken: a.accessToken ?? "",
|
|
444
|
+
accessTokenExpiresAt: a.accessTokenExpiresAt ?? "",
|
|
445
|
+
refreshToken: a.refreshToken ?? "",
|
|
446
|
+
clientId: a.clientId ?? "",
|
|
447
|
+
clientSecret: a.clientSecret ?? "",
|
|
448
|
+
email: a.email ?? a.accountIdentifier,
|
|
449
|
+
microsoftTenantId: a.microsoftTenantId ?? "",
|
|
450
|
+
workspaceDomain: a.workspaceDomain ?? ""
|
|
451
|
+
})) };
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Pattern A: refresh a specific Microsoft 365 connection by its
|
|
455
|
+
* `accountIdentifier`. For Microsoft, `accountIdentifier` is the user's
|
|
456
|
+
* email when the Graph profile fetch succeeded at connect time, and the
|
|
457
|
+
* Azure tenant id (`tid` claim) as fallback. Callers should pass the
|
|
458
|
+
* value returned by `getMicrosoftAccounts()` rather than synthesising
|
|
459
|
+
* an email locally.
|
|
460
|
+
*
|
|
461
|
+
* Microsoft refresh tokens are bound to a specific (tenant, user) pair —
|
|
462
|
+
* they are NOT interchangeable across accounts, so per-account refresh
|
|
463
|
+
* is mandatory. The generic /accounts/{accountIdentifier}/refresh
|
|
464
|
+
* endpoint walks the agent's full visible scope chain to find a matching
|
|
465
|
+
* connection (works for inherited team/project Microsoft connections).
|
|
466
|
+
*/
|
|
467
|
+
async refreshMicrosoftAccountToken(accountIdentifier) {
|
|
468
|
+
const path = `/agent/connect/microsoft/accounts/${encodeURIComponent(accountIdentifier)}/refresh`;
|
|
469
|
+
const raw = await this.request(path, { method: "POST" });
|
|
470
|
+
return {
|
|
471
|
+
accessToken: raw.accessToken,
|
|
472
|
+
accessTokenExpiresAt: raw.accessTokenExpiresAt ?? "",
|
|
473
|
+
expiresAt: raw.expiresAt ?? ""
|
|
474
|
+
};
|
|
475
|
+
}
|
|
205
476
|
async getTeamsCredentials() {
|
|
206
477
|
return this.request("/agent/microsoft/credentials");
|
|
207
478
|
}
|
package/dist/index.d.cts
CHANGED
|
@@ -202,24 +202,125 @@ declare class AgentApiClient {
|
|
|
202
202
|
clientSecret: string;
|
|
203
203
|
displayName?: string;
|
|
204
204
|
}>;
|
|
205
|
+
/**
|
|
206
|
+
* @deprecated Returns a single primary credential blob (legacy "pick-the-
|
|
207
|
+
* default-connection" shape). Use `getGithubAccounts()` for the multi-
|
|
208
|
+
* account shape required by Pattern A — explicit selector args on every
|
|
209
|
+
* tool. Retained because the `@alfe.ai/openclaw-github` proxy is the
|
|
210
|
+
* only consumer that knows about Pattern A; legacy env-interpolation
|
|
211
|
+
* callers will keep hitting `/credentials` until they move to the proxy.
|
|
212
|
+
*/
|
|
205
213
|
getGithubCredentials(): Promise<{
|
|
206
214
|
login: string;
|
|
207
215
|
accessToken: string;
|
|
208
216
|
}>;
|
|
217
|
+
/**
|
|
218
|
+
* Pattern A: multi-account credential fetch for GitHub.
|
|
219
|
+
*
|
|
220
|
+
* Returns every agent-scoped GitHub connection. The caller is expected
|
|
221
|
+
* to require a `login` selector on every credential-touching tool and
|
|
222
|
+
* look up the matching account at dispatch time.
|
|
223
|
+
*
|
|
224
|
+
* GitHub OAuth tokens have no expiry (`tokenLifecycle: "no_expiry"`),
|
|
225
|
+
* so there is intentionally no `refreshGithubAccountToken` method — if
|
|
226
|
+
* a token is revoked the user must re-run the OAuth flow.
|
|
227
|
+
*
|
|
228
|
+
* Returned `accounts[i].login` is the GitHub username — the stable
|
|
229
|
+
* cross-session identifier the LLM should pass.
|
|
230
|
+
*/
|
|
231
|
+
getGithubAccounts(): Promise<{
|
|
232
|
+
accounts: {
|
|
233
|
+
connectionId: string;
|
|
234
|
+
accountIdentifier: string;
|
|
235
|
+
displayName: string | null;
|
|
236
|
+
connectedAt: string;
|
|
237
|
+
accessToken: string;
|
|
238
|
+
login: string;
|
|
239
|
+
scopes: string;
|
|
240
|
+
}[];
|
|
241
|
+
}>;
|
|
242
|
+
/**
|
|
243
|
+
* @deprecated Returns a single primary credential blob (legacy "pick-the-
|
|
244
|
+
* default-connection" shape). Use `getXeroAccounts()` for the multi-
|
|
245
|
+
* account shape required by Pattern A — explicit selector args on every
|
|
246
|
+
* tool. This method will be removed once all consumers migrate.
|
|
247
|
+
*/
|
|
209
248
|
getXeroCredentials(): Promise<{
|
|
210
249
|
accessToken: string;
|
|
211
250
|
accessTokenExpiresAt: string;
|
|
212
251
|
xeroTenantId: string;
|
|
213
252
|
}>;
|
|
253
|
+
/**
|
|
254
|
+
* Pattern A: multi-account credential fetch for Xero. Returns every
|
|
255
|
+
* agent-scoped Xero connection. The caller is expected to require a
|
|
256
|
+
* selector arg (e.g. `xeroTenantId`) on every credential-touching tool
|
|
257
|
+
* and look up the matching account by that selector at dispatch time.
|
|
258
|
+
*
|
|
259
|
+
* Returned `accounts[i].accountIdentifier` is the Xero tenantId — the
|
|
260
|
+
* stable cross-session identifier the LLM should pass.
|
|
261
|
+
*/
|
|
262
|
+
getXeroAccounts(): Promise<{
|
|
263
|
+
accounts: {
|
|
264
|
+
connectionId: string;
|
|
265
|
+
accountIdentifier: string;
|
|
266
|
+
displayName: string | null;
|
|
267
|
+
connectedAt: string;
|
|
268
|
+
accessToken: string;
|
|
269
|
+
accessTokenExpiresAt: string;
|
|
270
|
+
xeroTenantId: string;
|
|
271
|
+
}[];
|
|
272
|
+
}>;
|
|
214
273
|
refreshXeroToken(): Promise<{
|
|
215
274
|
accessToken: string;
|
|
216
275
|
expiresAt: string;
|
|
217
276
|
}>;
|
|
277
|
+
/**
|
|
278
|
+
* Pattern A: refresh a specific Xero connection by its `accountIdentifier`
|
|
279
|
+
* (the Xero `tenantId`). The legacy `refreshXeroToken()` only refreshes
|
|
280
|
+
* the *primary* connection, which is wrong for multi-tenant Xero where
|
|
281
|
+
* each tenant has its own non-interchangeable access token.
|
|
282
|
+
*/
|
|
283
|
+
refreshXeroAccountToken(xeroTenantId: string): Promise<{
|
|
284
|
+
accessToken: string;
|
|
285
|
+
accessTokenExpiresAt: string;
|
|
286
|
+
expiresAt: string;
|
|
287
|
+
}>;
|
|
288
|
+
/**
|
|
289
|
+
* @deprecated Returns a single primary credential blob (legacy "pick-the-
|
|
290
|
+
* default-connection" shape). Use `getNotionAccounts()` for the multi-
|
|
291
|
+
* account shape required by Pattern A.
|
|
292
|
+
*/
|
|
218
293
|
getNotionCredentials(): Promise<{
|
|
219
294
|
accessToken: string;
|
|
220
295
|
workspaceId: string;
|
|
221
296
|
workspaceName: string;
|
|
222
297
|
}>;
|
|
298
|
+
/**
|
|
299
|
+
* Pattern A: multi-account credential fetch for Notion. Returns every
|
|
300
|
+
* agent-scoped Notion connection. The caller is expected to require a
|
|
301
|
+
* selector arg (e.g. `workspaceId`) on every credential-touching tool.
|
|
302
|
+
*
|
|
303
|
+
* Returned `accounts[i].accountIdentifier` is the Notion workspaceId.
|
|
304
|
+
*/
|
|
305
|
+
getNotionAccounts(): Promise<{
|
|
306
|
+
accounts: {
|
|
307
|
+
connectionId: string;
|
|
308
|
+
accountIdentifier: string;
|
|
309
|
+
displayName: string | null;
|
|
310
|
+
connectedAt: string;
|
|
311
|
+
accessToken: string;
|
|
312
|
+
workspaceId: string;
|
|
313
|
+
workspaceName: string;
|
|
314
|
+
}[];
|
|
315
|
+
}>;
|
|
316
|
+
/**
|
|
317
|
+
* @deprecated Returns a single primary Atlassian Connection's credentials
|
|
318
|
+
* (one OAuth user, one cloudId) — the legacy "pick-the-default-connection"
|
|
319
|
+
* shape. Atlassian is multi-site by nature (each OAuth user may have
|
|
320
|
+
* access to multiple Cloud sites), so Pattern A plugins MUST use
|
|
321
|
+
* `getAtlassianAccounts()` to discover the full set and dispatch via
|
|
322
|
+
* the `cloudId` selector arg.
|
|
323
|
+
*/
|
|
223
324
|
getAtlassianCredentials(): Promise<{
|
|
224
325
|
accessToken: string;
|
|
225
326
|
refreshToken: string;
|
|
@@ -236,16 +337,177 @@ declare class AgentApiClient {
|
|
|
236
337
|
accessToken: string;
|
|
237
338
|
expiresAt: string;
|
|
238
339
|
}>;
|
|
340
|
+
/**
|
|
341
|
+
* Pattern A: multi-account / multi-site credential fetch for Atlassian.
|
|
342
|
+
*
|
|
343
|
+
* Returns every agent-scoped Atlassian Connection. Each Connection is
|
|
344
|
+
* one OAuth user with a single access token and N accessible Cloud
|
|
345
|
+
* sites (`availableSites`). The caller is expected to:
|
|
346
|
+
*
|
|
347
|
+
* 1. Flatten (connection × cloudId) into one MCP child per site.
|
|
348
|
+
* 2. Require a `cloudId` selector on every credential-touching tool.
|
|
349
|
+
* 3. Use the access token bound to the Connection that owns the
|
|
350
|
+
* requested `cloudId` (Atlassian shares one access token across
|
|
351
|
+
* all sites accessible to the OAuth user).
|
|
352
|
+
*
|
|
353
|
+
* Per-account token refresh uses `refreshAtlassianAccountToken(email)`
|
|
354
|
+
* — refreshing one Connection rotates its single access token, which
|
|
355
|
+
* then applies to every cloudId for that Connection.
|
|
356
|
+
*
|
|
357
|
+
* Returned `accounts[i].accountIdentifier` is the OAuth user's email
|
|
358
|
+
* — the stable cross-session identifier for refresh purposes. The LLM
|
|
359
|
+
* never sees this directly: it picks a site via the `cloudId` arg
|
|
360
|
+
* instead.
|
|
361
|
+
*/
|
|
362
|
+
getAtlassianAccounts(): Promise<{
|
|
363
|
+
accounts: {
|
|
364
|
+
connectionId: string;
|
|
365
|
+
accountIdentifier: string;
|
|
366
|
+
displayName: string | null;
|
|
367
|
+
connectedAt: string;
|
|
368
|
+
accessToken: string;
|
|
369
|
+
accessTokenExpiresAt: string;
|
|
370
|
+
clientId: string;
|
|
371
|
+
clientSecret: string;
|
|
372
|
+
cloudId: string;
|
|
373
|
+
siteName: string;
|
|
374
|
+
siteUrl: string;
|
|
375
|
+
availableSites: {
|
|
376
|
+
id: string;
|
|
377
|
+
url: string;
|
|
378
|
+
name: string;
|
|
379
|
+
scopes?: string[];
|
|
380
|
+
avatarUrl?: string;
|
|
381
|
+
}[];
|
|
382
|
+
}[];
|
|
383
|
+
}>;
|
|
384
|
+
/**
|
|
385
|
+
* Pattern A: refresh a specific Atlassian Connection by `accountIdentifier`
|
|
386
|
+
* (the OAuth user's email).
|
|
387
|
+
*
|
|
388
|
+
* Atlassian rotates refresh tokens (`rotatesRefreshToken: true`); the
|
|
389
|
+
* server-side per-account refresh endpoint handles rotation and
|
|
390
|
+
* persistence. Refreshing one Connection updates its single access
|
|
391
|
+
* token, which applies to every accessible Cloud site (cloudId) for
|
|
392
|
+
* that OAuth user.
|
|
393
|
+
*
|
|
394
|
+
* Returns the new access token + expiry. The proxy is responsible for
|
|
395
|
+
* fanning the new token out to every child server it spawned for
|
|
396
|
+
* cloudIds owned by this Connection.
|
|
397
|
+
*/
|
|
398
|
+
refreshAtlassianAccountToken(accountIdentifier: string): Promise<{
|
|
399
|
+
accessToken: string;
|
|
400
|
+
accessTokenExpiresAt: string;
|
|
401
|
+
expiresAt: string;
|
|
402
|
+
}>;
|
|
403
|
+
/**
|
|
404
|
+
* @deprecated Returns a single primary credential blob (legacy "pick-the-
|
|
405
|
+
* default-connection" shape). Use `getMYOBAccounts()` for the multi-
|
|
406
|
+
* account shape required by Pattern A.
|
|
407
|
+
*/
|
|
239
408
|
getMYOBCredentials(): Promise<{
|
|
240
409
|
accessToken: string;
|
|
241
410
|
accessTokenExpiresAt: string;
|
|
242
411
|
myobBusinessId: string;
|
|
243
412
|
clientId: string;
|
|
244
413
|
}>;
|
|
414
|
+
/**
|
|
415
|
+
* Pattern A: multi-account credential fetch for MYOB. Returns every
|
|
416
|
+
* agent-scoped MYOB connection. The caller is expected to require a
|
|
417
|
+
* selector arg (e.g. `myobBusinessId` / `accountIdentifier`) on every
|
|
418
|
+
* credential-touching tool.
|
|
419
|
+
*
|
|
420
|
+
* Returned `accounts[i].accountIdentifier` is the MYOB businessId.
|
|
421
|
+
*/
|
|
422
|
+
getMYOBAccounts(): Promise<{
|
|
423
|
+
accounts: {
|
|
424
|
+
connectionId: string;
|
|
425
|
+
accountIdentifier: string;
|
|
426
|
+
displayName: string | null;
|
|
427
|
+
connectedAt: string;
|
|
428
|
+
accessToken: string;
|
|
429
|
+
accessTokenExpiresAt: string;
|
|
430
|
+
myobBusinessId: string;
|
|
431
|
+
clientId: string;
|
|
432
|
+
}[];
|
|
433
|
+
}>;
|
|
245
434
|
refreshMYOBToken(): Promise<{
|
|
246
435
|
accessToken: string;
|
|
247
436
|
expiresAt: string;
|
|
248
437
|
}>;
|
|
438
|
+
/**
|
|
439
|
+
* Microsoft 365 (delegated OAuth) credential fetch — single-account shape.
|
|
440
|
+
*
|
|
441
|
+
* @deprecated Use `getMicrosoftAccounts()` and dispatch via the `email`
|
|
442
|
+
* selector once per-account plugins land. Retained because the existing
|
|
443
|
+
* `integrations/connect/microsoft/hooks/post_activate.mjs` writes
|
|
444
|
+
* `mgc` credentials for the single (default) Microsoft account.
|
|
445
|
+
*
|
|
446
|
+
* Returns the agent's effective Microsoft delegated-OAuth credentials.
|
|
447
|
+
* Distinct from `getTeamsCredentials()` (Azure bot credentials for the
|
|
448
|
+
* Teams adapter, which is admin-consent flow on services/microsoft, not
|
|
449
|
+
* delegated OAuth on services/connect).
|
|
450
|
+
*/
|
|
451
|
+
getMicrosoftCredentials(): Promise<{
|
|
452
|
+
accessToken: string;
|
|
453
|
+
accessTokenExpiresAt?: string;
|
|
454
|
+
refreshToken: string;
|
|
455
|
+
clientId: string;
|
|
456
|
+
clientSecret: string;
|
|
457
|
+
email?: string;
|
|
458
|
+
microsoftTenantId?: string;
|
|
459
|
+
workspaceDomain?: string;
|
|
460
|
+
}>;
|
|
461
|
+
/**
|
|
462
|
+
* Pattern A: multi-account credential fetch for Microsoft 365.
|
|
463
|
+
*
|
|
464
|
+
* Returns every agent-scoped Microsoft connection. The caller is expected
|
|
465
|
+
* to require an `email` selector on every credential-touching tool and
|
|
466
|
+
* look up the matching account at dispatch time.
|
|
467
|
+
*
|
|
468
|
+
* Returned `accounts[i].accountIdentifier` is the user's primary email
|
|
469
|
+
* (or the tid claim as fallback) — the stable cross-session identifier
|
|
470
|
+
* the LLM should pass.
|
|
471
|
+
*
|
|
472
|
+
* Per-account token refresh is exposed via `refreshMicrosoftAccountToken`,
|
|
473
|
+
* NOT `refreshXeroAccountToken` — Microsoft refresh tokens are not
|
|
474
|
+
* interchangeable across (tenant, user) pairs.
|
|
475
|
+
*/
|
|
476
|
+
getMicrosoftAccounts(): Promise<{
|
|
477
|
+
accounts: {
|
|
478
|
+
connectionId: string;
|
|
479
|
+
accountIdentifier: string;
|
|
480
|
+
displayName: string | null;
|
|
481
|
+
connectedAt: string;
|
|
482
|
+
accessToken: string;
|
|
483
|
+
accessTokenExpiresAt: string;
|
|
484
|
+
refreshToken: string;
|
|
485
|
+
clientId: string;
|
|
486
|
+
clientSecret: string;
|
|
487
|
+
email: string;
|
|
488
|
+
microsoftTenantId: string;
|
|
489
|
+
workspaceDomain: string;
|
|
490
|
+
}[];
|
|
491
|
+
}>;
|
|
492
|
+
/**
|
|
493
|
+
* Pattern A: refresh a specific Microsoft 365 connection by its
|
|
494
|
+
* `accountIdentifier`. For Microsoft, `accountIdentifier` is the user's
|
|
495
|
+
* email when the Graph profile fetch succeeded at connect time, and the
|
|
496
|
+
* Azure tenant id (`tid` claim) as fallback. Callers should pass the
|
|
497
|
+
* value returned by `getMicrosoftAccounts()` rather than synthesising
|
|
498
|
+
* an email locally.
|
|
499
|
+
*
|
|
500
|
+
* Microsoft refresh tokens are bound to a specific (tenant, user) pair —
|
|
501
|
+
* they are NOT interchangeable across accounts, so per-account refresh
|
|
502
|
+
* is mandatory. The generic /accounts/{accountIdentifier}/refresh
|
|
503
|
+
* endpoint walks the agent's full visible scope chain to find a matching
|
|
504
|
+
* connection (works for inherited team/project Microsoft connections).
|
|
505
|
+
*/
|
|
506
|
+
refreshMicrosoftAccountToken(accountIdentifier: string): Promise<{
|
|
507
|
+
accessToken: string;
|
|
508
|
+
accessTokenExpiresAt: string;
|
|
509
|
+
expiresAt: string;
|
|
510
|
+
}>;
|
|
249
511
|
getTeamsCredentials(): Promise<{
|
|
250
512
|
agentId: string;
|
|
251
513
|
tenantId: string;
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;AA8ES,UA/BQ,oBAAA,CA+BR;EAAM,MAAA,EAAA,MAAA;EAGE,MAAA,EAAA,MAAA;AAMjB;AAQiB,UAzCA,aAAA,CAyCmB;EAQnB,OAAA,EAAA,MAAA;EASA,QAAA,EAAA,MAAA;EAQA,WAAA,EAAA,MAAa;EASb,QAAA,EAAA,MAAA;EAQA,MAAA,EAAA,OAAA,GAAA,SAAkB,GAAA,QAAA;EAMlB,SAAA,CAAA,EAAA,MAAe;EAenB,SAAA,CAAA,EAAA,MAAc;EAAA,QAAA,CAAA,EAAA,MAAA;;AAiC6C,UA9HvD,iBAAA,CA8HuD;MAAjB,EAAA,MAAA;MAOpB,EAAA,MAAA;UAAR,EAAA,MAAA;MAML,CAAA,EAAA,MAAA;cAAhB,CAAA,EAAA,MAAA;YAYQ,CAAA,EAAA,OAAA;;AASA,UAvJG,YAAA,CAuJH;SAAR,EAAA,CAAA;SAO0B,EAAA,MAAA;UAAR,EAAA,MAAA;OAI4C,EA9J3D,MA8J2D,CAAA,MAAA,EA9J5C,iBA8J4C,CAAA;;AAOpB,UAlK/B,gBAAA,CAkK+B;MAApB,EAAA,MAAA;KAIuB,EAAA,MAAA;WAAR,EAAA,MAAA;;AAkBpB,UAlLN,mBAAA,CAkLM;UAAjB,EAAA,MAAA;MAUA,EAAA,MAAA;MAM8B,EAAA,MAAA;cAAR,EAAA,UAAA,GAAA,YAAA;UAIiC,EAAA,MAAA;;AAQjD,UAtMK,mBAAA,CAsML;MACP,EAAA,MAAA;MAYsC,EAAA,MAAA;KAC9B,EAAA,MAAA;cAAR,CAAA,EAAA,MAAA;YAWqD,CAAA,EAAA,OAAA;;AAUrD,UAjOY,qBAAA,CAiOZ;SAQyD,EAAA,MAAA;MAAzD,EAAA,MAAA,GAAA,QAAA,GAAA,QAAA;WAM0C,EAAA,MAAA;WAAxB,EAAA,MAAA;OAcS,EAxPvB,mBAwPuB,EAAA;WAoCgB,EAAA,MAAA;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":"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"}
|