agent-messenger 2.28.0 → 2.29.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.
Files changed (157) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +18 -1
  3. package/dist/package.json +1 -1
  4. package/dist/src/platforms/discord/client.d.ts +6 -2
  5. package/dist/src/platforms/discord/client.d.ts.map +1 -1
  6. package/dist/src/platforms/discord/client.js +10 -3
  7. package/dist/src/platforms/discord/client.js.map +1 -1
  8. package/dist/src/platforms/instagram/client.d.ts +24 -2
  9. package/dist/src/platforms/instagram/client.d.ts.map +1 -1
  10. package/dist/src/platforms/instagram/client.js +343 -53
  11. package/dist/src/platforms/instagram/client.js.map +1 -1
  12. package/dist/src/platforms/instagram/commands/auth.d.ts +1 -0
  13. package/dist/src/platforms/instagram/commands/auth.d.ts.map +1 -1
  14. package/dist/src/platforms/instagram/commands/auth.js +123 -11
  15. package/dist/src/platforms/instagram/commands/auth.js.map +1 -1
  16. package/dist/src/platforms/instagram/credential-manager.d.ts +4 -1
  17. package/dist/src/platforms/instagram/credential-manager.d.ts.map +1 -1
  18. package/dist/src/platforms/instagram/credential-manager.js +17 -1
  19. package/dist/src/platforms/instagram/credential-manager.js.map +1 -1
  20. package/dist/src/platforms/instagram/types.d.ts +10 -8
  21. package/dist/src/platforms/instagram/types.d.ts.map +1 -1
  22. package/dist/src/platforms/instagram/types.js.map +1 -1
  23. package/dist/src/platforms/teams/app-config.d.ts +36 -0
  24. package/dist/src/platforms/teams/app-config.d.ts.map +1 -0
  25. package/dist/src/platforms/teams/app-config.js +69 -0
  26. package/dist/src/platforms/teams/app-config.js.map +1 -0
  27. package/dist/src/platforms/teams/client.d.ts +19 -2
  28. package/dist/src/platforms/teams/client.d.ts.map +1 -1
  29. package/dist/src/platforms/teams/client.js +295 -7
  30. package/dist/src/platforms/teams/client.js.map +1 -1
  31. package/dist/src/platforms/teams/commands/auth.d.ts +10 -0
  32. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
  33. package/dist/src/platforms/teams/commands/auth.js +137 -3
  34. package/dist/src/platforms/teams/commands/auth.js.map +1 -1
  35. package/dist/src/platforms/teams/commands/file.d.ts +3 -0
  36. package/dist/src/platforms/teams/commands/file.d.ts.map +1 -1
  37. package/dist/src/platforms/teams/commands/file.js +59 -2
  38. package/dist/src/platforms/teams/commands/file.js.map +1 -1
  39. package/dist/src/platforms/teams/commands/message.d.ts +11 -0
  40. package/dist/src/platforms/teams/commands/message.d.ts.map +1 -1
  41. package/dist/src/platforms/teams/commands/message.js +121 -2
  42. package/dist/src/platforms/teams/commands/message.js.map +1 -1
  43. package/dist/src/platforms/teams/credential-manager.d.ts +23 -1
  44. package/dist/src/platforms/teams/credential-manager.d.ts.map +1 -1
  45. package/dist/src/platforms/teams/credential-manager.js +46 -2
  46. package/dist/src/platforms/teams/credential-manager.js.map +1 -1
  47. package/dist/src/platforms/teams/device-code.d.ts +48 -0
  48. package/dist/src/platforms/teams/device-code.d.ts.map +1 -0
  49. package/dist/src/platforms/teams/device-code.js +199 -0
  50. package/dist/src/platforms/teams/device-code.js.map +1 -0
  51. package/dist/src/platforms/teams/device-login.d.ts +37 -0
  52. package/dist/src/platforms/teams/device-login.d.ts.map +1 -0
  53. package/dist/src/platforms/teams/device-login.js +129 -0
  54. package/dist/src/platforms/teams/device-login.js.map +1 -0
  55. package/dist/src/platforms/teams/ensure-auth.d.ts.map +1 -1
  56. package/dist/src/platforms/teams/ensure-auth.js +12 -0
  57. package/dist/src/platforms/teams/ensure-auth.js.map +1 -1
  58. package/dist/src/platforms/teams/index.d.ts +7 -3
  59. package/dist/src/platforms/teams/index.d.ts.map +1 -1
  60. package/dist/src/platforms/teams/index.js +5 -2
  61. package/dist/src/platforms/teams/index.js.map +1 -1
  62. package/dist/src/platforms/teams/listener.d.ts +35 -0
  63. package/dist/src/platforms/teams/listener.d.ts.map +1 -0
  64. package/dist/src/platforms/teams/listener.js +236 -0
  65. package/dist/src/platforms/teams/listener.js.map +1 -0
  66. package/dist/src/platforms/teams/realm-discovery.d.ts +3 -0
  67. package/dist/src/platforms/teams/realm-discovery.d.ts.map +1 -0
  68. package/dist/src/platforms/teams/realm-discovery.js +33 -0
  69. package/dist/src/platforms/teams/realm-discovery.js.map +1 -0
  70. package/dist/src/platforms/teams/token-extractor.d.ts +3 -0
  71. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  72. package/dist/src/platforms/teams/token-extractor.js +60 -0
  73. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  74. package/dist/src/platforms/teams/token-provider.d.ts +25 -0
  75. package/dist/src/platforms/teams/token-provider.d.ts.map +1 -0
  76. package/dist/src/platforms/teams/token-provider.js +190 -0
  77. package/dist/src/platforms/teams/token-provider.js.map +1 -0
  78. package/dist/src/platforms/teams/trouter.d.ts +31 -0
  79. package/dist/src/platforms/teams/trouter.d.ts.map +1 -0
  80. package/dist/src/platforms/teams/trouter.js +181 -0
  81. package/dist/src/platforms/teams/trouter.js.map +1 -0
  82. package/dist/src/platforms/teams/types.d.ts +94 -0
  83. package/dist/src/platforms/teams/types.d.ts.map +1 -1
  84. package/dist/src/platforms/teams/types.js +30 -0
  85. package/dist/src/platforms/teams/types.js.map +1 -1
  86. package/dist/src/platforms/webex/types.d.ts +1 -1
  87. package/dist/src/tui/adapters/instagram-adapter.d.ts.map +1 -1
  88. package/dist/src/tui/adapters/instagram-adapter.js +16 -0
  89. package/dist/src/tui/adapters/instagram-adapter.js.map +1 -1
  90. package/dist/src/tui/adapters/teams-adapter.d.ts +3 -0
  91. package/dist/src/tui/adapters/teams-adapter.d.ts.map +1 -1
  92. package/dist/src/tui/adapters/teams-adapter.js +21 -0
  93. package/dist/src/tui/adapters/teams-adapter.js.map +1 -1
  94. package/dist/src/tui/app.js +3 -3
  95. package/docs/content/docs/cli/instagram.mdx +1 -0
  96. package/docs/content/docs/cli/teams.mdx +22 -0
  97. package/package.json +1 -1
  98. package/skills/agent-channeltalk/SKILL.md +1 -1
  99. package/skills/agent-channeltalkbot/SKILL.md +1 -1
  100. package/skills/agent-discord/SKILL.md +1 -1
  101. package/skills/agent-discordbot/SKILL.md +1 -1
  102. package/skills/agent-imessage/SKILL.md +1 -1
  103. package/skills/agent-instagram/SKILL.md +1 -1
  104. package/skills/agent-instagram/references/authentication.md +11 -0
  105. package/skills/agent-kakaotalk/SKILL.md +1 -1
  106. package/skills/agent-line/SKILL.md +1 -1
  107. package/skills/agent-slack/SKILL.md +1 -1
  108. package/skills/agent-slackbot/SKILL.md +1 -1
  109. package/skills/agent-teams/SKILL.md +59 -6
  110. package/skills/agent-teams/references/authentication.md +31 -1
  111. package/skills/agent-telegram/SKILL.md +1 -1
  112. package/skills/agent-telegrambot/SKILL.md +1 -1
  113. package/skills/agent-webex/SKILL.md +1 -1
  114. package/skills/agent-webexbot/SKILL.md +1 -1
  115. package/skills/agent-wechatbot/SKILL.md +1 -1
  116. package/skills/agent-whatsapp/SKILL.md +1 -1
  117. package/skills/agent-whatsappbot/SKILL.md +1 -1
  118. package/src/platforms/discord/client.test.ts +86 -0
  119. package/src/platforms/discord/client.ts +10 -3
  120. package/src/platforms/instagram/client.test.ts +478 -33
  121. package/src/platforms/instagram/client.ts +449 -68
  122. package/src/platforms/instagram/commands/auth.test.ts +177 -1
  123. package/src/platforms/instagram/commands/auth.ts +182 -11
  124. package/src/platforms/instagram/credential-manager.test.ts +30 -0
  125. package/src/platforms/instagram/credential-manager.ts +23 -1
  126. package/src/platforms/instagram/types.ts +11 -8
  127. package/src/platforms/teams/app-config.ts +92 -0
  128. package/src/platforms/teams/client.test.ts +335 -1
  129. package/src/platforms/teams/client.ts +342 -7
  130. package/src/platforms/teams/commands/auth.test.ts +93 -1
  131. package/src/platforms/teams/commands/auth.ts +182 -3
  132. package/src/platforms/teams/commands/file.test.ts +92 -1
  133. package/src/platforms/teams/commands/file.ts +76 -1
  134. package/src/platforms/teams/commands/message.test.ts +95 -1
  135. package/src/platforms/teams/commands/message.ts +145 -3
  136. package/src/platforms/teams/credential-manager.test.ts +20 -0
  137. package/src/platforms/teams/credential-manager.ts +68 -3
  138. package/src/platforms/teams/device-code.test.ts +311 -0
  139. package/src/platforms/teams/device-code.ts +277 -0
  140. package/src/platforms/teams/device-login.test.ts +288 -0
  141. package/src/platforms/teams/device-login.ts +206 -0
  142. package/src/platforms/teams/ensure-auth.ts +11 -0
  143. package/src/platforms/teams/index.test.ts +10 -0
  144. package/src/platforms/teams/index.ts +16 -1
  145. package/src/platforms/teams/listener.ts +295 -0
  146. package/src/platforms/teams/realm-discovery.test.ts +73 -0
  147. package/src/platforms/teams/realm-discovery.ts +42 -0
  148. package/src/platforms/teams/token-extractor.ts +69 -0
  149. package/src/platforms/teams/token-provider.test.ts +227 -0
  150. package/src/platforms/teams/token-provider.ts +284 -0
  151. package/src/platforms/teams/trouter.test.ts +114 -0
  152. package/src/platforms/teams/trouter.ts +228 -0
  153. package/src/platforms/teams/types.test.ts +17 -0
  154. package/src/platforms/teams/types.ts +86 -0
  155. package/src/tui/adapters/instagram-adapter.ts +13 -0
  156. package/src/tui/adapters/teams-adapter.ts +23 -0
  157. package/src/tui/app.ts +3 -3
@@ -1,4 +1,4 @@
1
- import type { TeamsAccount, TeamsAccountType, TeamsConfig, TeamsRegion } from './types.js';
1
+ import type { TeamsAccount, TeamsAccountType, TeamsAuthMethod, TeamsConfig, TeamsRegion } from './types.js';
2
2
  export declare class TeamsCredentialManager {
3
3
  static accountOverride?: TeamsAccountType;
4
4
  private configDir;
@@ -18,6 +18,28 @@ export declare class TeamsCredentialManager {
18
18
  region?: TeamsRegion;
19
19
  } | null>;
20
20
  setToken(token: string, accountType: TeamsAccountType, expiresAt?: string): Promise<void>;
21
+ setDeviceCodeAccount(params: {
22
+ accountType: TeamsAccountType;
23
+ token: string;
24
+ tokenExpiresAt: string;
25
+ aadRefreshToken?: string;
26
+ aadClientId?: string;
27
+ aadTenantId?: string;
28
+ region?: TeamsRegion;
29
+ userName?: string;
30
+ teams: Record<string, {
31
+ team_id: string;
32
+ team_name: string;
33
+ }>;
34
+ currentTeam: string | null;
35
+ authMethod?: TeamsAuthMethod;
36
+ makeCurrent?: boolean;
37
+ }): Promise<void>;
38
+ getAadRefresh(accountType: TeamsAccountType): Promise<{
39
+ refreshToken: string;
40
+ clientId?: string;
41
+ } | null>;
42
+ updateAadRefreshToken(accountType: TeamsAccountType, refreshToken: string, clientId?: string): Promise<void>;
21
43
  getCurrentTeam(): Promise<{
22
44
  team_id: string;
23
45
  team_name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../../../../src/platforms/teams/credential-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAqB,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1G,qBAAa,sBAAsB;IACjC,MAAM,CAAC,eAAe,CAAC,EAAE,gBAAgB,CAAA;IAEzC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAAQ;gBAEnB,SAAS,CAAC,EAAE,MAAM;IAKxB,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAczC,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,iBAAiB;IAInB,iBAAiB,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQvD,OAAO,CAAC,qBAAqB;IAMvB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMlC,kBAAkB,IAAI,OAAO,CAAC;QAClC,KAAK,EAAE,MAAM,CAAA;QACb,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,WAAW,CAAC,EAAE,gBAAgB,CAAA;QAC9B,MAAM,CAAC,EAAE,WAAW,CAAA;KACrB,GAAG,IAAI,CAAC;IAaH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBzF,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAQxE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/D,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAOzD,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAKpD,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAQlC,qBAAqB,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CAO7E"}
1
+ {"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../../../../src/platforms/teams/credential-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,EAEX,WAAW,EACZ,MAAM,SAAS,CAAA;AAEhB,qBAAa,sBAAsB;IACjC,MAAM,CAAC,eAAe,CAAC,EAAE,gBAAgB,CAAA;IAEzC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAAQ;gBAEnB,SAAS,CAAC,EAAE,MAAM;IAKxB,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAczC,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpD,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,iBAAiB;IAInB,iBAAiB,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQvD,OAAO,CAAC,qBAAqB;IAMvB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMlC,kBAAkB,IAAI,OAAO,CAAC;QAClC,KAAK,EAAE,MAAM,CAAA;QACb,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,WAAW,CAAC,EAAE,gBAAgB,CAAA;QAC9B,MAAM,CAAC,EAAE,WAAW,CAAA;KACrB,GAAG,IAAI,CAAC;IAaH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBzF,oBAAoB,CAAC,MAAM,EAAE;QACjC,WAAW,EAAE,gBAAgB,CAAA;QAC7B,KAAK,EAAE,MAAM,CAAA;QACb,cAAc,EAAE,MAAM,CAAA;QACtB,eAAe,CAAC,EAAE,MAAM,CAAA;QACxB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,MAAM,CAAC,EAAE,WAAW,CAAA;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QAC7D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;QAC1B,UAAU,CAAC,EAAE,eAAe,CAAA;QAC5B,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBX,aAAa,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAOzG,qBAAqB,CAAC,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5G,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAQxE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/D,qBAAqB,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAOzD,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAKpD,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAQlC,qBAAqB,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CAO7E"}
@@ -1,5 +1,5 @@
1
1
  import { existsSync } from 'node:fs';
2
- import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
2
+ import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
4
  import { getConfigDir } from '../../shared/utils/config-dir.js';
5
5
  export class TeamsCredentialManager {
@@ -25,7 +25,9 @@ export class TeamsCredentialManager {
25
25
  }
26
26
  async saveConfig(config) {
27
27
  await mkdir(this.configDir, { recursive: true });
28
- await writeFile(this.credentialsPath, JSON.stringify(config, null, 2), { mode: 0o600 });
28
+ const tmpPath = `${this.credentialsPath}.tmp`;
29
+ await writeFile(tmpPath, JSON.stringify(config, null, 2), { mode: 0o600 });
30
+ await rename(tmpPath, this.credentialsPath);
29
31
  }
30
32
  migrateIfNeeded(raw) {
31
33
  if ('accounts' in raw && raw.accounts) {
@@ -101,6 +103,48 @@ export class TeamsCredentialManager {
101
103
  }
102
104
  await this.saveConfig(config);
103
105
  }
106
+ async setDeviceCodeAccount(params) {
107
+ let config = await this.loadConfig();
108
+ if (!config) {
109
+ config = { current_account: params.accountType, accounts: {} };
110
+ }
111
+ const existing = config.accounts[params.accountType];
112
+ config.accounts[params.accountType] = {
113
+ token: params.token,
114
+ token_expires_at: params.tokenExpiresAt,
115
+ region: params.region ?? existing?.region,
116
+ account_type: params.accountType,
117
+ user_name: params.userName ?? existing?.user_name,
118
+ current_team: params.currentTeam,
119
+ teams: params.teams,
120
+ auth_method: params.authMethod ?? 'device-code',
121
+ aad_refresh_token: params.aadRefreshToken,
122
+ aad_client_id: params.aadClientId,
123
+ aad_tenant_id: params.aadTenantId ?? existing?.aad_tenant_id,
124
+ };
125
+ if (params.makeCurrent ?? true) {
126
+ config.current_account = params.accountType;
127
+ }
128
+ await this.saveConfig(config);
129
+ }
130
+ async getAadRefresh(accountType) {
131
+ const config = await this.loadConfig();
132
+ const account = config?.accounts[accountType];
133
+ if (!account?.aad_refresh_token)
134
+ return null;
135
+ return { refreshToken: account.aad_refresh_token, clientId: account.aad_client_id };
136
+ }
137
+ async updateAadRefreshToken(accountType, refreshToken, clientId) {
138
+ const config = await this.loadConfig();
139
+ const account = config?.accounts[accountType];
140
+ if (!config || !account)
141
+ return;
142
+ account.aad_refresh_token = refreshToken;
143
+ if (clientId !== undefined) {
144
+ account.aad_client_id = clientId;
145
+ }
146
+ await this.saveConfig(config);
147
+ }
104
148
  async getCurrentTeam() {
105
149
  const config = await this.loadConfig();
106
150
  if (!config)
@@ -1 +1 @@
1
- {"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../../../src/platforms/teams/credential-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../../../src/platforms/teams/credential-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAU5D,MAAM,OAAO,sBAAsB;IACjC,MAAM,CAAC,eAAe,CAAmB;IAEjC,SAAS,CAAQ;IACjB,eAAe,CAAQ;IAE/B,YAAY,SAAkB;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,YAAY,EAAE,CAAA;QAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAA;IACvE,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAA;YAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAmB;QAClC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAChD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,eAAe,MAAM,CAAA;QAC7C,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC1E,MAAM,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;IAC7C,CAAC;IAEO,eAAe,CAAC,GAAoC;QAC1D,IAAI,UAAU,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACtC,OAAO,GAAkB,CAAA;QAC3B,CAAC;QAED,MAAM,MAAM,GAAG,GAAwB,CAAA;QACvC,MAAM,OAAO,GAAiB;YAC5B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,YAAY,EAAE,MAAM;YACpB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAA;QACD,OAAO;YACL,eAAe,EAAE,MAAM;YACvB,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;SAC5B,CAAA;IACH,CAAC;IAEO,iBAAiB,CAAC,MAAmB;QAC3C,OAAO,sBAAsB,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAA;IACzE,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAC1C,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACrB,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAA;IACrC,CAAC;IAEO,qBAAqB,CAAC,MAAmB;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAC1C,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACrB,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,IAAI,CAAA;IAC1D,CAAC;IAED,KAAK,CAAC,kBAAkB;QAMtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,EAAE,KAAK;YAAE,OAAO,IAAI,CAAA;QAChC,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,cAAc,EAAE,OAAO,CAAC,gBAAgB;YACxC,WAAW,EAAE,OAAO,CAAC,YAAY;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,WAA6B,EAAE,SAAkB;QAC7E,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACpC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;QACzD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QAC7C,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG;YAC7B,KAAK;YACL,gBAAgB,EAAE,SAAS;YAC3B,YAAY,EAAE,WAAW;YACzB,SAAS,EAAE,QAAQ,EAAE,SAAS;YAC9B,YAAY,EAAE,QAAQ,EAAE,YAAY,IAAI,IAAI;YAC5C,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE;SAC7B,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC5B,MAAM,CAAC,eAAe,GAAG,WAAW,CAAA;QACtC,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,MAa1B;QACC,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACpC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,EAAE,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;QAChE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QACpD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG;YACpC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,gBAAgB,EAAE,MAAM,CAAC,cAAc;YACvC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,QAAQ,EAAE,MAAM;YACzC,YAAY,EAAE,MAAM,CAAC,WAAW;YAChC,SAAS,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ,EAAE,SAAS;YACjD,YAAY,EAAE,MAAM,CAAC,WAAW;YAChC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,MAAM,CAAC,UAAU,IAAI,aAAa;YAC/C,iBAAiB,EAAE,MAAM,CAAC,eAAe;YACzC,aAAa,EAAE,MAAM,CAAC,WAAW;YACjC,aAAa,EAAE,MAAM,CAAC,WAAW,IAAI,QAAQ,EAAE,aAAa;SAC7D,CAAA;QACD,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAC/B,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,WAAW,CAAA;QAC7C,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAA6B;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,MAAM,OAAO,GAAG,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO,EAAE,iBAAiB;YAAE,OAAO,IAAI,CAAA;QAC5C,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,iBAAiB,EAAE,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,CAAA;IACrF,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,WAA6B,EAAE,YAAoB,EAAE,QAAiB;QAChG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,MAAM,OAAO,GAAG,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;QAC7C,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;YAAE,OAAM;QAC/B,OAAO,CAAC,iBAAiB,GAAG,YAAY,CAAA;QACxC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,CAAC,aAAa,GAAG,QAAQ,CAAA;QAClC,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,EAAE,YAAY;YAAE,OAAO,IAAI,CAAA;QACvC,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,IAAI,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,QAAgB;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAA;QAC7B,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;QAChE,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAC1C,OAAQ,GAAwB,IAAI,IAAI,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,WAA6B;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,OAAM;QACzC,MAAM,CAAC,eAAe,GAAG,WAAW,CAAA;QACpC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,OAAO,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,IAAI,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YACrC,MAAM,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,EAAE,gBAAgB;YAAE,OAAO,IAAI,CAAA;QAC3C,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAA;IACnE,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,WAA6B;QACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO,EAAE,gBAAgB;YAAE,OAAO,IAAI,CAAA;QAC3C,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAA;IACnE,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import type { TeamsAccountType, TeamsRegion } from './types.js';
2
+ export interface TeamsTenant {
3
+ tenantId: string;
4
+ tenantName?: string;
5
+ isInvitationRedeemed?: boolean;
6
+ }
7
+ export interface DeviceCodeInfo {
8
+ deviceCode: string;
9
+ userCode: string;
10
+ verificationUri: string;
11
+ verificationUriComplete: string;
12
+ expiresIn: number;
13
+ interval: number;
14
+ }
15
+ export interface AadToken {
16
+ accessToken: string;
17
+ refreshToken?: string;
18
+ }
19
+ export interface MintedSkypeToken {
20
+ skypeToken: string;
21
+ skypeTokenExpiresAt: string;
22
+ region?: TeamsRegion;
23
+ }
24
+ export type DeviceTokenResult = {
25
+ status: 'success';
26
+ token: AadToken;
27
+ } | {
28
+ status: 'pending';
29
+ } | {
30
+ status: 'slow_down';
31
+ } | {
32
+ status: 'expired';
33
+ } | {
34
+ status: 'declined';
35
+ } | {
36
+ status: 'error';
37
+ message: string;
38
+ };
39
+ export declare function requestDeviceCode(clientId: string, accountType?: TeamsAccountType): Promise<DeviceCodeInfo>;
40
+ export declare function exchangeDeviceCode(deviceCode: string, clientId: string, accountType?: TeamsAccountType): Promise<DeviceTokenResult>;
41
+ export declare function pollDeviceToken(deviceCode: string, interval: number, expiresIn: number, clientId: string, accountType?: TeamsAccountType): Promise<AadToken>;
42
+ export declare function exchangeForSkypeScope(refreshToken: string, clientId: string, accountType?: TeamsAccountType, tenantId?: string): Promise<AadToken>;
43
+ export declare function resolveWorkTenantId(accessToken: string): Promise<string>;
44
+ export declare function decodeJwtTid(token: string): string | undefined;
45
+ export declare function isConsumerTenant(tenantId: string): boolean;
46
+ export declare function mintSkypeToken(spacesAccessToken: string, accountType?: TeamsAccountType): Promise<MintedSkypeToken>;
47
+ export declare function mintConsumerSkypeToken(spacesAccessToken: string): Promise<MintedSkypeToken>;
48
+ //# sourceMappingURL=device-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-code.d.ts","sourceRoot":"","sources":["../../../../src/platforms/teams/device-code.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAK5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,uBAAuB,EAAE,MAAM,CAAA;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACtB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAexC,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,gBAA6B,GACzC,OAAO,CAAC,cAAc,CAAC,CAkBzB;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,gBAA6B,GACzC,OAAO,CAAC,iBAAiB,CAAC,CAkB5B;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,gBAA6B,GACzC,OAAO,CAAC,QAAQ,CAAC,CAiBnB;AAED,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,gBAA6B,EAC1C,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAcnB;AAMD,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB9E;AAyBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS9D;AAMD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAMD,wBAAsB,cAAc,CAClC,iBAAiB,EAAE,MAAM,EACzB,WAAW,GAAE,gBAA6B,GACzC,OAAO,CAAC,gBAAgB,CAAC,CAqB3B;AAED,wBAAsB,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEjG"}
@@ -0,0 +1,199 @@
1
+ import { authzUrl, CONSUMER_TENANT_ID, deviceCodeSkypeScope, deviceCodeTeamsScope, deviceCodeTokenUrl, deviceCodeUrl, MICROSOFT_SERVICES_TENANT_ID, TEAMS_TENANTS_URL, WORK_TENANT_ID, } from './app-config.js';
2
+ import { TeamsError } from './types.js';
3
+ const DEFAULT_SKYPE_TOKEN_TTL_SEC = 21600;
4
+ async function postForm(url, params) {
5
+ const res = await fetch(url, {
6
+ method: 'POST',
7
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
8
+ body: new URLSearchParams(params),
9
+ });
10
+ const body = (await res.json().catch(() => ({})));
11
+ return { status: res.status, body };
12
+ }
13
+ export async function requestDeviceCode(clientId, accountType = 'personal') {
14
+ const { status, body } = await postForm(deviceCodeUrl(accountType), {
15
+ client_id: clientId,
16
+ scope: deviceCodeTeamsScope(accountType),
17
+ });
18
+ if (status !== 200) {
19
+ throw new TeamsError(`Device code request failed: ${describeAadError(body, status)}`, 'device_code_failed');
20
+ }
21
+ const userCode = String(body.user_code ?? '');
22
+ const verificationUri = String(body.verification_uri ?? 'https://microsoft.com/devicelogin');
23
+ return {
24
+ deviceCode: String(body.device_code ?? ''),
25
+ userCode,
26
+ verificationUri,
27
+ verificationUriComplete: `${verificationUri}?otc=${encodeURIComponent(userCode)}`,
28
+ expiresIn: Number(body.expires_in ?? 900),
29
+ interval: Number(body.interval ?? 5),
30
+ };
31
+ }
32
+ export async function exchangeDeviceCode(deviceCode, clientId, accountType = 'personal') {
33
+ const { status, body } = await postForm(deviceCodeTokenUrl(accountType), {
34
+ client_id: clientId,
35
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
36
+ device_code: deviceCode,
37
+ });
38
+ if (status === 200) {
39
+ return {
40
+ status: 'success',
41
+ token: { accessToken: String(body.access_token), refreshToken: body.refresh_token },
42
+ };
43
+ }
44
+ const error = String(body.error ?? '');
45
+ if (error === 'authorization_pending')
46
+ return { status: 'pending' };
47
+ if (error === 'slow_down')
48
+ return { status: 'slow_down' };
49
+ if (error === 'expired_token')
50
+ return { status: 'expired' };
51
+ if (error === 'authorization_declined')
52
+ return { status: 'declined' };
53
+ return { status: 'error', message: describeAadError(body, status) };
54
+ }
55
+ export async function pollDeviceToken(deviceCode, interval, expiresIn, clientId, accountType = 'personal') {
56
+ const deadline = Date.now() + expiresIn * 1000;
57
+ let waitMs = Math.max(interval, 1) * 1000;
58
+ while (Date.now() < deadline) {
59
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
60
+ const result = await exchangeDeviceCode(deviceCode, clientId, accountType);
61
+ if (result.status === 'success')
62
+ return result.token;
63
+ if (result.status === 'slow_down') {
64
+ waitMs += 5000;
65
+ continue;
66
+ }
67
+ if (result.status === 'pending')
68
+ continue;
69
+ if (result.status === 'expired')
70
+ throw new TeamsError('Device code expired before approval.', 'device_code_expired');
71
+ if (result.status === 'declined')
72
+ throw new TeamsError('Authorization was declined.', 'device_code_declined');
73
+ throw new TeamsError(`Device authorization failed: ${result.message}`, 'device_code_failed');
74
+ }
75
+ throw new TeamsError('Device code expired before approval.', 'device_code_expired');
76
+ }
77
+ export async function exchangeForSkypeScope(refreshToken, clientId, accountType = 'personal', tenantId) {
78
+ const { status, body } = await postForm(deviceCodeTokenUrl(accountType, tenantId), {
79
+ client_id: clientId,
80
+ grant_type: 'refresh_token',
81
+ refresh_token: refreshToken,
82
+ scope: deviceCodeSkypeScope(accountType),
83
+ });
84
+ if (status !== 200) {
85
+ throw new TeamsError(`Token exchange failed: ${describeAadError(body, status)}`, 'token_exchange_failed');
86
+ }
87
+ return {
88
+ accessToken: String(body.access_token),
89
+ refreshToken: body.refresh_token ?? refreshToken,
90
+ };
91
+ }
92
+ // Work logins go through the `organizations` authority, so the token's `tid` is
93
+ // a placeholder, not a real tenant GUID. The skype authz endpoint then rejects
94
+ // it with `GuestUserNotRedeemed`. Resolving the concrete tenant lets the
95
+ // skype-scope exchange target the tenant-specific authority and succeed.
96
+ export async function resolveWorkTenantId(accessToken) {
97
+ const claimTid = decodeJwtTid(accessToken);
98
+ if (claimTid && !isPlaceholderTenant(claimTid))
99
+ return claimTid;
100
+ const tenants = await fetchTenants(accessToken);
101
+ const redeemed = tenants.find((tenant) => tenant.isInvitationRedeemed !== false) ?? tenants[0];
102
+ if (!redeemed) {
103
+ throw new TeamsError('No Microsoft Teams tenant is associated with this account. If this is a personal Microsoft account, run `agent-teams auth login --account-type personal`.', 'teams_tenant_missing');
104
+ }
105
+ if (redeemed.isInvitationRedeemed === false) {
106
+ throw new TeamsError('This Microsoft Teams guest invitation has not been accepted yet. Accept the invite in Teams, then run `agent-teams auth login` again.', 'teams_invitation_not_redeemed');
107
+ }
108
+ return redeemed.tenantId;
109
+ }
110
+ async function fetchTenants(accessToken) {
111
+ const res = await fetch(TEAMS_TENANTS_URL, { headers: { Authorization: `Bearer ${accessToken}` } });
112
+ if (!res.ok) {
113
+ throw new TeamsError(`Tenant discovery failed: HTTP ${res.status}`, 'tenant_discovery_failed');
114
+ }
115
+ const body = (await res.json().catch(() => []));
116
+ const rows = Array.isArray(body) ? body : [];
117
+ return rows
118
+ .map((row) => {
119
+ if (typeof row !== 'object' || row === null)
120
+ return null;
121
+ const record = row;
122
+ const tenantId = record.tenantId;
123
+ if (typeof tenantId !== 'string' || !tenantId)
124
+ return null;
125
+ return {
126
+ tenantId,
127
+ tenantName: typeof record.tenantName === 'string' ? record.tenantName : undefined,
128
+ isInvitationRedeemed: typeof record.isInvitationRedeemed === 'boolean' ? record.isInvitationRedeemed : undefined,
129
+ };
130
+ })
131
+ .filter((tenant) => tenant !== null);
132
+ }
133
+ export function decodeJwtTid(token) {
134
+ const payload = token.split('.')[1];
135
+ if (!payload)
136
+ return undefined;
137
+ try {
138
+ const claims = JSON.parse(Buffer.from(payload, 'base64url').toString('utf8'));
139
+ return typeof claims.tid === 'string' ? claims.tid : undefined;
140
+ }
141
+ catch {
142
+ return undefined;
143
+ }
144
+ }
145
+ // The consumer tenant unambiguously marks a personal account: it has no org
146
+ // tenant, so a work login carrying it can never resolve a Teams tenant. The
147
+ // Microsoft Services placeholder is intentionally excluded — it also appears on
148
+ // legitimate work tokens, which resolveWorkTenantId() resolves via discovery.
149
+ export function isConsumerTenant(tenantId) {
150
+ return tenantId === CONSUMER_TENANT_ID;
151
+ }
152
+ function isPlaceholderTenant(tenantId) {
153
+ return tenantId === WORK_TENANT_ID || tenantId === CONSUMER_TENANT_ID || tenantId === MICROSOFT_SERVICES_TENANT_ID;
154
+ }
155
+ export async function mintSkypeToken(spacesAccessToken, accountType = 'personal') {
156
+ const res = await fetch(authzUrl(accountType), {
157
+ method: 'POST',
158
+ headers: { Authorization: `Bearer ${spacesAccessToken}`, Accept: 'application/json; ver=1.0' },
159
+ });
160
+ const body = (await res.json().catch(() => ({})));
161
+ if (!res.ok) {
162
+ throw new TeamsError(`Failed to mint skype token: ${describeAuthzError(body, res.status)}`, 'skype_token_failed');
163
+ }
164
+ const nested = body.skypeToken;
165
+ const flat = body.tokens;
166
+ const skypeToken = nested?.skypetoken ?? flat?.skypeToken;
167
+ if (!skypeToken) {
168
+ throw new TeamsError('Consumer authz response did not contain a skype token.', 'skype_token_missing');
169
+ }
170
+ const ttlSec = nested?.skypeTokenExpiresIn ?? flat?.expiresIn ?? DEFAULT_SKYPE_TOKEN_TTL_SEC;
171
+ return {
172
+ skypeToken,
173
+ skypeTokenExpiresAt: new Date(Date.now() + ttlSec * 1000).toISOString(),
174
+ region: parseRegion(body),
175
+ };
176
+ }
177
+ export async function mintConsumerSkypeToken(spacesAccessToken) {
178
+ return mintSkypeToken(spacesAccessToken, 'personal');
179
+ }
180
+ function describeAadError(body, status) {
181
+ const desc = body.error_description ?? body.error;
182
+ return typeof desc === 'string' ? desc.split('\n')[0] : `HTTP ${status}`;
183
+ }
184
+ function describeAuthzError(body, status) {
185
+ const statusObj = body.status;
186
+ const code = String(body.errorCode ?? body.message ?? statusObj?.text ?? `HTTP ${status}`);
187
+ if (code === 'GuestUserNotRedeemed') {
188
+ return `${code} (the account has no redeemed Teams tenant — if this is a personal account, run \`agent-teams auth login --account-type personal\`; if you are a guest, accept the Teams invite first)`;
189
+ }
190
+ return code;
191
+ }
192
+ function parseRegion(body) {
193
+ const regionGtms = body.regionGtms;
194
+ const raw = regionGtms?.region ?? regionGtms?.middleTier ?? regionGtms?.mt;
195
+ if (raw === 'amer' || raw === 'emea' || raw === 'apac')
196
+ return raw;
197
+ return undefined;
198
+ }
199
+ //# sourceMappingURL=device-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-code.js","sourceRoot":"","sources":["../../../../src/platforms/teams/device-code.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,4BAA4B,EAC5B,iBAAiB,EACjB,cAAc,GACf,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,MAAM,2BAA2B,GAAG,KAAK,CAAA;AAoCzC,KAAK,UAAU,QAAQ,CACrB,GAAW,EACX,MAA8B;IAE9B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,IAAI,eAAe,CAAC,MAAM,CAAC;KAClC,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAA;IAC5E,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,cAAgC,UAAU;IAE1C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE;QAClE,SAAS,EAAE,QAAQ;QACnB,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC;KACzC,CAAC,CAAA;IACF,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAAC,+BAA+B,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAA;IAC7G,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAA;IAC7C,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAI,mCAAmC,CAAC,CAAA;IAC5F,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QAC1C,QAAQ;QACR,eAAe;QACf,uBAAuB,EAAE,GAAG,eAAe,QAAQ,kBAAkB,CAAC,QAAQ,CAAC,EAAE;QACjF,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC;QACzC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;KACrC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,QAAgB,EAChB,cAAgC,UAAU;IAE1C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE;QACvE,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,8CAA8C;QAC1D,WAAW,EAAE,UAAU;KACxB,CAAC,CAAA;IACF,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,aAAmC,EAAE;SAC1G,CAAA;IACH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IACtC,IAAI,KAAK,KAAK,uBAAuB;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACnE,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;IACzD,IAAI,KAAK,KAAK,eAAe;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC3D,IAAI,KAAK,KAAK,wBAAwB;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;IACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAA;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,QAAgB,EAChB,SAAiB,EACjB,QAAgB,EAChB,cAAgC,UAAU;IAE1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAA;IAC9C,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,IAAI,CAAA;IACzC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;QAC3D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;QAC1E,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,KAAK,CAAA;QACpD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,IAAI,CAAA;YACd,SAAQ;QACV,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,SAAQ;QACzC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,UAAU,CAAC,sCAAsC,EAAE,qBAAqB,CAAC,CAAA;QACpH,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;YAAE,MAAM,IAAI,UAAU,CAAC,6BAA6B,EAAE,sBAAsB,CAAC,CAAA;QAC7G,MAAM,IAAI,UAAU,CAAC,gCAAgC,MAAM,CAAC,OAAO,EAAE,EAAE,oBAAoB,CAAC,CAAA;IAC9F,CAAC;IACD,MAAM,IAAI,UAAU,CAAC,sCAAsC,EAAE,qBAAqB,CAAC,CAAA;AACrF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,YAAoB,EACpB,QAAgB,EAChB,cAAgC,UAAU,EAC1C,QAAiB;IAEjB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE;QACjF,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,eAAe;QAC3B,aAAa,EAAE,YAAY;QAC3B,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC;KACzC,CAAC,CAAA;IACF,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAAC,0BAA0B,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAA;IAC3G,CAAC;IACD,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;QACtC,YAAY,EAAG,IAAI,CAAC,aAAoC,IAAI,YAAY;KACzE,CAAA;AACH,CAAC;AAED,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AACzE,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAC3D,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,CAAA;IAC1C,IAAI,QAAQ,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAA;IAE/D,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,oBAAoB,KAAK,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAA;IAC9F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,UAAU,CAClB,2JAA2J,EAC3J,sBAAsB,CACvB,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,oBAAoB,KAAK,KAAK,EAAE,CAAC;QAC5C,MAAM,IAAI,UAAU,CAClB,uIAAuI,EACvI,+BAA+B,CAChC,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAA;AAC1B,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,WAAmB;IAC7C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;IACnG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,UAAU,CAAC,iCAAiC,GAAG,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAA;IAChG,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAY,CAAA;IAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5C,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAsB,EAAE;QAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QACxD,MAAM,MAAM,GAAG,GAA8B,CAAA;QAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;QAChC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAA;QAC1D,OAAO;YACL,QAAQ;YACR,UAAU,EAAE,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACjF,oBAAoB,EAClB,OAAO,MAAM,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS;SAC7F,CAAA;IACH,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,MAAM,EAAyB,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAsB,CAAA;QAClG,OAAO,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,4EAA4E;AAC5E,gFAAgF;AAChF,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,QAAQ,KAAK,kBAAkB,CAAA;AACxC,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,OAAO,QAAQ,KAAK,cAAc,IAAI,QAAQ,KAAK,kBAAkB,IAAI,QAAQ,KAAK,4BAA4B,CAAA;AACpH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,iBAAyB,EACzB,cAAgC,UAAU;IAE1C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;QAC7C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,iBAAiB,EAAE,EAAE,MAAM,EAAE,2BAA2B,EAAE;KAC/F,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAA;IAC5E,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,UAAU,CAAC,+BAA+B,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAA;IACnH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAA+E,CAAA;IACnG,MAAM,IAAI,GAAG,IAAI,CAAC,MAAiE,CAAA;IACnF,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,IAAI,EAAE,UAAU,CAAA;IACzD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,UAAU,CAAC,wDAAwD,EAAE,qBAAqB,CAAC,CAAA;IACvG,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,EAAE,mBAAmB,IAAI,IAAI,EAAE,SAAS,IAAI,2BAA2B,CAAA;IAC5F,OAAO;QACL,UAAU;QACV,mBAAmB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;QACvE,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC;KAC1B,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,iBAAyB;IACpE,OAAO,cAAc,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAA;AACtD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAA6B,EAAE,MAAc;IACrE,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,KAAK,CAAA;IACjD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAA;AAC1E,CAAC;AAED,SAAS,kBAAkB,CAAC,IAA6B,EAAE,MAAc;IACvE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAuC,CAAA;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,IAAI,IAAI,QAAQ,MAAM,EAAE,CAAC,CAAA;IAC1F,IAAI,IAAI,KAAK,sBAAsB,EAAE,CAAC;QACpC,OAAO,GAAG,IAAI,wLAAwL,CAAA;IACxM,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,WAAW,CAAC,IAA6B;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,UAA+E,CAAA;IACvG,MAAM,GAAG,GAAG,UAAU,EAAE,MAAM,IAAI,UAAU,EAAE,UAAU,IAAI,UAAU,EAAE,EAAE,CAAA;IAC1E,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,GAAG,CAAA;IAClE,OAAO,SAAS,CAAA;AAClB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { TeamsCredentialManager } from './credential-manager.js';
2
+ import { type DeviceCodeInfo } from './device-code.js';
3
+ import { type TeamsAccountType } from './types.js';
4
+ export interface DeviceCodePrompt {
5
+ verificationUri: string;
6
+ verificationUriComplete: string;
7
+ userCode: string;
8
+ expiresAt: number;
9
+ }
10
+ export interface DeviceLoginResult {
11
+ accountType: TeamsAccountType;
12
+ userName: string;
13
+ teams: Array<{
14
+ id: string;
15
+ name: string;
16
+ }>;
17
+ current: string | null;
18
+ }
19
+ interface LoginCallbacks {
20
+ onCode: (prompt: DeviceCodePrompt) => void | Promise<void>;
21
+ onPending?: () => void;
22
+ debug?: (message: string) => void;
23
+ clientId?: string;
24
+ accountType?: TeamsAccountType;
25
+ }
26
+ export declare function startDeviceCode(clientIdOverride?: string, accountType?: TeamsAccountType): Promise<{
27
+ info: DeviceCodeInfo;
28
+ clientId: string;
29
+ }>;
30
+ export declare function completeDeviceCode(deviceCode: string, clientId: string, credManager?: TeamsCredentialManager, accountType?: TeamsAccountType): Promise<DeviceLoginResult>;
31
+ export declare function loginWithDeviceCode(callbacks: LoginCallbacks, credManager?: TeamsCredentialManager): Promise<DeviceLoginResult>;
32
+ export declare function refreshDeviceCodeAccount(accountType: TeamsAccountType, credManager?: TeamsCredentialManager, debug?: (message: string) => void): Promise<boolean>;
33
+ export declare class PendingApprovalError extends Error {
34
+ constructor();
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=device-login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-login.d.ts","sourceRoot":"","sources":["../../../../src/platforms/teams/device-login.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAEL,KAAK,cAAc,EASpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,KAAK,gBAAgB,EAAc,MAAM,SAAS,CAAA;AAK3D,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAA;IACvB,uBAAuB,EAAE,MAAM,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,gBAAgB,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,UAAU,cAAc;IACtB,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,gBAAgB,CAAA;CAC/B;AAED,wBAAsB,eAAe,CACnC,gBAAgB,CAAC,EAAE,MAAM,EACzB,WAAW,GAAE,gBAA6B,GACzC,OAAO,CAAC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAIrD;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,sBAAqD,EAClE,WAAW,GAAE,gBAA6B,GACzC,OAAO,CAAC,iBAAiB,CAAC,CAe5B;AAED,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,cAAc,EACzB,WAAW,GAAE,sBAAqD,GACjE,OAAO,CAAC,iBAAiB,CAAC,CAqB5B;AAgED,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,gBAAgB,EAC7B,WAAW,GAAE,sBAAqD,EAClE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,OAAO,CAAC,CAiClB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;;CAK9C"}
@@ -0,0 +1,129 @@
1
+ import { getTeamsAppClientId } from './app-config.js';
2
+ import { TeamsClient } from './client.js';
3
+ import { TeamsCredentialManager } from './credential-manager.js';
4
+ import { decodeJwtTid, exchangeDeviceCode, exchangeForSkypeScope, isConsumerTenant, mintSkypeToken, pollDeviceToken, requestDeviceCode, resolveWorkTenantId, } from './device-code.js';
5
+ import { TeamsError } from './types.js';
6
+ const PERSONAL_ACCOUNT_HINT = 'This looks like a personal Microsoft account. Run `agent-teams auth login --account-type personal` to sign in.';
7
+ export async function startDeviceCode(clientIdOverride, accountType = 'personal') {
8
+ const clientId = clientIdOverride ?? getTeamsAppClientId(accountType).clientId;
9
+ const info = await requestDeviceCode(clientId, accountType);
10
+ return { info, clientId };
11
+ }
12
+ export async function completeDeviceCode(deviceCode, clientId, credManager = new TeamsCredentialManager(), accountType = 'personal') {
13
+ const first = await exchangeDeviceCode(deviceCode, clientId, accountType);
14
+ if (first.status === 'pending' || first.status === 'slow_down') {
15
+ throw new PendingApprovalError();
16
+ }
17
+ if (first.status !== 'success') {
18
+ throw new Error(first.status === 'expired'
19
+ ? 'Device code expired.'
20
+ : first.status === 'declined'
21
+ ? 'Authorization declined.'
22
+ : `Login failed: ${first.message}`);
23
+ }
24
+ return finalize(first.token, clientId, accountType, credManager);
25
+ }
26
+ export async function loginWithDeviceCode(callbacks, credManager = new TeamsCredentialManager()) {
27
+ const accountType = callbacks.accountType ?? 'personal';
28
+ const { info, clientId } = await startDeviceCode(callbacks.clientId, accountType);
29
+ await callbacks.onCode({
30
+ verificationUri: info.verificationUri,
31
+ verificationUriComplete: info.verificationUriComplete,
32
+ userCode: info.userCode,
33
+ expiresAt: Date.now() + info.expiresIn * 1000,
34
+ });
35
+ const aad = await pollDeviceToken(info.deviceCode, info.interval, info.expiresIn, clientId, accountType);
36
+ // A work login can resolve to a personal (MSA) account, whose token carries a
37
+ // consumer tenant. Such accounts have no org tenant and can't be finished on
38
+ // the work flow, so stop with an actionable hint rather than fail obscurely.
39
+ if (accountType === 'work' && isPersonalAccount(aad)) {
40
+ throw new TeamsError(PERSONAL_ACCOUNT_HINT, 'teams_personal_account_on_work_login');
41
+ }
42
+ callbacks.onPending?.();
43
+ return finalize(aad, clientId, accountType, credManager, callbacks.debug);
44
+ }
45
+ function isPersonalAccount(aad) {
46
+ const tid = decodeJwtTid(aad.accessToken);
47
+ return tid !== undefined && isConsumerTenant(tid);
48
+ }
49
+ async function finalize(initialAad, clientId, accountType, credManager, debug) {
50
+ if (!initialAad.refreshToken) {
51
+ throw new Error('Sign-in did not return a refresh token (needed to mint the Teams token). Retry `auth login`, or use `auth extract` if this persists.');
52
+ }
53
+ let tenantId;
54
+ if (accountType === 'work') {
55
+ debug?.('Resolving Teams tenant...');
56
+ tenantId = await resolveWorkTenantId(initialAad.accessToken);
57
+ }
58
+ debug?.('Exchanging token for skype audience...');
59
+ const skypeScoped = await exchangeForSkypeScope(initialAad.refreshToken, clientId, accountType, tenantId);
60
+ debug?.('Minting skype token...');
61
+ const minted = await mintSkypeToken(skypeScoped.accessToken, accountType);
62
+ const client = await new TeamsClient().login({ token: minted.skypeToken, accountType });
63
+ const authInfo = await client.testAuth();
64
+ const teams = await client.listTeams();
65
+ const teamMap = {};
66
+ for (const team of teams) {
67
+ teamMap[team.id] = { team_id: team.id, team_name: team.name };
68
+ }
69
+ const currentTeam = teams[0]?.id ?? null;
70
+ await credManager.setDeviceCodeAccount({
71
+ accountType,
72
+ token: minted.skypeToken,
73
+ tokenExpiresAt: minted.skypeTokenExpiresAt,
74
+ aadRefreshToken: skypeScoped.refreshToken,
75
+ aadClientId: clientId,
76
+ aadTenantId: tenantId,
77
+ region: minted.region ?? (accountType === 'work' ? client.getRegion() : undefined),
78
+ userName: authInfo.displayName,
79
+ teams: teamMap,
80
+ currentTeam,
81
+ authMethod: 'device-code',
82
+ });
83
+ return {
84
+ accountType,
85
+ userName: authInfo.displayName,
86
+ teams: teams.map((t) => ({ id: t.id, name: t.name })),
87
+ current: currentTeam,
88
+ };
89
+ }
90
+ export async function refreshDeviceCodeAccount(accountType, credManager = new TeamsCredentialManager(), debug) {
91
+ const config = await credManager.loadConfig();
92
+ const account = config?.accounts[accountType];
93
+ if (!account || account.auth_method !== 'device-code' || !account.aad_refresh_token) {
94
+ return false;
95
+ }
96
+ const clientId = account.aad_client_id ?? getTeamsAppClientId(accountType).clientId;
97
+ try {
98
+ debug?.('Silently refreshing skype token...');
99
+ const tenantId = accountType === 'work' ? account.aad_tenant_id : undefined;
100
+ const skypeScoped = await exchangeForSkypeScope(account.aad_refresh_token, clientId, accountType, tenantId);
101
+ const minted = await mintSkypeToken(skypeScoped.accessToken, accountType);
102
+ await credManager.setDeviceCodeAccount({
103
+ accountType,
104
+ token: minted.skypeToken,
105
+ tokenExpiresAt: minted.skypeTokenExpiresAt,
106
+ aadRefreshToken: skypeScoped.refreshToken,
107
+ aadClientId: clientId,
108
+ aadTenantId: tenantId,
109
+ region: minted.region ?? account.region,
110
+ userName: account.user_name,
111
+ teams: account.teams,
112
+ currentTeam: account.current_team,
113
+ authMethod: 'device-code',
114
+ makeCurrent: false,
115
+ });
116
+ return true;
117
+ }
118
+ catch (error) {
119
+ debug?.(`Silent refresh failed: ${error.message}`);
120
+ return false;
121
+ }
122
+ }
123
+ export class PendingApprovalError extends Error {
124
+ constructor() {
125
+ super('Authorization pending. Approve in the browser, then retry.');
126
+ this.name = 'PendingApprovalError';
127
+ }
128
+ }
129
+ //# sourceMappingURL=device-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-login.js","sourceRoot":"","sources":["../../../../src/platforms/teams/device-login.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-auth.d.ts","sourceRoot":"","sources":["../../../../src/platforms/teams/ensure-auth.ts"],"names":[],"mappings":"AAOA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAyDrD"}
1
+ {"version":3,"file":"ensure-auth.d.ts","sourceRoot":"","sources":["../../../../src/platforms/teams/ensure-auth.ts"],"names":[],"mappings":"AAQA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA2DrD"}
@@ -1,6 +1,7 @@
1
1
  import { warn } from '../../shared/utils/stderr.js';
2
2
  import { TeamsClient } from './client.js';
3
3
  import { TeamsCredentialManager } from './credential-manager.js';
4
+ import { refreshDeviceCodeAccount } from './device-login.js';
4
5
  import { TeamsTokenExtractor } from './token-extractor.js';
5
6
  export async function ensureTeamsAuth() {
6
7
  try {
@@ -8,6 +9,8 @@ export async function ensureTeamsAuth() {
8
9
  const config = await credManager.loadConfig();
9
10
  if (config && hasValidToken(config))
10
11
  return;
12
+ if (config && (await trySilentRefresh(config, credManager)))
13
+ return;
11
14
  const extractor = new TeamsTokenExtractor();
12
15
  const extracted = await extractor.extract();
13
16
  if (extracted.length === 0)
@@ -78,6 +81,15 @@ async function resolveAccountType(token, extractedType, accountTypeKnown, config
78
81
  }
79
82
  throw lastError ?? new Error('Token validation failed');
80
83
  }
84
+ async function trySilentRefresh(config, credManager) {
85
+ const key = TeamsCredentialManager.accountOverride ?? config.current_account;
86
+ if (!key)
87
+ return false;
88
+ const account = config.accounts[key];
89
+ if (account?.auth_method !== 'device-code' || !account.aad_refresh_token)
90
+ return false;
91
+ return refreshDeviceCodeAccount(key, credManager);
92
+ }
81
93
  function hasValidToken(config) {
82
94
  const key = TeamsCredentialManager.accountOverride ?? config.current_account;
83
95
  if (!key)