teams-api 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +1 -1
- package/dist/actions/conversation-resolution.d.ts +26 -0
- package/dist/actions/conversation-resolution.d.ts.map +1 -0
- package/dist/actions/conversation-resolution.js +81 -0
- package/dist/actions/conversation-resolution.js.map +1 -0
- package/dist/actions/definitions.d.ts +16 -0
- package/dist/actions/definitions.d.ts.map +1 -0
- package/dist/{actions.js → actions/definitions.js} +77 -209
- package/dist/actions/definitions.js.map +1 -0
- package/dist/{actions.d.ts → actions/formatters.d.ts} +24 -13
- package/dist/actions/formatters.d.ts.map +1 -0
- package/dist/actions/formatters.js +86 -0
- package/dist/actions/formatters.js.map +1 -0
- package/dist/api/chat-service.d.ts +54 -0
- package/dist/api/chat-service.d.ts.map +1 -0
- package/dist/api/chat-service.js +327 -0
- package/dist/api/chat-service.js.map +1 -0
- package/dist/api/common.d.ts +21 -0
- package/dist/api/common.d.ts.map +1 -0
- package/dist/api/common.js +65 -0
- package/dist/api/common.js.map +1 -0
- package/dist/api/middle-tier.d.ts +15 -0
- package/dist/api/middle-tier.d.ts.map +1 -0
- package/dist/api/middle-tier.js +52 -0
- package/dist/api/middle-tier.js.map +1 -0
- package/dist/api/substrate.d.ts +22 -0
- package/dist/api/substrate.d.ts.map +1 -0
- package/dist/api/substrate.js +162 -0
- package/dist/api/substrate.js.map +1 -0
- package/dist/api/transcripts.d.ts +51 -0
- package/dist/api/transcripts.d.ts.map +1 -0
- package/dist/api/transcripts.js +140 -0
- package/dist/api/transcripts.js.map +1 -0
- package/dist/auth/auto-login.d.ts +23 -0
- package/dist/auth/auto-login.d.ts.map +1 -0
- package/dist/auth/auto-login.js +136 -0
- package/dist/auth/auto-login.js.map +1 -0
- package/dist/auth/debug-session.d.ts +20 -0
- package/dist/auth/debug-session.d.ts.map +1 -0
- package/dist/auth/debug-session.js +121 -0
- package/dist/auth/debug-session.js.map +1 -0
- package/dist/auth/interactive.d.ts +21 -0
- package/dist/auth/interactive.d.ts.map +1 -0
- package/dist/auth/interactive.js +90 -0
- package/dist/auth/interactive.js.map +1 -0
- package/dist/auth/page-diagnostics.d.ts +21 -0
- package/dist/auth/page-diagnostics.d.ts.map +1 -0
- package/dist/auth/page-diagnostics.js +65 -0
- package/dist/auth/page-diagnostics.js.map +1 -0
- package/dist/auth/token-capture.d.ts +24 -0
- package/dist/auth/token-capture.d.ts.map +1 -0
- package/dist/auth/token-capture.js +123 -0
- package/dist/auth/token-capture.js.map +1 -0
- package/dist/cli.js +11 -5
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +14 -0
- package/dist/constants.js.map +1 -0
- package/dist/html-utils.d.ts +9 -0
- package/dist/html-utils.d.ts.map +1 -0
- package/dist/html-utils.js +21 -0
- package/dist/html-utils.js.map +1 -0
- package/dist/mcp-server.js +4 -3
- package/dist/mcp-server.js.map +1 -1
- package/dist/teams-client.d.ts +17 -8
- package/dist/teams-client.d.ts.map +1 -1
- package/dist/teams-client.js +90 -75
- package/dist/teams-client.js.map +1 -1
- package/dist/types.d.ts +20 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/actions.d.ts.map +0 -1
- package/dist/actions.js.map +0 -1
- package/dist/api.d.ts +0 -126
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -702
- package/dist/api.js.map +0 -1
- package/dist/auth.d.ts +0 -53
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -491
- package/dist/auth.js.map +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug session token capture for Teams.
|
|
3
|
+
*
|
|
4
|
+
* Connects via puppeteer-core to a running Chrome instance with Teams open,
|
|
5
|
+
* intercepts network headers during a page reload, and extracts tokens.
|
|
6
|
+
*/
|
|
7
|
+
import type { TeamsToken, ManualTokenOptions } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Capture a Teams skype token from an existing Chrome debug session.
|
|
10
|
+
*
|
|
11
|
+
* Connects via puppeteer-core to a running Chrome instance with Teams open,
|
|
12
|
+
* intercepts network headers during a page reload, and extracts the token.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* 1. Start Chrome with --remote-debugging-port=9222
|
|
16
|
+
* 2. Navigate to Teams and log in
|
|
17
|
+
* 3. Call this function
|
|
18
|
+
*/
|
|
19
|
+
export declare function acquireTokenViaDebugSession(options?: ManualTokenOptions): Promise<TeamsToken>;
|
|
20
|
+
//# sourceMappingURL=debug-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-session.d.ts","sourceRoot":"","sources":["../../src/auth/debug-session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAMlE;;;;;;;;;;GAUG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,CAAC,CA8HrB"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Debug session token capture for Teams.
|
|
4
|
+
*
|
|
5
|
+
* Connects via puppeteer-core to a running Chrome instance with Teams open,
|
|
6
|
+
* intercepts network headers during a page reload, and extracts tokens.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.acquireTokenViaDebugSession = acquireTokenViaDebugSession;
|
|
10
|
+
const region_js_1 = require("../region.js");
|
|
11
|
+
const FETCH_INTERCEPT_TIMEOUT = 30 * 1_000;
|
|
12
|
+
const PAGE_RELOAD_TIMEOUT = 30 * 1_000;
|
|
13
|
+
/**
|
|
14
|
+
* Capture a Teams skype token from an existing Chrome debug session.
|
|
15
|
+
*
|
|
16
|
+
* Connects via puppeteer-core to a running Chrome instance with Teams open,
|
|
17
|
+
* intercepts network headers during a page reload, and extracts the token.
|
|
18
|
+
*
|
|
19
|
+
* Usage:
|
|
20
|
+
* 1. Start Chrome with --remote-debugging-port=9222
|
|
21
|
+
* 2. Navigate to Teams and log in
|
|
22
|
+
* 3. Call this function
|
|
23
|
+
*/
|
|
24
|
+
async function acquireTokenViaDebugSession(options) {
|
|
25
|
+
const puppeteer = await import("puppeteer-core");
|
|
26
|
+
const debugPort = options?.debugPort ?? 9222;
|
|
27
|
+
const browserUrl = `http://127.0.0.1:${debugPort}`;
|
|
28
|
+
const browser = await puppeteer.default.connect({ browserURL: browserUrl });
|
|
29
|
+
try {
|
|
30
|
+
const pages = await browser.pages();
|
|
31
|
+
const teamsPage = pages.find((page) => /teams\.(microsoft|cloud\.microsoft)/i.test(page.url()));
|
|
32
|
+
if (!teamsPage) {
|
|
33
|
+
throw new Error("No Teams page found in the browser. Navigate to Teams and log in first.");
|
|
34
|
+
}
|
|
35
|
+
const cdpSession = await teamsPage.createCDPSession();
|
|
36
|
+
let skypeToken = null;
|
|
37
|
+
let region = null;
|
|
38
|
+
let bearerToken = null;
|
|
39
|
+
let substrateToken = null;
|
|
40
|
+
await cdpSession.send("Fetch.enable", {
|
|
41
|
+
patterns: [
|
|
42
|
+
{ urlPattern: "*teams*", requestStage: "Request" },
|
|
43
|
+
{ urlPattern: "*substrate.office.com*", requestStage: "Request" },
|
|
44
|
+
],
|
|
45
|
+
});
|
|
46
|
+
const tokenPromise = new Promise((resolve) => {
|
|
47
|
+
const timeout = setTimeout(resolve, FETCH_INTERCEPT_TIMEOUT);
|
|
48
|
+
cdpSession.on("Fetch.requestPaused", async (event) => {
|
|
49
|
+
const headers = event.request.headers ?? {};
|
|
50
|
+
const requestUrl = event.request.url ?? "";
|
|
51
|
+
const detectedRegion = (0, region_js_1.detectTeamsRegionFromUrl)(requestUrl);
|
|
52
|
+
if (detectedRegion && !region) {
|
|
53
|
+
region = detectedRegion;
|
|
54
|
+
}
|
|
55
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
56
|
+
if (name.toLowerCase() === "x-skypetoken" && !skypeToken) {
|
|
57
|
+
skypeToken = value;
|
|
58
|
+
}
|
|
59
|
+
if (name.toLowerCase() === "authorization" &&
|
|
60
|
+
value.startsWith("Bearer ")) {
|
|
61
|
+
if (requestUrl.includes("/api/mt/") && !bearerToken) {
|
|
62
|
+
bearerToken = value.slice("Bearer ".length);
|
|
63
|
+
}
|
|
64
|
+
if (requestUrl.includes("substrate.office.com") &&
|
|
65
|
+
!substrateToken) {
|
|
66
|
+
substrateToken = value.slice("Bearer ".length);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
await cdpSession.send("Fetch.continueRequest", {
|
|
72
|
+
requestId: event.requestId,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Request may have already been handled
|
|
77
|
+
}
|
|
78
|
+
if (skypeToken) {
|
|
79
|
+
clearTimeout(timeout);
|
|
80
|
+
resolve();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
teamsPage
|
|
85
|
+
.reload({ waitUntil: "networkidle2", timeout: PAGE_RELOAD_TIMEOUT })
|
|
86
|
+
.catch(() => {
|
|
87
|
+
// Reload may time out
|
|
88
|
+
});
|
|
89
|
+
await tokenPromise;
|
|
90
|
+
// If we have the skype token but not the substrate token yet,
|
|
91
|
+
// wait a bit longer for substrate requests to fire
|
|
92
|
+
if (skypeToken && !substrateToken) {
|
|
93
|
+
await new Promise((resolve) => {
|
|
94
|
+
const extraTimeout = setTimeout(resolve, 5_000);
|
|
95
|
+
const checkInterval = setInterval(() => {
|
|
96
|
+
if (substrateToken) {
|
|
97
|
+
clearTimeout(extraTimeout);
|
|
98
|
+
clearInterval(checkInterval);
|
|
99
|
+
resolve();
|
|
100
|
+
}
|
|
101
|
+
}, 200);
|
|
102
|
+
extraTimeout.unref?.();
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
await cdpSession.send("Fetch.disable");
|
|
106
|
+
await cdpSession.detach();
|
|
107
|
+
if (!skypeToken) {
|
|
108
|
+
throw new Error("Failed to capture skype token. Ensure Teams is loaded and authenticated.");
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
skypeToken,
|
|
112
|
+
region: (0, region_js_1.resolveTeamsRegion)(options?.region, region ?? undefined),
|
|
113
|
+
bearerToken: bearerToken ?? undefined,
|
|
114
|
+
substrateToken: substrateToken ?? undefined,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
browser.disconnect();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=debug-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-session.js","sourceRoot":"","sources":["../../src/auth/debug-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive browser login for Teams.
|
|
3
|
+
*
|
|
4
|
+
* Opens a visible Chromium window (Playwright's bundled browser),
|
|
5
|
+
* navigates to Teams, and waits for the user to complete login manually.
|
|
6
|
+
* Works on all platforms (macOS, Windows, Linux).
|
|
7
|
+
*/
|
|
8
|
+
import type { TeamsToken, InteractiveLoginOptions } from "../types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Acquire a Teams skype token via interactive browser login.
|
|
11
|
+
*
|
|
12
|
+
* Opens a visible Chromium window (Playwright's bundled browser),
|
|
13
|
+
* navigates to Teams, and waits for the user to complete login
|
|
14
|
+
* manually. Once Teams loads, the skype token is captured via
|
|
15
|
+
* CDP Fetch interception.
|
|
16
|
+
*
|
|
17
|
+
* Works on all platforms (macOS, Windows, Linux). No FIDO2 passkey
|
|
18
|
+
* or system Chrome required.
|
|
19
|
+
*/
|
|
20
|
+
export declare function acquireTokenViaInteractiveLogin(options?: InteractiveLoginOptions): Promise<TeamsToken>;
|
|
21
|
+
//# sourceMappingURL=interactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/auth/interactive.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAavE;;;;;;;;;;GAUG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,UAAU,CAAC,CAmFrB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Interactive browser login for Teams.
|
|
4
|
+
*
|
|
5
|
+
* Opens a visible Chromium window (Playwright's bundled browser),
|
|
6
|
+
* navigates to Teams, and waits for the user to complete login manually.
|
|
7
|
+
* Works on all platforms (macOS, Windows, Linux).
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.acquireTokenViaInteractiveLogin = acquireTokenViaInteractiveLogin;
|
|
11
|
+
const region_js_1 = require("../region.js");
|
|
12
|
+
const page_diagnostics_js_1 = require("./page-diagnostics.js");
|
|
13
|
+
const token_capture_js_1 = require("./token-capture.js");
|
|
14
|
+
const TEAMS_URL = "https://teams.cloud.microsoft/";
|
|
15
|
+
const INTERACTIVE_LOGIN_TIMEOUT = 5 * 60 * 1_000;
|
|
16
|
+
/**
|
|
17
|
+
* Acquire a Teams skype token via interactive browser login.
|
|
18
|
+
*
|
|
19
|
+
* Opens a visible Chromium window (Playwright's bundled browser),
|
|
20
|
+
* navigates to Teams, and waits for the user to complete login
|
|
21
|
+
* manually. Once Teams loads, the skype token is captured via
|
|
22
|
+
* CDP Fetch interception.
|
|
23
|
+
*
|
|
24
|
+
* Works on all platforms (macOS, Windows, Linux). No FIDO2 passkey
|
|
25
|
+
* or system Chrome required.
|
|
26
|
+
*/
|
|
27
|
+
async function acquireTokenViaInteractiveLogin(options) {
|
|
28
|
+
const { chromium } = await import("playwright");
|
|
29
|
+
const log = options?.verbose
|
|
30
|
+
? console.log.bind(console)
|
|
31
|
+
: () => { };
|
|
32
|
+
log("Launching browser for interactive login...");
|
|
33
|
+
const browser = await chromium.launch({ headless: false });
|
|
34
|
+
const context = await browser.newContext();
|
|
35
|
+
const page = await context.newPage();
|
|
36
|
+
try {
|
|
37
|
+
log("Navigating to Teams...");
|
|
38
|
+
await page.goto(TEAMS_URL, {
|
|
39
|
+
waitUntil: "domcontentloaded",
|
|
40
|
+
timeout: INTERACTIVE_LOGIN_TIMEOUT,
|
|
41
|
+
});
|
|
42
|
+
// Pre-fill email if provided
|
|
43
|
+
if (options?.email) {
|
|
44
|
+
try {
|
|
45
|
+
await page.waitForURL(/login\.microsoftonline\.com|login\.microsoft\.com/, { timeout: 30_000 });
|
|
46
|
+
const emailInput = await page
|
|
47
|
+
.waitForSelector('#i0116, input[name="loginfmt"], input[type="email"]', { timeout: 10_000 })
|
|
48
|
+
.catch(() => null);
|
|
49
|
+
if (emailInput) {
|
|
50
|
+
await emailInput.fill(options.email);
|
|
51
|
+
log(`Pre-filled email: ${options.email}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
log("Could not pre-fill email (login page may have changed)");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Wait for user to complete login, polling page state for diagnostics
|
|
59
|
+
log("Waiting for you to complete login in the browser window...");
|
|
60
|
+
const loginDeadline = Date.now() + INTERACTIVE_LOGIN_TIMEOUT;
|
|
61
|
+
while (Date.now() < loginDeadline) {
|
|
62
|
+
const state = await (0, page_diagnostics_js_1.diagnosePageState)(page);
|
|
63
|
+
if (state.phase === "teams-loaded" || state.phase === "teams-loading") {
|
|
64
|
+
log(`Reached Teams: ${state.detail}`);
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
log(`Login progress: ${state.detail}`);
|
|
68
|
+
await new Promise((resolve) => setTimeout(resolve, token_capture_js_1.PAGE_STATE_POLL_INTERVAL));
|
|
69
|
+
}
|
|
70
|
+
if (!page.url().includes("teams.cloud.microsoft") &&
|
|
71
|
+
!page.url().includes("teams.microsoft.com")) {
|
|
72
|
+
const state = await (0, page_diagnostics_js_1.diagnosePageState)(page);
|
|
73
|
+
throw new Error(`Login did not complete within ${INTERACTIVE_LOGIN_TIMEOUT / 1_000}s. ` +
|
|
74
|
+
`Current state: ${state.phase} — ${state.detail} (URL: ${state.url})`);
|
|
75
|
+
}
|
|
76
|
+
log("Login detected, capturing token...");
|
|
77
|
+
const { skypeToken, region, bearerToken, substrateToken } = await (0, token_capture_js_1.captureTokensFromPage)(page, log, token_capture_js_1.TOKEN_INTERCEPT_TIMEOUT);
|
|
78
|
+
return {
|
|
79
|
+
skypeToken,
|
|
80
|
+
region: (0, region_js_1.resolveTeamsRegion)(options?.region, region),
|
|
81
|
+
bearerToken,
|
|
82
|
+
substrateToken,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
await context.close();
|
|
87
|
+
await browser.close();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=interactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/auth/interactive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page state diagnostics for the authentication flow.
|
|
3
|
+
*
|
|
4
|
+
* Provides structured descriptions of where the user is in the
|
|
5
|
+
* Microsoft login flow, used for progress reporting and error messages.
|
|
6
|
+
*/
|
|
7
|
+
/** Describes the current state of the page during the login flow. */
|
|
8
|
+
export interface PageState {
|
|
9
|
+
url: string;
|
|
10
|
+
phase: "login-page" | "mfa-challenge" | "redirect" | "teams-loading" | "teams-loaded" | "unknown";
|
|
11
|
+
detail: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Diagnose the current page state during authentication.
|
|
15
|
+
* Returns a structured description of where the user is in the login flow.
|
|
16
|
+
*/
|
|
17
|
+
export declare function diagnosePageState(page: {
|
|
18
|
+
url: () => string;
|
|
19
|
+
evaluate: (script: string) => Promise<unknown>;
|
|
20
|
+
}): Promise<PageState>;
|
|
21
|
+
//# sourceMappingURL=page-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-diagnostics.d.ts","sourceRoot":"","sources":["../../src/auth/page-diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EACD,YAAY,GACZ,eAAe,GACf,UAAU,GACV,eAAe,GACf,cAAc,GACd,SAAS,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChD,GAAG,OAAO,CAAC,SAAS,CAAC,CAkErB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Page state diagnostics for the authentication flow.
|
|
4
|
+
*
|
|
5
|
+
* Provides structured descriptions of where the user is in the
|
|
6
|
+
* Microsoft login flow, used for progress reporting and error messages.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.diagnosePageState = diagnosePageState;
|
|
10
|
+
/**
|
|
11
|
+
* Diagnose the current page state during authentication.
|
|
12
|
+
* Returns a structured description of where the user is in the login flow.
|
|
13
|
+
*/
|
|
14
|
+
async function diagnosePageState(page) {
|
|
15
|
+
const url = page.url();
|
|
16
|
+
if (url.includes("login.microsoftonline.com") ||
|
|
17
|
+
url.includes("login.microsoft.com")) {
|
|
18
|
+
const pageContent = (await page
|
|
19
|
+
.evaluate("document.body?.innerText?.slice(0, 500) ?? ''")
|
|
20
|
+
.catch(() => ""));
|
|
21
|
+
if (pageContent.includes("Approve sign in request") ||
|
|
22
|
+
pageContent.includes("Enter code") ||
|
|
23
|
+
pageContent.includes("Verify your identity") ||
|
|
24
|
+
pageContent.includes("approve") ||
|
|
25
|
+
url.includes("/common/SAS")) {
|
|
26
|
+
return {
|
|
27
|
+
url,
|
|
28
|
+
phase: "mfa-challenge",
|
|
29
|
+
detail: "Waiting for MFA/2FA approval",
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
url,
|
|
34
|
+
phase: "login-page",
|
|
35
|
+
detail: "On the Microsoft login page",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (url.includes("teams.cloud.microsoft") ||
|
|
39
|
+
url.includes("teams.microsoft.com")) {
|
|
40
|
+
const isLoaded = (await page
|
|
41
|
+
.evaluate("(document.querySelector('#app') ?? document.querySelector(\"[data-tid='app-layout']\") ?? document.querySelector('main')) !== null")
|
|
42
|
+
.catch(() => false));
|
|
43
|
+
if (isLoaded) {
|
|
44
|
+
return {
|
|
45
|
+
url,
|
|
46
|
+
phase: "teams-loaded",
|
|
47
|
+
detail: "Teams application loaded",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
url,
|
|
52
|
+
phase: "teams-loading",
|
|
53
|
+
detail: "Teams page reached, application loading",
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (url.includes("microsoftonline.com") || url.includes("microsoft.com")) {
|
|
57
|
+
return {
|
|
58
|
+
url,
|
|
59
|
+
phase: "redirect",
|
|
60
|
+
detail: "Redirecting through Microsoft authentication",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return { url, phase: "unknown", detail: `Unexpected page: ${url}` };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=page-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-diagnostics.js","sourceRoot":"","sources":["../../src/auth/page-diagnostics.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAmBH,8CAqEC;AAzED;;;GAGG;AACI,KAAK,UAAU,iBAAiB,CAAC,IAGvC;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,IACE,GAAG,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACzC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EACnC,CAAC;QACD,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI;aAC5B,QAAQ,CAAC,+CAA+C,CAAC;aACzD,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAW,CAAC;QAE9B,IACE,WAAW,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAC/C,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC;YAClC,WAAW,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAC5C,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC/B,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAC3B,CAAC;YACD,OAAO;gBACL,GAAG;gBACH,KAAK,EAAE,eAAe;gBACtB,MAAM,EAAE,8BAA8B;aACvC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG;YACH,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,6BAA6B;SACtC,CAAC;IACJ,CAAC;IAED,IACE,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACrC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EACnC,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI;aACzB,QAAQ,CACP,oIAAoI,CACrI;aACA,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAY,CAAC;QAElC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;gBACL,GAAG;gBACH,KAAK,EAAE,cAAc;gBACrB,MAAM,EAAE,0BAA0B;aACnC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG;YACH,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,yCAAyC;SAClD,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACzE,OAAO;YACL,GAAG;YACH,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,8CAA8C;SACvD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,oBAAoB,GAAG,EAAE,EAAE,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared token capture logic via Chrome DevTools Protocol (CDP).
|
|
3
|
+
*
|
|
4
|
+
* Used by both the auto-login and interactive login flows (Playwright-based).
|
|
5
|
+
* Captures skype, bearer, and substrate tokens from intercepted network requests.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TOKEN_INTERCEPT_TIMEOUT: number;
|
|
8
|
+
export declare const PAGE_RELOAD_TIMEOUT: number;
|
|
9
|
+
export declare const PAGE_STATE_POLL_INTERVAL: number;
|
|
10
|
+
export type LogFunction = (...arguments_: unknown[]) => void;
|
|
11
|
+
/**
|
|
12
|
+
* Wait for the page to reach Teams and capture authentication tokens via CDP.
|
|
13
|
+
*
|
|
14
|
+
* Polls the page state periodically to provide diagnostic feedback instead of
|
|
15
|
+
* relying solely on timeouts. Throws a descriptive error if the login flow
|
|
16
|
+
* stalls or reaches an unexpected state.
|
|
17
|
+
*/
|
|
18
|
+
export declare function captureTokensFromPage(page: any, log: LogFunction, interceptTimeout: number): Promise<{
|
|
19
|
+
skypeToken: string;
|
|
20
|
+
region: string | undefined;
|
|
21
|
+
bearerToken: string | undefined;
|
|
22
|
+
substrateToken: string | undefined;
|
|
23
|
+
}>;
|
|
24
|
+
//# sourceMappingURL=token-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-capture.d.ts","sourceRoot":"","sources":["../../src/auth/token-capture.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,uBAAuB,QAAa,CAAC;AAClD,eAAO,MAAM,mBAAmB,QAAa,CAAC;AAC9C,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAElD,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,UAAU,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAE7D;;;;;;GAMG;AAEH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,GAAG,EACT,GAAG,EAAE,WAAW,EAChB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC;IACT,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC,CAAC,CAqID"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared token capture logic via Chrome DevTools Protocol (CDP).
|
|
4
|
+
*
|
|
5
|
+
* Used by both the auto-login and interactive login flows (Playwright-based).
|
|
6
|
+
* Captures skype, bearer, and substrate tokens from intercepted network requests.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PAGE_STATE_POLL_INTERVAL = exports.PAGE_RELOAD_TIMEOUT = exports.TOKEN_INTERCEPT_TIMEOUT = void 0;
|
|
10
|
+
exports.captureTokensFromPage = captureTokensFromPage;
|
|
11
|
+
const region_js_1 = require("../region.js");
|
|
12
|
+
const page_diagnostics_js_1 = require("./page-diagnostics.js");
|
|
13
|
+
exports.TOKEN_INTERCEPT_TIMEOUT = 60 * 1_000;
|
|
14
|
+
exports.PAGE_RELOAD_TIMEOUT = 30 * 1_000;
|
|
15
|
+
exports.PAGE_STATE_POLL_INTERVAL = 3 * 1_000;
|
|
16
|
+
/**
|
|
17
|
+
* Wait for the page to reach Teams and capture authentication tokens via CDP.
|
|
18
|
+
*
|
|
19
|
+
* Polls the page state periodically to provide diagnostic feedback instead of
|
|
20
|
+
* relying solely on timeouts. Throws a descriptive error if the login flow
|
|
21
|
+
* stalls or reaches an unexpected state.
|
|
22
|
+
*/
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
async function captureTokensFromPage(page, log, interceptTimeout) {
|
|
25
|
+
const cdpSession = (await page.context().newCDPSession(page));
|
|
26
|
+
let skypeToken = null;
|
|
27
|
+
let region = null;
|
|
28
|
+
let bearerToken = null;
|
|
29
|
+
let substrateToken = null;
|
|
30
|
+
await cdpSession.send("Fetch.enable", {
|
|
31
|
+
patterns: [
|
|
32
|
+
{ urlPattern: "*teams*", requestStage: "Request" },
|
|
33
|
+
{ urlPattern: "*substrate.office.com*", requestStage: "Request" },
|
|
34
|
+
],
|
|
35
|
+
});
|
|
36
|
+
log("Listening for tokens in network requests...");
|
|
37
|
+
const tokenPromise = new Promise((resolve) => {
|
|
38
|
+
const timeout = setTimeout(() => {
|
|
39
|
+
log("Token intercept timed out");
|
|
40
|
+
resolve();
|
|
41
|
+
}, interceptTimeout);
|
|
42
|
+
cdpSession.on("Fetch.requestPaused", async (event) => {
|
|
43
|
+
const request = event.request;
|
|
44
|
+
const requestId = event.requestId;
|
|
45
|
+
const requestUrl = request.url ?? "";
|
|
46
|
+
const detectedRegion = (0, region_js_1.detectTeamsRegionFromUrl)(requestUrl);
|
|
47
|
+
if (detectedRegion && !region) {
|
|
48
|
+
region = detectedRegion;
|
|
49
|
+
log(`Detected Teams region from request URL: ${region}`);
|
|
50
|
+
}
|
|
51
|
+
for (const [name, value] of Object.entries(request.headers ?? {})) {
|
|
52
|
+
if (name.toLowerCase() === "x-skypetoken" && !skypeToken) {
|
|
53
|
+
skypeToken = value;
|
|
54
|
+
}
|
|
55
|
+
if (name.toLowerCase() === "authorization" &&
|
|
56
|
+
value.startsWith("Bearer ")) {
|
|
57
|
+
if (requestUrl.includes("/api/mt/") && !bearerToken) {
|
|
58
|
+
bearerToken = value.slice("Bearer ".length);
|
|
59
|
+
}
|
|
60
|
+
if (requestUrl.includes("substrate.office.com") &&
|
|
61
|
+
!substrateToken) {
|
|
62
|
+
substrateToken = value.slice("Bearer ".length);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
await cdpSession.send("Fetch.continueRequest", { requestId });
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Request may have already been handled
|
|
71
|
+
}
|
|
72
|
+
if (skypeToken) {
|
|
73
|
+
log("Skype token captured from request headers");
|
|
74
|
+
clearTimeout(timeout);
|
|
75
|
+
resolve();
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
log("Reloading page to intercept token...");
|
|
80
|
+
page
|
|
81
|
+
.reload({ waitUntil: "domcontentloaded", timeout: exports.PAGE_RELOAD_TIMEOUT })
|
|
82
|
+
.catch(() => {
|
|
83
|
+
// Reload may time out, but token should be captured by then
|
|
84
|
+
});
|
|
85
|
+
await tokenPromise;
|
|
86
|
+
// If we have the skype token but not the substrate token yet,
|
|
87
|
+
// wait a bit longer for substrate requests to fire
|
|
88
|
+
if (skypeToken && !substrateToken) {
|
|
89
|
+
log("Waiting for substrate token...");
|
|
90
|
+
await new Promise((resolve) => {
|
|
91
|
+
const extraTimeout = setTimeout(resolve, 5_000);
|
|
92
|
+
const checkInterval = setInterval(() => {
|
|
93
|
+
if (substrateToken) {
|
|
94
|
+
clearTimeout(extraTimeout);
|
|
95
|
+
clearInterval(checkInterval);
|
|
96
|
+
resolve();
|
|
97
|
+
}
|
|
98
|
+
}, 200);
|
|
99
|
+
extraTimeout.unref?.();
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
await cdpSession.send("Fetch.disable");
|
|
103
|
+
await cdpSession.detach();
|
|
104
|
+
if (!skypeToken) {
|
|
105
|
+
const state = await (0, page_diagnostics_js_1.diagnosePageState)(page);
|
|
106
|
+
throw new Error(`Failed to capture skype token. Page state: ${state.phase} — ${state.detail} (URL: ${state.url})`);
|
|
107
|
+
}
|
|
108
|
+
const capturedSkypeToken = skypeToken;
|
|
109
|
+
log(`Token captured (${capturedSkypeToken.length} chars)`);
|
|
110
|
+
if (bearerToken) {
|
|
111
|
+
log("Bearer token also captured for profile resolution");
|
|
112
|
+
}
|
|
113
|
+
if (substrateToken) {
|
|
114
|
+
log("Substrate token also captured for people/chat search");
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
skypeToken,
|
|
118
|
+
region: region ?? undefined,
|
|
119
|
+
bearerToken: bearerToken ?? undefined,
|
|
120
|
+
substrateToken: substrateToken ?? undefined,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=token-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-capture.js","sourceRoot":"","sources":["../../src/auth/token-capture.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -15,7 +15,8 @@ const node_fs_1 = require("node:fs");
|
|
|
15
15
|
const node_path_1 = require("node:path");
|
|
16
16
|
const commander_1 = require("commander");
|
|
17
17
|
const teams_client_js_1 = require("./teams-client.js");
|
|
18
|
-
const
|
|
18
|
+
const definitions_js_1 = require("./actions/definitions.js");
|
|
19
|
+
const formatters_js_1 = require("./actions/formatters.js");
|
|
19
20
|
const VALID_FORMATS = ["json", "text", "md", "toon"];
|
|
20
21
|
const program = new commander_1.Command();
|
|
21
22
|
program
|
|
@@ -76,8 +77,13 @@ function coerceParameter(value, type) {
|
|
|
76
77
|
if (value === undefined)
|
|
77
78
|
return undefined;
|
|
78
79
|
switch (type) {
|
|
79
|
-
case "number":
|
|
80
|
-
|
|
80
|
+
case "number": {
|
|
81
|
+
const parsed = Number(value);
|
|
82
|
+
if (Number.isNaN(parsed)) {
|
|
83
|
+
throw new Error(`Invalid number: "${String(value)}"`);
|
|
84
|
+
}
|
|
85
|
+
return parsed;
|
|
86
|
+
}
|
|
81
87
|
case "boolean":
|
|
82
88
|
return value === true || value === "true";
|
|
83
89
|
default:
|
|
@@ -85,7 +91,7 @@ function coerceParameter(value, type) {
|
|
|
85
91
|
}
|
|
86
92
|
}
|
|
87
93
|
// ── Register actions as CLI commands ──────────────────────────────────
|
|
88
|
-
for (const action of
|
|
94
|
+
for (const action of definitions_js_1.actions) {
|
|
89
95
|
const command = new commander_1.Command(action.name).description(action.description);
|
|
90
96
|
addAuthOptions(command);
|
|
91
97
|
for (const parameter of action.parameters) {
|
|
@@ -140,7 +146,7 @@ for (const action of actions_js_1.actions) {
|
|
|
140
146
|
if (action.name === "get-messages") {
|
|
141
147
|
process.stderr.write("\n");
|
|
142
148
|
}
|
|
143
|
-
const output = (0,
|
|
149
|
+
const output = (0, formatters_js_1.formatOutput)(action, result, outputFormat);
|
|
144
150
|
if (flags.output) {
|
|
145
151
|
const outputPath = (0, node_path_1.resolve)(flags.output);
|
|
146
152
|
(0, node_fs_1.writeFileSync)(outputPath, output, "utf-8");
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;;;;;;;GASG;;AAEH,qCAAwC;AACxC,yCAAoC;AACpC,yCAAoC;AACpC,uDAAgD;AAChD,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared constants used across the codebase.
|
|
3
|
+
*/
|
|
4
|
+
/** Message types that represent user-authored text content. */
|
|
5
|
+
export declare const TEXT_MESSAGE_TYPES: readonly ["RichText/Html", "Text"];
|
|
6
|
+
export type TextMessageType = (typeof TEXT_MESSAGE_TYPES)[number];
|
|
7
|
+
/** Check whether a message type represents user-authored text content. */
|
|
8
|
+
export declare function isTextMessageType(messageType: string): messageType is TextMessageType;
|
|
9
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,+DAA+D;AAC/D,eAAO,MAAM,kBAAkB,oCAAqC,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,GAClB,WAAW,IAAI,eAAe,CAEhC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared constants used across the codebase.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TEXT_MESSAGE_TYPES = void 0;
|
|
7
|
+
exports.isTextMessageType = isTextMessageType;
|
|
8
|
+
/** Message types that represent user-authored text content. */
|
|
9
|
+
exports.TEXT_MESSAGE_TYPES = ["RichText/Html", "Text"];
|
|
10
|
+
/** Check whether a message type represents user-authored text content. */
|
|
11
|
+
function isTextMessageType(messageType) {
|
|
12
|
+
return exports.TEXT_MESSAGE_TYPES.includes(messageType);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAQH,8CAIC;AAVD,+DAA+D;AAClD,QAAA,kBAAkB,GAAG,CAAC,eAAe,EAAE,MAAM,CAAU,CAAC;AAIrE,0EAA0E;AAC1E,SAAgB,iBAAiB,CAC/B,WAAmB;IAEnB,OAAQ,0BAAwC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACzE,CAAC"}
|