teams-api 0.19.3 → 0.19.4
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/README.md
CHANGED
|
@@ -180,6 +180,9 @@ Manual token usage, debug-session auth, and programmatic Node.js usage are cover
|
|
|
180
180
|
| **CLI & MCP server** | Full support | Full support |
|
|
181
181
|
| **Programmatic API** | Full support | Full support |
|
|
182
182
|
|
|
183
|
+
> [!NOTE]
|
|
184
|
+
> **Windows Defender false positive:** Older versions of this package used inline PowerShell to call the Windows DPAPI — a pattern that Windows Defender flags as ransomware-like behavior. This has been replaced with native Windows Credential Manager storage via [keytar](https://github.com/atom/node-keytar). If you hit issues on an older version, upgrade and re-run `teams-api auth --login`. See [SECURITY.md](./SECURITY.md) for details.
|
|
185
|
+
|
|
183
186
|
## Authentication
|
|
184
187
|
|
|
185
188
|
Most users do not need to manage tokens manually.
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* | Platform | Mechanism |
|
|
8
8
|
* |----------|--------------------------------------------------------|
|
|
9
9
|
* | macOS | System Keychain via `security` CLI |
|
|
10
|
-
* | Windows |
|
|
10
|
+
* | Windows | Windows Credential Manager via keytar (native wincred) |
|
|
11
11
|
* | Linux | `secret-tool` (libsecret) if available, else file with |
|
|
12
12
|
* | | 0o600 perms at ~/.config/teams-api/ |
|
|
13
13
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAcH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;
|
|
1
|
+
{"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAcH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAqOD,wBAAgB,qBAAqB,IAAI,eAAe,CASvD"}
|
package/dist/credential-store.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* | Platform | Mechanism |
|
|
9
9
|
* |----------|--------------------------------------------------------|
|
|
10
10
|
* | macOS | System Keychain via `security` CLI |
|
|
11
|
-
* | Windows |
|
|
11
|
+
* | Windows | Windows Credential Manager via keytar (native wincred) |
|
|
12
12
|
* | Linux | `secret-tool` (libsecret) if available, else file with |
|
|
13
13
|
* | | 0o600 perms at ~/.config/teams-api/ |
|
|
14
14
|
*/
|
|
@@ -20,7 +20,7 @@ const node_os_1 = require("node:os");
|
|
|
20
20
|
const node_path_1 = require("node:path");
|
|
21
21
|
const node_crypto_1 = require("node:crypto");
|
|
22
22
|
// ── macOS: System Keychain ────────────────────────────────────────────
|
|
23
|
-
const
|
|
23
|
+
const CREDENTIAL_SERVICE = "teams-api";
|
|
24
24
|
class KeychainStore {
|
|
25
25
|
save(account, data) {
|
|
26
26
|
(0, node_child_process_1.execFileSync)("security", [
|
|
@@ -28,7 +28,7 @@ class KeychainStore {
|
|
|
28
28
|
"-a",
|
|
29
29
|
account,
|
|
30
30
|
"-s",
|
|
31
|
-
|
|
31
|
+
CREDENTIAL_SERVICE,
|
|
32
32
|
"-w",
|
|
33
33
|
data,
|
|
34
34
|
"-U",
|
|
@@ -36,7 +36,7 @@ class KeychainStore {
|
|
|
36
36
|
}
|
|
37
37
|
load(account) {
|
|
38
38
|
try {
|
|
39
|
-
return (0, node_child_process_1.execFileSync)("security", ["find-generic-password", "-a", account, "-s",
|
|
39
|
+
return (0, node_child_process_1.execFileSync)("security", ["find-generic-password", "-a", account, "-s", CREDENTIAL_SERVICE, "-w"], { encoding: "utf-8" }).trim();
|
|
40
40
|
}
|
|
41
41
|
catch {
|
|
42
42
|
return null;
|
|
@@ -49,7 +49,7 @@ class KeychainStore {
|
|
|
49
49
|
"-a",
|
|
50
50
|
account,
|
|
51
51
|
"-s",
|
|
52
|
-
|
|
52
|
+
CREDENTIAL_SERVICE,
|
|
53
53
|
]);
|
|
54
54
|
}
|
|
55
55
|
catch {
|
|
@@ -57,70 +57,50 @@ class KeychainStore {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
|
-
// ── Windows:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
// ── Windows: Windows Credential Manager via keytar ───────────────────
|
|
61
|
+
//
|
|
62
|
+
// The previous implementation spawned PowerShell with an inline script that
|
|
63
|
+
// loaded System.Security.Cryptography.ProtectedData to call DPAPI.
|
|
64
|
+
// That pattern (PowerShell + Add-Type + Protect/Unprotect on binary data) is
|
|
65
|
+
// a textbook ransomware behavioral signature and is reliably flagged by
|
|
66
|
+
// Windows Defender. keytar calls the native wincred API directly from C++,
|
|
67
|
+
// with no PowerShell or inline scripting involved.
|
|
68
|
+
function accountKey(account) {
|
|
69
|
+
return (0, node_crypto_1.createHash)("sha256").update(account).digest("hex");
|
|
65
70
|
}
|
|
66
71
|
function accountToFileName(account) {
|
|
67
72
|
return (0, node_crypto_1.createHash)("sha256").update(account).digest("hex") + ".dat";
|
|
68
73
|
}
|
|
69
74
|
class WinCredStore {
|
|
70
|
-
getFilePath(account) {
|
|
71
|
-
const dir = getWindowsStorePath();
|
|
72
|
-
return (0, node_path_1.join)(dir, accountToFileName(account));
|
|
73
|
-
}
|
|
74
|
-
ensureDir() {
|
|
75
|
-
const dir = getWindowsStorePath();
|
|
76
|
-
if (!(0, node_fs_1.existsSync)(dir)) {
|
|
77
|
-
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
75
|
save(account, data) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
"
|
|
86
|
-
|
|
87
|
-
`Add-Type -AssemblyName System.Security; ` +
|
|
88
|
-
`$bytes = [System.Convert]::FromBase64String('${base64Input}'); ` +
|
|
89
|
-
`$encrypted = [System.Security.Cryptography.ProtectedData]::Protect($bytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser); ` +
|
|
90
|
-
`[System.Convert]::ToBase64String($encrypted)`,
|
|
91
|
-
], { encoding: "utf-8" }).trim();
|
|
92
|
-
(0, node_fs_1.writeFileSync)(this.getFilePath(account), encrypted, { encoding: "utf-8" });
|
|
76
|
+
// keytar is async; run it in a child Node process so the sync interface
|
|
77
|
+
// is preserved without requiring top-level async.
|
|
78
|
+
(0, node_child_process_1.execFileSync)(process.execPath, [
|
|
79
|
+
"-e",
|
|
80
|
+
`const k = require("keytar"); k.setPassword(${JSON.stringify(CREDENTIAL_SERVICE)}, ${JSON.stringify(accountKey(account))}, ${JSON.stringify(data)}).catch(e => { process.stderr.write(e.message); process.exit(1); });`,
|
|
81
|
+
], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
93
82
|
}
|
|
94
83
|
load(account) {
|
|
95
|
-
const filePath = this.getFilePath(account);
|
|
96
|
-
if (!(0, node_fs_1.existsSync)(filePath)) {
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
84
|
try {
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
"
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
`$encrypted = [System.Convert]::FromBase64String('${encrypted}'); ` +
|
|
106
|
-
`$bytes = [System.Security.Cryptography.ProtectedData]::Unprotect($encrypted, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser); ` +
|
|
107
|
-
`[System.Text.Encoding]::UTF8.GetString($bytes)`,
|
|
108
|
-
], { encoding: "utf-8" }).trim();
|
|
109
|
-
return decrypted;
|
|
85
|
+
const result = (0, node_child_process_1.execFileSync)(process.execPath, [
|
|
86
|
+
"-e",
|
|
87
|
+
`const k = require("keytar"); k.getPassword(${JSON.stringify(CREDENTIAL_SERVICE)}, ${JSON.stringify(accountKey(account))}).then(v => { if (v !== null) process.stdout.write(v); }).catch(e => { process.stderr.write(e.message); process.exit(1); });`,
|
|
88
|
+
], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
89
|
+
return result === "" ? null : result;
|
|
110
90
|
}
|
|
111
91
|
catch {
|
|
112
|
-
// Encrypted data may be corrupted or from a different user
|
|
113
|
-
this.clear(account);
|
|
114
92
|
return null;
|
|
115
93
|
}
|
|
116
94
|
}
|
|
117
95
|
clear(account) {
|
|
118
|
-
const filePath = this.getFilePath(account);
|
|
119
96
|
try {
|
|
120
|
-
(0,
|
|
97
|
+
(0, node_child_process_1.execFileSync)(process.execPath, [
|
|
98
|
+
"-e",
|
|
99
|
+
`const k = require("keytar"); k.deletePassword(${JSON.stringify(CREDENTIAL_SERVICE)}, ${JSON.stringify(accountKey(account))}).catch(e => { process.stderr.write(e.message); process.exit(1); });`,
|
|
100
|
+
], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
121
101
|
}
|
|
122
102
|
catch {
|
|
123
|
-
//
|
|
103
|
+
// Entry may not exist
|
|
124
104
|
}
|
|
125
105
|
}
|
|
126
106
|
}
|
|
@@ -161,7 +141,7 @@ class LinuxStore {
|
|
|
161
141
|
"--label",
|
|
162
142
|
"teams-api",
|
|
163
143
|
"service",
|
|
164
|
-
|
|
144
|
+
CREDENTIAL_SERVICE,
|
|
165
145
|
"account",
|
|
166
146
|
account,
|
|
167
147
|
], { input: data, encoding: "utf-8" });
|
|
@@ -181,7 +161,7 @@ class LinuxStore {
|
|
|
181
161
|
load(account) {
|
|
182
162
|
if (this.useSecretTool) {
|
|
183
163
|
try {
|
|
184
|
-
return (0, node_child_process_1.execFileSync)("secret-tool", ["lookup", "service",
|
|
164
|
+
return (0, node_child_process_1.execFileSync)("secret-tool", ["lookup", "service", CREDENTIAL_SERVICE, "account", account], { encoding: "utf-8" }).trim();
|
|
185
165
|
}
|
|
186
166
|
catch {
|
|
187
167
|
// Secret not found or secret-tool failed
|
|
@@ -205,7 +185,7 @@ class LinuxStore {
|
|
|
205
185
|
(0, node_child_process_1.execFileSync)("secret-tool", [
|
|
206
186
|
"clear",
|
|
207
187
|
"service",
|
|
208
|
-
|
|
188
|
+
CREDENTIAL_SERVICE,
|
|
209
189
|
"account",
|
|
210
190
|
account,
|
|
211
191
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;
|
|
1
|
+
{"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAuPH,sDASC;AA9PD,2DAAkD;AAClD,qCAMiB;AACjB,qCAAkC;AAClC,yCAAiC;AACjC,6CAAyC;AAQzC,yEAAyE;AAEzE,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAEvC,MAAM,aAAa;IACjB,IAAI,CAAC,OAAe,EAAE,IAAY;QAChC,IAAA,iCAAY,EAAC,UAAU,EAAE;YACvB,sBAAsB;YACtB,IAAI;YACJ,OAAO;YACP,IAAI;YACJ,kBAAkB;YAClB,IAAI;YACJ,IAAI;YACJ,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC;YACH,OAAO,IAAA,iCAAY,EACjB,UAAU,EACV,CAAC,uBAAuB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,CAAC,EACxE,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC,IAAI,EAAE,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,CAAC;YACH,IAAA,iCAAY,EAAC,UAAU,EAAE;gBACvB,yBAAyB;gBACzB,IAAI;gBACJ,OAAO;gBACP,IAAI;gBACJ,kBAAkB;aACnB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;CACF;AAED,wEAAwE;AACxE,EAAE;AACF,4EAA4E;AAC5E,mEAAmE;AACnE,6EAA6E;AAC7E,wEAAwE;AACxE,2EAA2E;AAC3E,mDAAmD;AAEnD,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;AACrE,CAAC;AAED,MAAM,YAAY;IAChB,IAAI,CAAC,OAAe,EAAE,IAAY;QAChC,wEAAwE;QACxE,kDAAkD;QAClD,IAAA,iCAAY,EACV,OAAO,CAAC,QAAQ,EAChB;YACE,IAAI;YACJ,8CAA8C,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,sEAAsE;SACxN,EACD,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACvD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,iCAAY,EACzB,OAAO,CAAC,QAAQ,EAChB;gBACE,IAAI;gBACJ,8CAA8C,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,8HAA8H;aACvP,EACD,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACvD,CAAC,IAAI,EAAE,CAAC;YACT,OAAO,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,CAAC;YACH,IAAA,iCAAY,EACV,OAAO,CAAC,QAAQ,EAChB;gBACE,IAAI;gBACJ,iDAAiD,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,sEAAsE;aAClM,EACD,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACvD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;CACF;AAED,wEAAwE;AAExE,SAAS,iBAAiB;IACxB,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAA,gBAAI,EAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAA,iBAAO,GAAE,EAAE,SAAS,CAAC,CAAC;IAChF,OAAO,IAAA,gBAAI,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,IAAA,iCAAY,EAAC,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU;IACN,aAAa,CAAU;IAE/B;QACE,IAAI,CAAC,aAAa,GAAG,aAAa,EAAE,CAAC;IACvC,CAAC;IAEO,WAAW,CAAC,OAAe;QACjC,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,OAAO,IAAA,gBAAI,EAAC,GAAG,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC;IAEO,SAAS;QACf,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,IAAI,CAAC,IAAA,oBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;YACrB,IAAA,mBAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAY;QAChC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,IAAA,iCAAY,EACV,aAAa,EACb;oBACE,OAAO;oBACP,SAAS;oBACT,WAAW;oBACX,SAAS;oBACT,kBAAkB;oBAClB,SAAS;oBACT,OAAO;iBACR,EACD,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CACnC,CAAC;gBACF,OAAO;YACT,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;gBACrC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAA,uBAAa,EAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE;YAC7C,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,OAAO,IAAA,iCAAY,EACjB,aAAa,EACb,CAAC,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,OAAO,CAAC,EAC7D,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC,IAAI,EAAE,CAAC;YACX,CAAC;YAAC,MAAM,CAAC;gBACP,yCAAyC;gBACzC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAA,oBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,OAAO,IAAA,sBAAY,EAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,IAAA,iCAAY,EAAC,aAAa,EAAE;oBAC1B,OAAO;oBACP,SAAS;oBACT,kBAAkB;oBAClB,SAAS;oBACT,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,IAAA,oBAAU,EAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;CACF;AAED,wEAAwE;AAExE,SAAgB,qBAAqB;IACnC,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B;YACE,OAAO,IAAI,UAAU,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "teams-api",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.4",
|
|
4
4
|
"description": "AI-native Microsoft Teams integration — read conversations, send messages, manage members via the Teams Chat Service REST API",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"repository": {
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
53
53
|
"commander": "^14.0.3",
|
|
54
|
+
"keytar": "^7.9.0",
|
|
54
55
|
"markdown-it": "^14.1.1",
|
|
55
56
|
"playwright": "^1.58.2",
|
|
56
57
|
"puppeteer-core": "^24.39.1",
|