agent-messenger 2.28.0 → 2.29.1

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 (159) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +29 -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 +20 -2
  28. package/dist/src/platforms/teams/client.d.ts.map +1 -1
  29. package/dist/src/platforms/teams/client.js +311 -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 +40 -0
  63. package/dist/src/platforms/teams/listener.d.ts.map +1 -0
  64. package/dist/src/platforms/teams/listener.js +286 -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 +38 -0
  79. package/dist/src/platforms/teams/trouter.d.ts.map +1 -0
  80. package/dist/src/platforms/teams/trouter.js +266 -0
  81. package/dist/src/platforms/teams/trouter.js.map +1 -0
  82. package/dist/src/platforms/teams/types.d.ts +103 -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 +36 -0
  97. package/docs/content/docs/sdk/teams.mdx +30 -0
  98. package/package.json +1 -1
  99. package/skills/agent-channeltalk/SKILL.md +1 -1
  100. package/skills/agent-channeltalkbot/SKILL.md +1 -1
  101. package/skills/agent-discord/SKILL.md +1 -1
  102. package/skills/agent-discordbot/SKILL.md +1 -1
  103. package/skills/agent-imessage/SKILL.md +1 -1
  104. package/skills/agent-instagram/SKILL.md +1 -1
  105. package/skills/agent-instagram/references/authentication.md +11 -0
  106. package/skills/agent-kakaotalk/SKILL.md +1 -1
  107. package/skills/agent-line/SKILL.md +1 -1
  108. package/skills/agent-slack/SKILL.md +1 -1
  109. package/skills/agent-slackbot/SKILL.md +1 -1
  110. package/skills/agent-teams/SKILL.md +82 -6
  111. package/skills/agent-teams/references/authentication.md +31 -1
  112. package/skills/agent-telegram/SKILL.md +1 -1
  113. package/skills/agent-telegrambot/SKILL.md +1 -1
  114. package/skills/agent-webex/SKILL.md +1 -1
  115. package/skills/agent-webexbot/SKILL.md +1 -1
  116. package/skills/agent-wechatbot/SKILL.md +1 -1
  117. package/skills/agent-whatsapp/SKILL.md +1 -1
  118. package/skills/agent-whatsappbot/SKILL.md +1 -1
  119. package/src/platforms/discord/client.test.ts +86 -0
  120. package/src/platforms/discord/client.ts +10 -3
  121. package/src/platforms/instagram/client.test.ts +478 -33
  122. package/src/platforms/instagram/client.ts +449 -68
  123. package/src/platforms/instagram/commands/auth.test.ts +177 -1
  124. package/src/platforms/instagram/commands/auth.ts +182 -11
  125. package/src/platforms/instagram/credential-manager.test.ts +30 -0
  126. package/src/platforms/instagram/credential-manager.ts +23 -1
  127. package/src/platforms/instagram/types.ts +11 -8
  128. package/src/platforms/teams/app-config.ts +92 -0
  129. package/src/platforms/teams/client.test.ts +335 -1
  130. package/src/platforms/teams/client.ts +370 -7
  131. package/src/platforms/teams/commands/auth.test.ts +93 -1
  132. package/src/platforms/teams/commands/auth.ts +182 -3
  133. package/src/platforms/teams/commands/file.test.ts +92 -1
  134. package/src/platforms/teams/commands/file.ts +76 -1
  135. package/src/platforms/teams/commands/message.test.ts +95 -1
  136. package/src/platforms/teams/commands/message.ts +145 -3
  137. package/src/platforms/teams/credential-manager.test.ts +20 -0
  138. package/src/platforms/teams/credential-manager.ts +68 -3
  139. package/src/platforms/teams/device-code.test.ts +311 -0
  140. package/src/platforms/teams/device-code.ts +277 -0
  141. package/src/platforms/teams/device-login.test.ts +288 -0
  142. package/src/platforms/teams/device-login.ts +206 -0
  143. package/src/platforms/teams/ensure-auth.ts +11 -0
  144. package/src/platforms/teams/index.test.ts +10 -0
  145. package/src/platforms/teams/index.ts +17 -1
  146. package/src/platforms/teams/listener.test.ts +243 -0
  147. package/src/platforms/teams/listener.ts +351 -0
  148. package/src/platforms/teams/realm-discovery.test.ts +73 -0
  149. package/src/platforms/teams/realm-discovery.ts +42 -0
  150. package/src/platforms/teams/token-extractor.ts +69 -0
  151. package/src/platforms/teams/token-provider.test.ts +227 -0
  152. package/src/platforms/teams/token-provider.ts +284 -0
  153. package/src/platforms/teams/trouter.test.ts +174 -0
  154. package/src/platforms/teams/trouter.ts +323 -0
  155. package/src/platforms/teams/types.test.ts +17 -0
  156. package/src/platforms/teams/types.ts +96 -0
  157. package/src/tui/adapters/instagram-adapter.ts +13 -0
  158. package/src/tui/adapters/teams-adapter.ts +23 -0
  159. package/src/tui/app.ts +3 -3
@@ -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":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAGL,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAyB,UAAU,EAAE,MAAM,SAAS,CAAA;AAE3D,MAAM,qBAAqB,GACzB,gHAAgH,CAAA;AAwBlH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,gBAAyB,EACzB,cAAgC,UAAU;IAE1C,MAAM,QAAQ,GAAG,gBAAgB,IAAI,mBAAmB,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAA;IAC9E,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IAC3D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,QAAgB,EAChB,cAAsC,IAAI,sBAAsB,EAAE,EAClE,cAAgC,UAAU;IAE1C,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;IACzE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC/D,MAAM,IAAI,oBAAoB,EAAE,CAAA;IAClC,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,KAAK,CAAC,MAAM,KAAK,SAAS;YACxB,CAAC,CAAC,sBAAsB;YACxB,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU;gBAC3B,CAAC,CAAC,yBAAyB;gBAC3B,CAAC,CAAC,iBAAiB,KAAK,CAAC,OAAO,EAAE,CACvC,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAyB,EACzB,cAAsC,IAAI,sBAAsB,EAAE;IAElE,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,IAAI,UAAU,CAAA;IACvD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IACjF,MAAM,SAAS,CAAC,MAAM,CAAC;QACrB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;QACrD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI;KAC9C,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;IAExG,8EAA8E;IAC9E,6EAA6E;IAC7E,6EAA6E;IAC7E,IAAI,WAAW,KAAK,MAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,UAAU,CAAC,qBAAqB,EAAE,sCAAsC,CAAC,CAAA;IACrF,CAAC;IAED,SAAS,CAAC,SAAS,EAAE,EAAE,CAAA;IACvB,OAAO,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;AAC3E,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAa;IACtC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACzC,OAAO,GAAG,KAAK,SAAS,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAA;AACnD,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,UAAoB,EACpB,QAAgB,EAChB,WAA6B,EAC7B,WAAmC,EACnC,KAAiC;IAEjC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,sIAAsI,CACvI,CAAA;IACH,CAAC;IAED,IAAI,QAA4B,CAAA;IAChC,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,KAAK,EAAE,CAAC,2BAA2B,CAAC,CAAA;QACpC,QAAQ,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;IAC9D,CAAC;IAED,KAAK,EAAE,CAAC,wCAAwC,CAAC,CAAA;IACjD,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,UAAU,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;IAEzG,KAAK,EAAE,CAAC,wBAAwB,CAAC,CAAA;IACjC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;IAEzE,MAAM,MAAM,GAAG,MAAM,IAAI,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAA;IACvF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAA;IAEtC,MAAM,OAAO,GAA2D,EAAE,CAAA;IAC1E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,CAAA;IAC/D,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAA;IAExC,MAAM,WAAW,CAAC,oBAAoB,CAAC;QACrC,WAAW;QACX,KAAK,EAAE,MAAM,CAAC,UAAU;QACxB,cAAc,EAAE,MAAM,CAAC,mBAAmB;QAC1C,eAAe,EAAE,WAAW,CAAC,YAAY;QACzC,WAAW,EAAE,QAAQ;QACrB,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAClF,QAAQ,EAAE,QAAQ,CAAC,WAAW;QAC9B,KAAK,EAAE,OAAO;QACd,WAAW;QACX,UAAU,EAAE,aAAa;KAC1B,CAAC,CAAA;IAEF,OAAO;QACL,WAAW;QACX,QAAQ,EAAE,QAAQ,CAAC,WAAW;QAC9B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,OAAO,EAAE,WAAW;KACrB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,WAA6B,EAC7B,cAAsC,IAAI,sBAAsB,EAAE,EAClE,KAAiC;IAEjC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,CAAA;IAC7C,MAAM,OAAO,GAAG,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;IAC7C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,WAAW,KAAK,aAAa,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACpF,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,IAAI,mBAAmB,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAA;IAEnF,IAAI,CAAC;QACH,KAAK,EAAE,CAAC,oCAAoC,CAAC,CAAA;QAC7C,MAAM,QAAQ,GAAG,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3E,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;QAC3G,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;QAEzE,MAAM,WAAW,CAAC,oBAAoB,CAAC;YACrC,WAAW;YACX,KAAK,EAAE,MAAM,CAAC,UAAU;YACxB,cAAc,EAAE,MAAM,CAAC,mBAAmB;YAC1C,eAAe,EAAE,WAAW,CAAC,YAAY;YACzC,WAAW,EAAE,QAAQ;YACrB,WAAW,EAAE,QAAQ;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;YACvC,QAAQ,EAAE,OAAO,CAAC,SAAS;YAC3B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,YAAY;YACjC,UAAU,EAAE,aAAa;YACzB,WAAW,EAAE,KAAK;SACnB,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,EAAE,CAAC,0BAA2B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7D,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C;QACE,KAAK,CAAC,4DAA4D,CAAC,CAAA;QACnE,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;IACpC,CAAC;CACF"}
@@ -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)
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-auth.js","sourceRoot":"","sources":["../../../../src/platforms/teams/ensure-auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ensure-auth.js","sourceRoot":"","sources":["../../../../src/platforms/teams/ensure-auth.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
1
  export { TeamsClient } from './client.js';
2
2
  export { TeamsCredentialManager } from './credential-manager.js';
3
- export { TeamsError } from './types.js';
4
- export type { TeamsAccount, TeamsAccountType, TeamsChannel, TeamsConfig, TeamsConfigLegacy, TeamsCredentials, TeamsFile, TeamsMessage, TeamsReaction, TeamsTeam, TeamsUser, } from './types.js';
5
- export { TeamsAccountSchema, TeamsAccountTypeSchema, TeamsChannelSchema, TeamsConfigLegacySchema, TeamsConfigSchema, TeamsCredentialsSchema, TeamsFileSchema, TeamsMessageSchema, TeamsReactionSchema, TeamsTeamSchema, TeamsUserSchema, } from './types.js';
3
+ export { TeamsTokenProvider } from './token-provider.js';
4
+ export { completeDeviceCode, loginWithDeviceCode, PendingApprovalError, refreshDeviceCodeAccount, startDeviceCode, } from './device-login.js';
5
+ export type { DeviceCodePrompt, DeviceLoginResult } from './device-login.js';
6
+ export { TeamsListener } from './listener.js';
7
+ export { TeamsAuthCapabilityError, TeamsError } from './types.js';
8
+ export type { TeamsAccount, TeamsAccountType, TeamsChannel, TeamsConfig, TeamsConfigLegacy, TeamsCredentials, TeamsFile, TeamsListenerEventMap, TeamsMention, TeamsMessage, TeamsRealtimeMessage, TeamsReaction, TeamsSearchResult, TeamsTeam, TeamsTrouterGenericEvent, TeamsUser, } from './types.js';
9
+ export { TeamsAccountSchema, TeamsAccountTypeSchema, TeamsChannelSchema, TeamsConfigLegacySchema, TeamsConfigSchema, TeamsCredentialsSchema, TeamsFileSchema, TeamsMessageSchema, TeamsReactionSchema, TeamsSearchResultSchema, TeamsTeamSchema, TeamsUserSchema, } from './types.js';
6
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platforms/teams/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,SAAS,EACT,SAAS,GACV,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platforms/teams/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,GAChB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC9D,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,wBAAwB,EACxB,SAAS,GACV,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EACf,eAAe,GAChB,MAAM,SAAS,CAAA"}
@@ -1,5 +1,8 @@
1
1
  export { TeamsClient } from './client.js';
2
2
  export { TeamsCredentialManager } from './credential-manager.js';
3
- export { TeamsError } from './types.js';
4
- export { TeamsAccountSchema, TeamsAccountTypeSchema, TeamsChannelSchema, TeamsConfigLegacySchema, TeamsConfigSchema, TeamsCredentialsSchema, TeamsFileSchema, TeamsMessageSchema, TeamsReactionSchema, TeamsTeamSchema, TeamsUserSchema, } from './types.js';
3
+ export { TeamsTokenProvider } from './token-provider.js';
4
+ export { completeDeviceCode, loginWithDeviceCode, PendingApprovalError, refreshDeviceCodeAccount, startDeviceCode, } from './device-login.js';
5
+ export { TeamsListener } from './listener.js';
6
+ export { TeamsAuthCapabilityError, TeamsError } from './types.js';
7
+ export { TeamsAccountSchema, TeamsAccountTypeSchema, TeamsChannelSchema, TeamsConfigLegacySchema, TeamsConfigSchema, TeamsCredentialsSchema, TeamsFileSchema, TeamsMessageSchema, TeamsReactionSchema, TeamsSearchResultSchema, TeamsTeamSchema, TeamsUserSchema, } from './types.js';
5
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platforms/teams/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAcpC,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platforms/teams/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,GAChB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAmB9D,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EACf,eAAe,GAChB,MAAM,SAAS,CAAA"}
@@ -0,0 +1,40 @@
1
+ import type { TeamsClient } from './client.js';
2
+ import type { TeamsListenerEventMap } from './types.js';
3
+ type EventKey = keyof TeamsListenerEventMap;
4
+ export declare class TeamsListener {
5
+ private client;
6
+ private running;
7
+ private ws;
8
+ private emitter;
9
+ private endpointId;
10
+ private idToken;
11
+ private info;
12
+ private sequence;
13
+ private reconnectAttempts;
14
+ private pingTimer;
15
+ private reregisterTimer;
16
+ private reconnectTimer;
17
+ private seenMessageIds;
18
+ private channelTeamMap;
19
+ private channelMapRefreshing;
20
+ private nonChannelThreads;
21
+ constructor(client: TeamsClient);
22
+ start(): Promise<void>;
23
+ stop(): void;
24
+ on<K extends EventKey>(event: K, listener: (...args: TeamsListenerEventMap[K]) => void): this;
25
+ off<K extends EventKey>(event: K, listener: (...args: TeamsListenerEventMap[K]) => void): this;
26
+ once<K extends EventKey>(event: K, listener: (...args: TeamsListenerEventMap[K]) => void): this;
27
+ private connect;
28
+ private handleFrame;
29
+ private onConnected;
30
+ private register;
31
+ private handleRequestFrame;
32
+ private emitMessage;
33
+ private classifyConversation;
34
+ private refreshChannelMap;
35
+ private rememberMessageId;
36
+ private scheduleReconnect;
37
+ private clearTimers;
38
+ }
39
+ export {};
40
+ //# sourceMappingURL=listener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../../src/platforms/teams/listener.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAoB3C,OAAO,KAAK,EAAE,qBAAqB,EAAwB,MAAM,SAAS,CAAA;AAS1E,KAAK,QAAQ,GAAG,MAAM,qBAAqB,CAAA;AAa3C,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAe;IACjC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,iBAAiB,CAAoB;gBAEjC,MAAM,EAAE,WAAW;IAIzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,IAAI,IAAI,IAAI;IASZ,EAAE,CAAC,CAAC,SAAS,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAK7F,GAAG,CAAC,CAAC,SAAS,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAK9F,IAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;YAKjF,OAAO;IA+CrB,OAAO,CAAC,WAAW;YAkBL,WAAW;YAyBX,QAAQ;IAkBtB,OAAO,CAAC,kBAAkB;YAwBZ,WAAW;YAiCX,oBAAoB;YAoBpB,iBAAiB;IAgB/B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,WAAW;CAcpB"}
@@ -0,0 +1,286 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { EventEmitter } from 'node:events';
3
+ import WebSocket from 'ws';
4
+ import { buildActivityFrame, buildAuthenticateFrame, buildEventAck, buildPingFrame, buildRequestAck, buildWebSocketUrl, decodeMessageBody, extractChatId, fetchTrouterInfo, fetchTrouterSessionId, isMessageLossFrame, isThreadConversation, parseMentions, parseRequestFrame, registerEndpoint, } from './trouter.js';
5
+ import { TeamsError } from './types.js';
6
+ const PING_INTERVAL = 30_000;
7
+ const RECONNECT_BASE_DELAY = 1_000;
8
+ const RECONNECT_MAX_DELAY = 30_000;
9
+ const REGISTRATION_REFRESH_INTERVAL = (86400 - 60) * 1000;
10
+ const MESSAGE_CACHE_LIMIT = 500;
11
+ const TEXT_MESSAGE_TYPES = new Set(['Text', 'RichText/Html']);
12
+ export class TeamsListener {
13
+ client;
14
+ running = false;
15
+ ws = null;
16
+ emitter = new EventEmitter();
17
+ endpointId = randomUUID();
18
+ idToken = null;
19
+ info = null;
20
+ sequence = 0;
21
+ reconnectAttempts = 0;
22
+ pingTimer = null;
23
+ reregisterTimer = null;
24
+ reconnectTimer = null;
25
+ seenMessageIds = new Set();
26
+ channelTeamMap = new Map();
27
+ channelMapRefreshing = null;
28
+ nonChannelThreads = new Set();
29
+ constructor(client) {
30
+ this.client = client;
31
+ }
32
+ async start() {
33
+ if (this.running)
34
+ return;
35
+ this.running = true;
36
+ this.reconnectAttempts = 0;
37
+ await this.refreshChannelMap();
38
+ await this.connect();
39
+ }
40
+ stop() {
41
+ this.running = false;
42
+ this.clearTimers();
43
+ if (this.ws) {
44
+ this.ws.close();
45
+ this.ws = null;
46
+ }
47
+ }
48
+ on(event, listener) {
49
+ this.emitter.on(event, listener);
50
+ return this;
51
+ }
52
+ off(event, listener) {
53
+ this.emitter.off(event, listener);
54
+ return this;
55
+ }
56
+ once(event, listener) {
57
+ this.emitter.once(event, listener);
58
+ return this;
59
+ }
60
+ async connect() {
61
+ if (!this.running)
62
+ return;
63
+ try {
64
+ const skypeToken = this.client.getToken();
65
+ // Re-extract on every attempt so a reconnect after token expiry picks up
66
+ // a fresh id_token rather than reusing the stale cached one.
67
+ this.idToken = await this.client.getIdToken();
68
+ if (!this.idToken) {
69
+ throw new TeamsError('Could not obtain Teams id_token for real-time auth. Ensure the Teams desktop app is logged in, then re-run "auth extract".', 'no_id_token');
70
+ }
71
+ const info = await fetchTrouterInfo(skypeToken, this.endpointId);
72
+ if (!this.running)
73
+ return;
74
+ const sessionId = await fetchTrouterSessionId(info, skypeToken, this.endpointId);
75
+ if (!this.running)
76
+ return;
77
+ this.info = info;
78
+ const ws = new WebSocket(buildWebSocketUrl(info, sessionId, this.endpointId), {
79
+ headers: { 'X-Skypetoken': skypeToken, 'User-Agent': 'AgentMessenger' },
80
+ });
81
+ this.ws = ws;
82
+ ws.on('message', (raw) => this.handleFrame(raw.toString()));
83
+ ws.on('close', () => {
84
+ this.clearTimers();
85
+ if (this.ws === ws)
86
+ this.ws = null;
87
+ if (this.running) {
88
+ this.emitter.emit('disconnected');
89
+ this.scheduleReconnect();
90
+ }
91
+ });
92
+ ws.on('error', (err) => {
93
+ this.emitter.emit('error', err instanceof Error ? err : new Error(String(err)));
94
+ });
95
+ }
96
+ catch (error) {
97
+ this.emitter.emit('error', error instanceof Error ? error : new Error(String(error)));
98
+ if (this.running)
99
+ this.scheduleReconnect();
100
+ }
101
+ }
102
+ handleFrame(frame) {
103
+ if (frame.startsWith('1::')) {
104
+ void this.onConnected();
105
+ return;
106
+ }
107
+ if (frame.startsWith('3:::')) {
108
+ this.handleRequestFrame(frame);
109
+ return;
110
+ }
111
+ if (frame.startsWith('5:')) {
112
+ const ack = buildEventAck(frame);
113
+ if (ack)
114
+ this.ws?.send(ack);
115
+ if (isMessageLossFrame(frame))
116
+ void this.register();
117
+ }
118
+ }
119
+ async onConnected() {
120
+ if (!this.ws || !this.info || !this.idToken)
121
+ return;
122
+ this.ws.send(buildAuthenticateFrame(this.info, this.idToken));
123
+ this.ws.send(buildActivityFrame(++this.sequence));
124
+ // Only report the endpoint as connected once it has actually registered;
125
+ // an unregistered endpoint receives no messages. On failure, drop the
126
+ // possibly-stale id_token and close so the reconnect path re-authenticates.
127
+ const registered = await this.register();
128
+ if (!registered) {
129
+ this.idToken = null;
130
+ this.ws.close();
131
+ return;
132
+ }
133
+ this.reconnectAttempts = 0;
134
+ this.pingTimer = setInterval(() => {
135
+ if (this.ws?.readyState === WebSocket.OPEN)
136
+ this.ws.send(buildPingFrame(++this.sequence));
137
+ }, PING_INTERVAL);
138
+ this.reregisterTimer = setInterval(() => void this.register(), REGISTRATION_REFRESH_INTERVAL);
139
+ this.emitter.emit('connected', { endpointId: this.endpointId });
140
+ }
141
+ async register() {
142
+ if (!this.info || !this.idToken)
143
+ return false;
144
+ try {
145
+ await registerEndpoint(this.info, this.client.getToken(), this.idToken, this.endpointId, this.client.getAccountType(), () => randomUUID());
146
+ return true;
147
+ }
148
+ catch (error) {
149
+ this.emitter.emit('error', error instanceof Error ? error : new Error(String(error)));
150
+ return false;
151
+ }
152
+ }
153
+ handleRequestFrame(frame) {
154
+ const request = parseRequestFrame(frame);
155
+ if (!request)
156
+ return;
157
+ this.ws?.send(buildRequestAck(request.id));
158
+ if (!request.url?.endsWith('/messaging') || !request.body)
159
+ return;
160
+ try {
161
+ const decoded = decodeMessageBody(request.headers ?? {}, request.body);
162
+ if (decoded.resourceType === 'NewMessage' && decoded.resource) {
163
+ void this.emitMessage(decoded.resource).catch((error) => {
164
+ this.emitter.emit('error', error instanceof Error ? error : new Error(String(error)));
165
+ });
166
+ }
167
+ this.emitter.emit('teams_event', { resourceType: decoded.resourceType ?? 'unknown', ...decoded });
168
+ }
169
+ catch (error) {
170
+ this.emitter.emit('error', error instanceof Error ? error : new Error(String(error)));
171
+ }
172
+ }
173
+ async emitMessage(resource) {
174
+ if (!resource.messagetype || !TEXT_MESSAGE_TYPES.has(resource.messagetype))
175
+ return;
176
+ const chatId = extractChatId(resource.conversationLink ?? resource.resourceLink);
177
+ if (!chatId || !resource.id)
178
+ return;
179
+ // Dedup before the async classification so duplicate frames don't trigger
180
+ // redundant channel-map refreshes.
181
+ if (this.seenMessageIds.has(resource.id))
182
+ return;
183
+ this.rememberMessageId(resource.id);
184
+ const classification = await this.classifyConversation(chatId);
185
+ if (!this.running)
186
+ return;
187
+ const rawContent = resource.content ?? '';
188
+ const message = {
189
+ id: resource.id,
190
+ chatId,
191
+ conversationType: classification.conversationType,
192
+ teamId: classification.teamId,
193
+ channelId: classification.channelId,
194
+ content: stripHtml(rawContent),
195
+ mentions: parseMentions(resource.properties, rawContent),
196
+ author: {
197
+ id: extractUserId(resource.from) ?? 'unknown',
198
+ displayName: resource.imdisplayname || extractUserId(resource.from) || 'unknown',
199
+ },
200
+ messageType: resource.messagetype,
201
+ timestamp: new Date().toISOString(),
202
+ };
203
+ this.emitter.emit('message', message);
204
+ }
205
+ async classifyConversation(chatId) {
206
+ if (!isThreadConversation(chatId))
207
+ return { conversationType: 'chat' };
208
+ let teamId = this.channelTeamMap.get(chatId);
209
+ // A thread we haven't cached may be a channel created/joined since start;
210
+ // one best-effort refresh resolves it. Group chats also look like threads
211
+ // but never carry a groupId, so remember the miss to avoid re-fetching
212
+ // /users/ME/conversations on every one of their messages.
213
+ if (!teamId && !this.nonChannelThreads.has(chatId)) {
214
+ await this.refreshChannelMap();
215
+ teamId = this.channelTeamMap.get(chatId);
216
+ if (!teamId)
217
+ this.nonChannelThreads.add(chatId);
218
+ }
219
+ if (!teamId)
220
+ return { conversationType: 'chat' };
221
+ return { conversationType: 'channel', teamId, channelId: chatId };
222
+ }
223
+ async refreshChannelMap() {
224
+ if (this.channelMapRefreshing)
225
+ return this.channelMapRefreshing;
226
+ this.channelMapRefreshing = this.client
227
+ .buildChannelTeamMap()
228
+ .then((map) => {
229
+ this.channelTeamMap = map;
230
+ })
231
+ .catch((error) => {
232
+ this.emitter.emit('error', error instanceof Error ? error : new Error(String(error)));
233
+ })
234
+ .finally(() => {
235
+ this.channelMapRefreshing = null;
236
+ });
237
+ return this.channelMapRefreshing;
238
+ }
239
+ rememberMessageId(id) {
240
+ this.seenMessageIds.add(id);
241
+ if (this.seenMessageIds.size > MESSAGE_CACHE_LIMIT) {
242
+ const oldest = this.seenMessageIds.values().next().value;
243
+ if (oldest !== undefined)
244
+ this.seenMessageIds.delete(oldest);
245
+ }
246
+ }
247
+ scheduleReconnect() {
248
+ const delay = Math.min(RECONNECT_BASE_DELAY * 2 ** this.reconnectAttempts, RECONNECT_MAX_DELAY);
249
+ this.reconnectAttempts++;
250
+ this.endpointId = randomUUID();
251
+ this.sequence = 0;
252
+ this.reconnectTimer = setTimeout(() => void this.connect(), delay);
253
+ }
254
+ clearTimers() {
255
+ if (this.pingTimer) {
256
+ clearInterval(this.pingTimer);
257
+ this.pingTimer = null;
258
+ }
259
+ if (this.reregisterTimer) {
260
+ clearInterval(this.reregisterTimer);
261
+ this.reregisterTimer = null;
262
+ }
263
+ if (this.reconnectTimer) {
264
+ clearTimeout(this.reconnectTimer);
265
+ this.reconnectTimer = null;
266
+ }
267
+ }
268
+ }
269
+ function stripHtml(html) {
270
+ return html
271
+ .replace(/<[^>]*>/g, '')
272
+ .replace(/&amp;/g, '&')
273
+ .replace(/&lt;/g, '<')
274
+ .replace(/&gt;/g, '>')
275
+ .replace(/&quot;/g, '"')
276
+ .replace(/&#39;/g, "'")
277
+ .replace(/\s+/g, ' ')
278
+ .trim();
279
+ }
280
+ function extractUserId(from) {
281
+ if (!from)
282
+ return null;
283
+ const match = from.match(/contacts\/(.+)$/);
284
+ return match ? match[1] : from;
285
+ }
286
+ //# sourceMappingURL=listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listener.js","sourceRoot":"","sources":["../../../../src/platforms/teams/listener.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TeamsAccountType } from './types.js';
2
+ export declare function probeAccountType(email: string): Promise<TeamsAccountType | undefined>;
3
+ //# sourceMappingURL=realm-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-discovery.d.ts","sourceRoot":"","sources":["../../../../src/platforms/teams/realm-discovery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAkB/C,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAsB3F"}