@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 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;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":"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"}