@jbctechsolutions/mcp-office365 2.5.1 → 3.0.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/README.md +32 -0
- package/dist/approval/token-manager.d.ts +28 -16
- package/dist/approval/token-manager.d.ts.map +1 -1
- package/dist/approval/token-manager.js +125 -37
- package/dist/approval/token-manager.js.map +1 -1
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +85 -2
- package/dist/cli.js.map +1 -1
- package/dist/graph/auth/config.d.ts +1 -1
- package/dist/graph/auth/config.d.ts.map +1 -1
- package/dist/graph/auth/config.js +5 -1
- package/dist/graph/auth/config.js.map +1 -1
- package/dist/graph/auth/device-code-flow.d.ts +3 -1
- package/dist/graph/auth/device-code-flow.d.ts.map +1 -1
- package/dist/graph/auth/device-code-flow.js +42 -14
- package/dist/graph/auth/device-code-flow.js.map +1 -1
- package/dist/graph/auth/token-cache.js +2 -2
- package/dist/graph/auth/token-cache.js.map +1 -1
- package/dist/graph/client/graph-client.d.ts +36 -8
- package/dist/graph/client/graph-client.d.ts.map +1 -1
- package/dist/graph/client/graph-client.js +128 -36
- package/dist/graph/client/graph-client.js.map +1 -1
- package/dist/graph/repository.d.ts +9 -6
- package/dist/graph/repository.d.ts.map +1 -1
- package/dist/graph/repository.js +63 -66
- package/dist/graph/repository.js.map +1 -1
- package/dist/ids/mint.d.ts +31 -0
- package/dist/ids/mint.d.ts.map +1 -0
- package/dist/ids/mint.js +36 -0
- package/dist/ids/mint.js.map +1 -0
- package/dist/ids/resolver.d.ts +30 -0
- package/dist/ids/resolver.d.ts.map +1 -0
- package/dist/ids/resolver.js +37 -0
- package/dist/ids/resolver.js.map +1 -0
- package/dist/ids/token.d.ts +56 -0
- package/dist/ids/token.d.ts.map +1 -0
- package/dist/ids/token.js +186 -0
- package/dist/ids/token.js.map +1 -0
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +226 -5859
- package/dist/index.js.map +1 -1
- package/dist/registry/all-tools.d.ts +14 -0
- package/dist/registry/all-tools.d.ts.map +1 -0
- package/dist/registry/all-tools.js +64 -0
- package/dist/registry/all-tools.js.map +1 -0
- package/dist/registry/context.d.ts +25 -0
- package/dist/registry/context.d.ts.map +1 -0
- package/dist/registry/context.js +31 -0
- package/dist/registry/context.js.map +1 -0
- package/dist/registry/define-tool.d.ts +15 -0
- package/dist/registry/define-tool.d.ts.map +1 -0
- package/dist/registry/define-tool.js +8 -0
- package/dist/registry/define-tool.js.map +1 -0
- package/dist/registry/index.d.ts +13 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/registry.d.ts +62 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +134 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/types.d.ts +98 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +6 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/search/compiler.d.ts +49 -0
- package/dist/search/compiler.d.ts.map +1 -0
- package/dist/search/compiler.js +168 -0
- package/dist/search/compiler.js.map +1 -0
- package/dist/signature.js +2 -2
- package/dist/signature.js.map +1 -1
- package/dist/state/migrate.d.ts +23 -0
- package/dist/state/migrate.d.ts.map +1 -0
- package/dist/state/migrate.js +81 -0
- package/dist/state/migrate.js.map +1 -0
- package/dist/state/schema.d.ts +27 -0
- package/dist/state/schema.d.ts.map +1 -0
- package/dist/state/schema.js +54 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/state/store.d.ts +152 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +317 -0
- package/dist/state/store.js.map +1 -0
- package/dist/tools/accounts.d.ts +37 -0
- package/dist/tools/accounts.d.ts.map +1 -0
- package/dist/tools/accounts.js +68 -0
- package/dist/tools/accounts.js.map +1 -0
- package/dist/tools/calendar-apple.d.ts +39 -0
- package/dist/tools/calendar-apple.d.ts.map +1 -0
- package/dist/tools/calendar-apple.js +159 -0
- package/dist/tools/calendar-apple.js.map +1 -0
- package/dist/tools/calendar-graph.d.ts +41 -0
- package/dist/tools/calendar-graph.d.ts.map +1 -0
- package/dist/tools/calendar-graph.js +298 -0
- package/dist/tools/calendar-graph.js.map +1 -0
- package/dist/tools/calendar-permissions.d.ts +10 -0
- package/dist/tools/calendar-permissions.d.ts.map +1 -1
- package/dist/tools/calendar-permissions.js +53 -0
- package/dist/tools/calendar-permissions.js.map +1 -1
- package/dist/tools/calendar.d.ts +151 -0
- package/dist/tools/calendar.d.ts.map +1 -1
- package/dist/tools/calendar.js +274 -0
- package/dist/tools/calendar.js.map +1 -1
- package/dist/tools/categories.d.ts +10 -0
- package/dist/tools/categories.d.ts.map +1 -1
- package/dist/tools/categories.js +54 -0
- package/dist/tools/categories.js.map +1 -1
- package/dist/tools/checklist-items.d.ts +10 -0
- package/dist/tools/checklist-items.d.ts.map +1 -1
- package/dist/tools/checklist-items.js +63 -0
- package/dist/tools/checklist-items.js.map +1 -1
- package/dist/tools/contact-folders.d.ts +50 -0
- package/dist/tools/contact-folders.d.ts.map +1 -0
- package/dist/tools/contact-folders.js +133 -0
- package/dist/tools/contact-folders.js.map +1 -0
- package/dist/tools/contacts-graph.d.ts +45 -0
- package/dist/tools/contacts-graph.d.ts.map +1 -0
- package/dist/tools/contacts-graph.js +172 -0
- package/dist/tools/contacts-graph.js.map +1 -0
- package/dist/tools/contacts.d.ts +66 -0
- package/dist/tools/contacts.d.ts.map +1 -1
- package/dist/tools/contacts.js +165 -0
- package/dist/tools/contacts.js.map +1 -1
- package/dist/tools/excel.d.ts +10 -0
- package/dist/tools/excel.d.ts.map +1 -1
- package/dist/tools/excel.js +73 -0
- package/dist/tools/excel.js.map +1 -1
- package/dist/tools/focused-overrides.d.ts +10 -0
- package/dist/tools/focused-overrides.d.ts.map +1 -1
- package/dist/tools/focused-overrides.js +54 -0
- package/dist/tools/focused-overrides.js.map +1 -1
- package/dist/tools/linked-resources.d.ts +10 -0
- package/dist/tools/linked-resources.d.ts.map +1 -1
- package/dist/tools/linked-resources.js +53 -0
- package/dist/tools/linked-resources.js.map +1 -1
- package/dist/tools/mail-apple.d.ts +40 -0
- package/dist/tools/mail-apple.d.ts.map +1 -0
- package/dist/tools/mail-apple.js +146 -0
- package/dist/tools/mail-apple.js.map +1 -0
- package/dist/tools/mail-graph.d.ts +38 -0
- package/dist/tools/mail-graph.d.ts.map +1 -0
- package/dist/tools/mail-graph.js +178 -0
- package/dist/tools/mail-graph.js.map +1 -0
- package/dist/tools/mail-rules.d.ts +12 -0
- package/dist/tools/mail-rules.d.ts.map +1 -1
- package/dist/tools/mail-rules.js +56 -0
- package/dist/tools/mail-rules.js.map +1 -1
- package/dist/tools/mail-send.d.ts +12 -0
- package/dist/tools/mail-send.d.ts.map +1 -1
- package/dist/tools/mail-send.js +219 -5
- package/dist/tools/mail-send.js.map +1 -1
- package/dist/tools/mail.d.ts +82 -2
- package/dist/tools/mail.d.ts.map +1 -1
- package/dist/tools/mail.js +239 -2
- package/dist/tools/mail.js.map +1 -1
- package/dist/tools/mailbox-organization.d.ts +20 -0
- package/dist/tools/mailbox-organization.d.ts.map +1 -1
- package/dist/tools/mailbox-organization.js +275 -0
- package/dist/tools/mailbox-organization.js.map +1 -1
- package/dist/tools/mailbox-settings.d.ts +59 -0
- package/dist/tools/mailbox-settings.d.ts.map +1 -0
- package/dist/tools/mailbox-settings.js +136 -0
- package/dist/tools/mailbox-settings.js.map +1 -0
- package/dist/tools/meetings.d.ts +10 -0
- package/dist/tools/meetings.d.ts.map +1 -1
- package/dist/tools/meetings.js +74 -0
- package/dist/tools/meetings.js.map +1 -1
- package/dist/tools/notes.d.ts +12 -0
- package/dist/tools/notes.d.ts.map +1 -1
- package/dist/tools/notes.js +66 -0
- package/dist/tools/notes.js.map +1 -1
- package/dist/tools/onedrive.d.ts +10 -0
- package/dist/tools/onedrive.d.ts.map +1 -1
- package/dist/tools/onedrive.js +124 -0
- package/dist/tools/onedrive.js.map +1 -1
- package/dist/tools/people.d.ts +10 -0
- package/dist/tools/people.d.ts.map +1 -1
- package/dist/tools/people.js +94 -0
- package/dist/tools/people.js.map +1 -1
- package/dist/tools/planner-visualization.d.ts +10 -0
- package/dist/tools/planner-visualization.d.ts.map +1 -1
- package/dist/tools/planner-visualization.js +53 -0
- package/dist/tools/planner-visualization.js.map +1 -1
- package/dist/tools/planner.d.ts +10 -0
- package/dist/tools/planner.d.ts.map +1 -1
- package/dist/tools/planner.js +183 -0
- package/dist/tools/planner.js.map +1 -1
- package/dist/tools/scheduling.d.ts +12 -0
- package/dist/tools/scheduling.d.ts.map +1 -1
- package/dist/tools/scheduling.js +38 -0
- package/dist/tools/scheduling.js.map +1 -1
- package/dist/tools/sharepoint.d.ts +10 -0
- package/dist/tools/sharepoint.d.ts.map +1 -1
- package/dist/tools/sharepoint.js +74 -0
- package/dist/tools/sharepoint.js.map +1 -1
- package/dist/tools/task-attachments.d.ts +10 -0
- package/dist/tools/task-attachments.d.ts.map +1 -1
- package/dist/tools/task-attachments.js +53 -0
- package/dist/tools/task-attachments.js.map +1 -1
- package/dist/tools/task-lists.d.ts +56 -0
- package/dist/tools/task-lists.d.ts.map +1 -0
- package/dist/tools/task-lists.js +151 -0
- package/dist/tools/task-lists.js.map +1 -0
- package/dist/tools/tasks-graph.d.ts +49 -0
- package/dist/tools/tasks-graph.d.ts.map +1 -0
- package/dist/tools/tasks-graph.js +191 -0
- package/dist/tools/tasks-graph.js.map +1 -0
- package/dist/tools/tasks.d.ts +127 -0
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +155 -0
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/teams.d.ts +11 -0
- package/dist/tools/teams.d.ts.map +1 -1
- package/dist/tools/teams.js +254 -0
- package/dist/tools/teams.js.map +1 -1
- package/dist/utils/errors.d.ts +96 -5
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +227 -8
- package/dist/utils/errors.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -65,6 +65,38 @@ npx @jbctechsolutions/mcp-office365 auth --status
|
|
|
65
65
|
npx @jbctechsolutions/mcp-office365 auth --logout
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
+
### Server flags
|
|
69
|
+
|
|
70
|
+
Pass these when launching the server (after any subcommand) to scope the exposed
|
|
71
|
+
tool surface:
|
|
72
|
+
|
|
73
|
+
| Flag | Effect |
|
|
74
|
+
| --- | --- |
|
|
75
|
+
| `--preset <names>` | Expose only the listed domains (comma-separated). Repeatable. Default (or `all`) exposes the full surface. |
|
|
76
|
+
| `--read-only` | Expose only read tools (`readOnlyHint: true`). All writes, `prepare_*`/`confirm_*`, and destructive tools are hidden; calling one returns a `READ_ONLY_MODE` error. Note: `download_*` and `get_*_photo` tools are excluded too — they write fetched bytes to local disk and so are not read-only. |
|
|
77
|
+
|
|
78
|
+
Valid presets: `mail`, `calendar`, `contacts`, `tasks`, `notes`, `teams`,
|
|
79
|
+
`planner`, `files`, `sharepoint`, `excel`, `people`, `meetings` (plus `all`).
|
|
80
|
+
An unknown preset name fails startup with the valid list.
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Mail + calendar only, read-only
|
|
84
|
+
npx @jbctechsolutions/mcp-office365 --preset mail,calendar --read-only
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
In a client config, add them to `args`:
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"mcpServers": {
|
|
92
|
+
"office365": {
|
|
93
|
+
"command": "npx",
|
|
94
|
+
"args": ["-y", "@jbctechsolutions/mcp-office365", "--preset", "mail,calendar", "--read-only"]
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
68
100
|
### Claude Desktop configuration
|
|
69
101
|
|
|
70
102
|
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|
@@ -2,17 +2,26 @@
|
|
|
2
2
|
* Copyright (c) 2026 JBC Tech Solutions, LLC
|
|
3
3
|
* Licensed under the MIT License. See LICENSE file in the project root.
|
|
4
4
|
*/
|
|
5
|
+
import type { StateStore } from '../state/store.js';
|
|
5
6
|
import type { OperationType, TargetType, ApprovalToken, ValidationResult } from './types.js';
|
|
6
|
-
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
/** Options for {@link ApprovalTokenManager}. */
|
|
8
|
+
export interface ApprovalTokenManagerOptions {
|
|
9
|
+
/** Token lifetime (default 24h). */
|
|
10
|
+
ttlMs?: number;
|
|
11
|
+
/** Durable store; omit for in-memory (tests / degraded mode). */
|
|
12
|
+
store?: StateStore;
|
|
13
|
+
/** Account stamp for stored tokens (D7). Single-account server for v3.0.0. */
|
|
14
|
+
accountId?: string;
|
|
15
|
+
/** Clock, for deterministic tests. */
|
|
16
|
+
now?: () => number;
|
|
17
|
+
}
|
|
12
18
|
export declare class ApprovalTokenManager {
|
|
13
19
|
private readonly tokens;
|
|
14
20
|
private readonly ttlMs;
|
|
15
|
-
|
|
21
|
+
private readonly store;
|
|
22
|
+
private readonly accountId;
|
|
23
|
+
private readonly now;
|
|
24
|
+
constructor(options?: ApprovalTokenManagerOptions | number);
|
|
16
25
|
/**
|
|
17
26
|
* Generates a new approval token for a destructive operation.
|
|
18
27
|
*/
|
|
@@ -24,27 +33,30 @@ export declare class ApprovalTokenManager {
|
|
|
24
33
|
metadata?: Record<string, unknown>;
|
|
25
34
|
}): ApprovalToken;
|
|
26
35
|
/**
|
|
27
|
-
* Looks up a token by ID without consuming or validating it.
|
|
28
|
-
*
|
|
36
|
+
* Looks up a token by ID without consuming or validating it. Returns undefined
|
|
37
|
+
* if the token does not exist (or belongs to another account, when durable).
|
|
29
38
|
*/
|
|
30
39
|
lookupToken(tokenId: string): ApprovalToken | undefined;
|
|
31
40
|
/**
|
|
32
|
-
* Validates a token without consuming it
|
|
33
|
-
*
|
|
41
|
+
* Validates a token without consuming it. Checks existence, prior redemption,
|
|
42
|
+
* expiry, operation match, and target match.
|
|
34
43
|
*/
|
|
35
44
|
validateToken(tokenId: string, operation: OperationType, targetId: number): ValidationResult;
|
|
45
|
+
private check;
|
|
36
46
|
/**
|
|
37
|
-
* Validates and consumes a token (one-time use).
|
|
38
|
-
*
|
|
47
|
+
* Validates and consumes a token (one-time use). Durable stores use an atomic
|
|
48
|
+
* guarded consume so only one caller — across processes sharing the db — can
|
|
49
|
+
* redeem it; a losing/repeat caller gets `ALREADY_CONSUMED` (D8).
|
|
39
50
|
*/
|
|
40
51
|
consumeToken(tokenId: string, operation: OperationType, targetId: number): ValidationResult;
|
|
41
52
|
/**
|
|
42
|
-
* Removes
|
|
53
|
+
* Removes expired tokens from the in-memory store. Durable stores purge on
|
|
54
|
+
* boot (90-day retention), so this is a no-op there.
|
|
43
55
|
*/
|
|
44
56
|
cleanupExpiredTokens(): void;
|
|
45
57
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
58
|
+
* Number of active in-memory tokens (testing/monitoring). Durable tokens are
|
|
59
|
+
* not counted here — they live in the store.
|
|
48
60
|
*/
|
|
49
61
|
get size(): number;
|
|
50
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/approval/token-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/approval/token-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAa7F,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,OAAO,GAAE,2BAA2B,GAAG,MAAW;IAS9D;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE;QACpB,SAAS,EAAE,aAAa,CAAC;QACzB,UAAU,EAAE,UAAU,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GAAG,aAAa;IAsCjB;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAQvD;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IAyB5F,OAAO,CAAC,KAAK;IAeb;;;;OAIG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IA4B3F;;;OAGG;IACH,oBAAoB,IAAI,IAAI;IAY5B;;;OAGG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -3,41 +3,38 @@
|
|
|
3
3
|
* Licensed under the MIT License. See LICENSE file in the project root.
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
|
-
* Approval token manager.
|
|
6
|
+
* Approval token manager (U9). Manages the lifecycle of two-phase approval
|
|
7
|
+
* tokens: generation, validation, and atomic single-use consumption.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
9
|
+
* When a durable {@link StateStore} is supplied (production), tokens persist to
|
|
10
|
+
* SQLite with a 24h TTL and are consumed via an atomic guarded write (D8), so an
|
|
11
|
+
* approval prepared in one process/session survives a restart and can be
|
|
12
|
+
* redeemed exactly once — even across concurrent Claude Code windows. Without a
|
|
13
|
+
* store (tests / degraded mode) it falls back to an in-memory map, preserving
|
|
14
|
+
* the original behavior and public surface.
|
|
10
15
|
*/
|
|
11
16
|
import { randomUUID } from 'node:crypto';
|
|
12
|
-
//
|
|
13
|
-
// Constants
|
|
14
|
-
// =============================================================================
|
|
15
|
-
const DEFAULT_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
17
|
+
const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000; // 24h (D8, up from 5 minutes)
|
|
16
18
|
const CLEANUP_THRESHOLD = 100;
|
|
17
|
-
// =============================================================================
|
|
18
|
-
// Token Manager
|
|
19
|
-
// =============================================================================
|
|
20
|
-
/**
|
|
21
|
-
* Manages approval tokens for destructive operations.
|
|
22
|
-
*
|
|
23
|
-
* Tokens are stored in memory and are single-use. They expire
|
|
24
|
-
* after a configurable TTL (default 5 minutes).
|
|
25
|
-
*/
|
|
26
19
|
export class ApprovalTokenManager {
|
|
27
20
|
tokens = new Map();
|
|
28
21
|
ttlMs;
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
store;
|
|
23
|
+
accountId;
|
|
24
|
+
now;
|
|
25
|
+
constructor(options = {}) {
|
|
26
|
+
// Back-compat: some call sites/tests pass a bare ttlMs number.
|
|
27
|
+
const opts = typeof options === 'number' ? { ttlMs: options } : options;
|
|
28
|
+
this.ttlMs = opts.ttlMs ?? DEFAULT_TTL_MS;
|
|
29
|
+
this.store = opts.store;
|
|
30
|
+
this.accountId = opts.accountId ?? 'default';
|
|
31
|
+
this.now = opts.now ?? (() => Date.now());
|
|
31
32
|
}
|
|
32
33
|
/**
|
|
33
34
|
* Generates a new approval token for a destructive operation.
|
|
34
35
|
*/
|
|
35
36
|
generateToken(params) {
|
|
36
|
-
|
|
37
|
-
if (this.tokens.size > CLEANUP_THRESHOLD) {
|
|
38
|
-
this.cleanupExpiredTokens();
|
|
39
|
-
}
|
|
40
|
-
const now = Date.now();
|
|
37
|
+
const now = this.now();
|
|
41
38
|
const token = {
|
|
42
39
|
tokenId: randomUUID(),
|
|
43
40
|
operation: params.operation,
|
|
@@ -48,26 +45,73 @@ export class ApprovalTokenManager {
|
|
|
48
45
|
expiresAt: now + this.ttlMs,
|
|
49
46
|
metadata: Object.freeze({ ...params.metadata }),
|
|
50
47
|
};
|
|
51
|
-
this.
|
|
48
|
+
if (this.store != null) {
|
|
49
|
+
const target = {
|
|
50
|
+
targetType: token.targetType,
|
|
51
|
+
targetId: token.targetId,
|
|
52
|
+
targetHash: token.targetHash,
|
|
53
|
+
metadata: { ...token.metadata },
|
|
54
|
+
};
|
|
55
|
+
this.store.putApprovalToken({
|
|
56
|
+
token: token.tokenId,
|
|
57
|
+
action: token.operation,
|
|
58
|
+
targetJson: JSON.stringify(target),
|
|
59
|
+
contentHash: token.targetHash,
|
|
60
|
+
accountId: this.accountId,
|
|
61
|
+
expiresAt: token.expiresAt,
|
|
62
|
+
createdAt: token.createdAt,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
if (this.tokens.size > CLEANUP_THRESHOLD) {
|
|
67
|
+
this.cleanupExpiredTokens();
|
|
68
|
+
}
|
|
69
|
+
this.tokens.set(token.tokenId, token);
|
|
70
|
+
}
|
|
52
71
|
return token;
|
|
53
72
|
}
|
|
54
73
|
/**
|
|
55
|
-
* Looks up a token by ID without consuming or validating it.
|
|
56
|
-
*
|
|
74
|
+
* Looks up a token by ID without consuming or validating it. Returns undefined
|
|
75
|
+
* if the token does not exist (or belongs to another account, when durable).
|
|
57
76
|
*/
|
|
58
77
|
lookupToken(tokenId) {
|
|
78
|
+
if (this.store != null) {
|
|
79
|
+
const row = this.store.getApprovalToken(tokenId, this.accountId);
|
|
80
|
+
return row != null ? (rowToToken(row) ?? undefined) : undefined;
|
|
81
|
+
}
|
|
59
82
|
return this.tokens.get(tokenId);
|
|
60
83
|
}
|
|
61
84
|
/**
|
|
62
|
-
* Validates a token without consuming it
|
|
63
|
-
*
|
|
85
|
+
* Validates a token without consuming it. Checks existence, prior redemption,
|
|
86
|
+
* expiry, operation match, and target match.
|
|
64
87
|
*/
|
|
65
88
|
validateToken(tokenId, operation, targetId) {
|
|
89
|
+
if (this.store != null) {
|
|
90
|
+
const row = this.store.getApprovalToken(tokenId, this.accountId);
|
|
91
|
+
if (row == null) {
|
|
92
|
+
return { valid: false, error: 'NOT_FOUND' };
|
|
93
|
+
}
|
|
94
|
+
if (row.redeemedAt != null) {
|
|
95
|
+
return { valid: false, error: 'ALREADY_CONSUMED' };
|
|
96
|
+
}
|
|
97
|
+
const token = rowToToken(row);
|
|
98
|
+
// A corrupt/tampered target_json fails closed as NOT_FOUND rather than
|
|
99
|
+
// throwing out of validate — the token simply can't be redeemed.
|
|
100
|
+
if (token == null) {
|
|
101
|
+
return { valid: false, error: 'NOT_FOUND' };
|
|
102
|
+
}
|
|
103
|
+
return this.check(token, operation, targetId);
|
|
104
|
+
}
|
|
66
105
|
const token = this.tokens.get(tokenId);
|
|
67
106
|
if (token == null) {
|
|
68
107
|
return { valid: false, error: 'NOT_FOUND' };
|
|
69
108
|
}
|
|
70
|
-
|
|
109
|
+
return this.check(token, operation, targetId);
|
|
110
|
+
}
|
|
111
|
+
check(token, operation, targetId) {
|
|
112
|
+
// `>=` so validate agrees with the store's consume guard (expires_at > now):
|
|
113
|
+
// a token is expired at the exact expiry instant, on both paths.
|
|
114
|
+
if (this.now() >= token.expiresAt) {
|
|
71
115
|
return { valid: false, error: 'EXPIRED' };
|
|
72
116
|
}
|
|
73
117
|
if (token.operation !== operation) {
|
|
@@ -79,21 +123,44 @@ export class ApprovalTokenManager {
|
|
|
79
123
|
return { valid: true, token };
|
|
80
124
|
}
|
|
81
125
|
/**
|
|
82
|
-
* Validates and consumes a token (one-time use).
|
|
83
|
-
*
|
|
126
|
+
* Validates and consumes a token (one-time use). Durable stores use an atomic
|
|
127
|
+
* guarded consume so only one caller — across processes sharing the db — can
|
|
128
|
+
* redeem it; a losing/repeat caller gets `ALREADY_CONSUMED` (D8).
|
|
84
129
|
*/
|
|
85
130
|
consumeToken(tokenId, operation, targetId) {
|
|
86
131
|
const result = this.validateToken(tokenId, operation, targetId);
|
|
87
|
-
if (result.valid) {
|
|
88
|
-
|
|
132
|
+
if (!result.valid) {
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
if (this.store != null) {
|
|
136
|
+
const consumed = this.store.consumeApprovalToken({
|
|
137
|
+
token: tokenId,
|
|
138
|
+
accountId: this.accountId,
|
|
139
|
+
now: this.now(),
|
|
140
|
+
});
|
|
141
|
+
switch (consumed.status) {
|
|
142
|
+
case 'consumed':
|
|
143
|
+
return result;
|
|
144
|
+
case 'already_redeemed':
|
|
145
|
+
return { valid: false, error: 'ALREADY_CONSUMED' };
|
|
146
|
+
case 'expired':
|
|
147
|
+
return { valid: false, error: 'EXPIRED' };
|
|
148
|
+
default:
|
|
149
|
+
return { valid: false, error: 'NOT_FOUND' };
|
|
150
|
+
}
|
|
89
151
|
}
|
|
152
|
+
this.tokens.delete(tokenId);
|
|
90
153
|
return result;
|
|
91
154
|
}
|
|
92
155
|
/**
|
|
93
|
-
* Removes
|
|
156
|
+
* Removes expired tokens from the in-memory store. Durable stores purge on
|
|
157
|
+
* boot (90-day retention), so this is a no-op there.
|
|
94
158
|
*/
|
|
95
159
|
cleanupExpiredTokens() {
|
|
96
|
-
|
|
160
|
+
if (this.store != null) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const now = this.now();
|
|
97
164
|
for (const [tokenId, token] of this.tokens) {
|
|
98
165
|
if (now > token.expiresAt) {
|
|
99
166
|
this.tokens.delete(tokenId);
|
|
@@ -101,11 +168,32 @@ export class ApprovalTokenManager {
|
|
|
101
168
|
}
|
|
102
169
|
}
|
|
103
170
|
/**
|
|
104
|
-
*
|
|
105
|
-
*
|
|
171
|
+
* Number of active in-memory tokens (testing/monitoring). Durable tokens are
|
|
172
|
+
* not counted here — they live in the store.
|
|
106
173
|
*/
|
|
107
174
|
get size() {
|
|
108
175
|
return this.tokens.size;
|
|
109
176
|
}
|
|
110
177
|
}
|
|
178
|
+
/** Reconstructs an {@link ApprovalToken} from a stored row, or null if the
|
|
179
|
+
* persisted target JSON is corrupt/unparseable (fail closed). */
|
|
180
|
+
function rowToToken(row) {
|
|
181
|
+
let target;
|
|
182
|
+
try {
|
|
183
|
+
target = JSON.parse(row.targetJson);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
tokenId: row.token,
|
|
190
|
+
operation: row.action,
|
|
191
|
+
targetType: target.targetType,
|
|
192
|
+
targetId: target.targetId,
|
|
193
|
+
targetHash: target.targetHash ?? row.contentHash ?? '',
|
|
194
|
+
createdAt: row.createdAt,
|
|
195
|
+
expiresAt: row.expiresAt,
|
|
196
|
+
metadata: Object.freeze({ ...target.metadata }),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
111
199
|
//# sourceMappingURL=token-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/approval/token-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH
|
|
1
|
+
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/approval/token-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -2,10 +2,27 @@
|
|
|
2
2
|
* Copyright (c) 2026 JBC Tech Solutions, LLC
|
|
3
3
|
* Licensed under the MIT License. See LICENSE file in the project root.
|
|
4
4
|
*/
|
|
5
|
+
import type { Preset } from './registry/types.js';
|
|
5
6
|
export interface CliCommand {
|
|
6
7
|
command: 'auth';
|
|
7
8
|
flags: string[];
|
|
8
9
|
}
|
|
10
|
+
/** Valid `--preset` names, mirroring the domain modules. */
|
|
11
|
+
export declare const VALID_PRESETS: readonly Preset[];
|
|
12
|
+
/** Server-mode CLI options parsed from argv (U10). */
|
|
13
|
+
export interface ServerCliOptions {
|
|
14
|
+
/** Presets to include; omitted means the full surface (`all`). */
|
|
15
|
+
readonly presets?: readonly Preset[];
|
|
16
|
+
/** When true, only non-destructive tools are exposed. */
|
|
17
|
+
readonly readOnly: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parses server-mode flags (`--preset <names>`, `--read-only`) from argv.
|
|
21
|
+
* `--preset` accepts a comma-separated list and may repeat; `all` (or no
|
|
22
|
+
* `--preset`) means the full surface. Unknown preset names throw with the valid
|
|
23
|
+
* list so startup fails loudly rather than silently exposing nothing.
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseServerOptions(args: string[]): ServerCliOptions;
|
|
9
26
|
/**
|
|
10
27
|
* Parses CLI arguments to determine if a subcommand was invoked.
|
|
11
28
|
* Returns null if no subcommand (normal MCP server mode).
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,4DAA4D;AAC5D,eAAO,MAAM,aAAa,EAAE,SAAS,MAAM,EAa1C,CAAC;AAEF,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CA8CnE;AAsBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,GAAG,IAAI,CASjE;AAED,KAAK,OAAO,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,GAAE,MAAM,EAAO,EACpB,KAAK,GAAE,OAAqB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAcjB;AA2FD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAczE"}
|
package/dist/cli.js
CHANGED
|
@@ -12,6 +12,85 @@
|
|
|
12
12
|
* npx @jbctechsolutions/mcp-office365 auth --logout # Sign out
|
|
13
13
|
*/
|
|
14
14
|
import { getAccessToken, isAuthenticated, getAccount, signOut, getTokenCacheFile, } from './graph/index.js';
|
|
15
|
+
/** Valid `--preset` names, mirroring the domain modules. */
|
|
16
|
+
export const VALID_PRESETS = [
|
|
17
|
+
'mail',
|
|
18
|
+
'calendar',
|
|
19
|
+
'contacts',
|
|
20
|
+
'tasks',
|
|
21
|
+
'notes',
|
|
22
|
+
'teams',
|
|
23
|
+
'planner',
|
|
24
|
+
'files',
|
|
25
|
+
'sharepoint',
|
|
26
|
+
'excel',
|
|
27
|
+
'people',
|
|
28
|
+
'meetings',
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Parses server-mode flags (`--preset <names>`, `--read-only`) from argv.
|
|
32
|
+
* `--preset` accepts a comma-separated list and may repeat; `all` (or no
|
|
33
|
+
* `--preset`) means the full surface. Unknown preset names throw with the valid
|
|
34
|
+
* list so startup fails loudly rather than silently exposing nothing.
|
|
35
|
+
*/
|
|
36
|
+
export function parseServerOptions(args) {
|
|
37
|
+
const presetNames = [];
|
|
38
|
+
let readOnly = false;
|
|
39
|
+
for (let i = 0; i < args.length; i++) {
|
|
40
|
+
const arg = args[i];
|
|
41
|
+
if (arg == null)
|
|
42
|
+
continue;
|
|
43
|
+
if (arg === '--read-only') {
|
|
44
|
+
readOnly = true;
|
|
45
|
+
}
|
|
46
|
+
else if (arg === '--preset') {
|
|
47
|
+
const value = args[i + 1];
|
|
48
|
+
if (value == null || value.startsWith('--')) {
|
|
49
|
+
throw missingPresetValue();
|
|
50
|
+
}
|
|
51
|
+
presetNames.push(...requirePresetNames(value));
|
|
52
|
+
i++;
|
|
53
|
+
}
|
|
54
|
+
else if (arg.startsWith('--preset=')) {
|
|
55
|
+
presetNames.push(...requirePresetNames(arg.slice('--preset='.length)));
|
|
56
|
+
}
|
|
57
|
+
// Unknown args are ignored — argv may carry runner-injected entries.
|
|
58
|
+
}
|
|
59
|
+
// No --preset flag at all → full surface.
|
|
60
|
+
if (presetNames.length === 0) {
|
|
61
|
+
return { readOnly };
|
|
62
|
+
}
|
|
63
|
+
// Validate every name (the `all` keyword excepted) BEFORE honoring `all`, so a
|
|
64
|
+
// typo mixed with `all` (e.g. `--preset all,mial`) fails loudly rather than
|
|
65
|
+
// silently exposing the full surface.
|
|
66
|
+
const invalid = presetNames.filter((name) => name !== 'all' && !VALID_PRESETS.includes(name));
|
|
67
|
+
if (invalid.length > 0) {
|
|
68
|
+
throw new Error(`Unknown preset(s): ${invalid.join(', ')}. ` +
|
|
69
|
+
`Valid presets: ${VALID_PRESETS.join(', ')}, all.`);
|
|
70
|
+
}
|
|
71
|
+
// `all` (alone or mixed with valid names) exposes the full surface.
|
|
72
|
+
if (presetNames.includes('all')) {
|
|
73
|
+
return { readOnly };
|
|
74
|
+
}
|
|
75
|
+
return { readOnly, presets: presetNames };
|
|
76
|
+
}
|
|
77
|
+
function missingPresetValue() {
|
|
78
|
+
return new Error('--preset requires a comma-separated list of preset names.');
|
|
79
|
+
}
|
|
80
|
+
/** Splits a preset value and rejects an empty/whitespace-only list. */
|
|
81
|
+
function requirePresetNames(value) {
|
|
82
|
+
const names = splitPresetList(value);
|
|
83
|
+
if (names.length === 0) {
|
|
84
|
+
throw missingPresetValue();
|
|
85
|
+
}
|
|
86
|
+
return names;
|
|
87
|
+
}
|
|
88
|
+
function splitPresetList(value) {
|
|
89
|
+
return value
|
|
90
|
+
.split(',')
|
|
91
|
+
.map((s) => s.trim())
|
|
92
|
+
.filter((s) => s.length > 0);
|
|
93
|
+
}
|
|
15
94
|
/**
|
|
16
95
|
* Parses CLI arguments to determine if a subcommand was invoked.
|
|
17
96
|
* Returns null if no subcommand (normal MCP server mode).
|
|
@@ -50,7 +129,9 @@ async function handleAuth(print) {
|
|
|
50
129
|
print('='.repeat(40));
|
|
51
130
|
print('');
|
|
52
131
|
try {
|
|
53
|
-
|
|
132
|
+
// CLI runs at a real terminal, so re-authenticate interactively even when a
|
|
133
|
+
// cached session is expired (the server path throws AUTH_EXPIRED instead).
|
|
134
|
+
await getAccessToken(undefined, { interactiveOnExpired: true });
|
|
54
135
|
const account = await getAccount();
|
|
55
136
|
const username = account?.username ?? 'unknown';
|
|
56
137
|
print('');
|
|
@@ -75,7 +156,9 @@ async function handleForceAuth(print) {
|
|
|
75
156
|
await signOut();
|
|
76
157
|
print('Cleared existing tokens.');
|
|
77
158
|
print('');
|
|
78
|
-
|
|
159
|
+
// CLI runs at a real terminal, so re-authenticate interactively even when a
|
|
160
|
+
// cached session is expired (the server path throws AUTH_EXPIRED instead).
|
|
161
|
+
await getAccessToken(undefined, { interactiveOnExpired: true });
|
|
79
162
|
const account = await getAccount();
|
|
80
163
|
const username = account?.username ?? 'unknown';
|
|
81
164
|
print('');
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,OAAO,EACP,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Includes read/write permissions for mail and calendars to support
|
|
9
9
|
* future implementation of email sending and event management features.
|
|
10
10
|
*/
|
|
11
|
-
export declare const GRAPH_SCOPES: readonly ["Mail.ReadWrite", "Calendars.ReadWrite", "Contacts.ReadWrite", "Tasks.ReadWrite", "User.Read", "offline_access", "ChannelMessage.Read.All", "ChannelMessage.Send", "Channel.ReadBasic.All", "Team.ReadBasic.All", "Chat.ReadWrite", "ChatMessage.Send", "People.Read", "User.ReadBasic.All", "Presence.Read.All", "Group.Read.All"];
|
|
11
|
+
export declare const GRAPH_SCOPES: readonly ["Mail.ReadWrite", "Calendars.ReadWrite", "Contacts.ReadWrite", "Tasks.ReadWrite", "User.Read", "offline_access", "ChannelMessage.Read.All", "ChannelMessage.Send", "Channel.ReadBasic.All", "Team.ReadBasic.All", "Chat.ReadWrite", "ChatMessage.Send", "People.Read", "User.ReadBasic.All", "Presence.Read.All", "Group.Read.All", "Files.ReadWrite", "Sites.Read.All"];
|
|
12
12
|
/**
|
|
13
13
|
* Microsoft Graph API configuration.
|
|
14
14
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/graph/auth/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH;;;;;GAKG;AACH,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/graph/auth/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH;;;;;GAKG;AACH,eAAO,MAAM,YAAY,oXAyBf,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,eAAe,CAiBjD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAE/D"}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
*
|
|
21
21
|
* For setup instructions: https://github.com/jbctechsolutions/mcp-office365#custom-azure-ad-setup
|
|
22
22
|
*/
|
|
23
|
-
const DEFAULT_CLIENT_ID = '
|
|
23
|
+
const DEFAULT_CLIENT_ID = '8fdcd9d3-8823-48f5-bd59-c3a779053b77';
|
|
24
24
|
/**
|
|
25
25
|
* Microsoft Graph API scopes required for Outlook access.
|
|
26
26
|
*
|
|
@@ -48,6 +48,10 @@ export const GRAPH_SCOPES = [
|
|
|
48
48
|
'Presence.Read.All',
|
|
49
49
|
// Planner
|
|
50
50
|
'Group.Read.All',
|
|
51
|
+
// OneDrive
|
|
52
|
+
'Files.ReadWrite',
|
|
53
|
+
// SharePoint
|
|
54
|
+
'Sites.Read.All',
|
|
51
55
|
];
|
|
52
56
|
/**
|
|
53
57
|
* Loads the Graph API configuration.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/graph/auth/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,iBAAiB,GAAG,sCAAsC,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,UAAU;IACV,gBAAgB;IAChB,qBAAqB;IACrB,oBAAoB;IACpB,iBAAiB;IACjB,WAAW;IACX,gBAAgB;IAChB,QAAQ;IACR,yBAAyB;IACzB,qBAAqB;IACrB,uBAAuB;IACvB,oBAAoB;IACpB,gBAAgB;IAChB,kBAAkB;IAClB,oBAAoB;IACpB,aAAa;IACb,oBAAoB;IACpB,mBAAmB;IACnB,UAAU;IACV,gBAAgB;CACR,CAAC;AAcX;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,iBAAiB,CAAC;IAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,QAAQ,CAAC;IAElE,IAAI,QAAQ,KAAK,0BAA0B,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,wCAAwC;YACtC,yDAAyD;YACzD,qEAAqE,CACxE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,OAAO,qCAAqC,MAAM,CAAC,QAAQ,EAAE,CAAC;AAChE,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/graph/auth/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,iBAAiB,GAAG,sCAAsC,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,UAAU;IACV,gBAAgB;IAChB,qBAAqB;IACrB,oBAAoB;IACpB,iBAAiB;IACjB,WAAW;IACX,gBAAgB;IAChB,QAAQ;IACR,yBAAyB;IACzB,qBAAqB;IACrB,uBAAuB;IACvB,oBAAoB;IACpB,gBAAgB;IAChB,kBAAkB;IAClB,oBAAoB;IACpB,aAAa;IACb,oBAAoB;IACpB,mBAAmB;IACnB,UAAU;IACV,gBAAgB;IAChB,WAAW;IACX,iBAAiB;IACjB,aAAa;IACb,gBAAgB;CACR,CAAC;AAcX;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,iBAAiB,CAAC;IAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,QAAQ,CAAC;IAElE,IAAI,QAAQ,KAAK,0BAA0B,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,wCAAwC;YACtC,yDAAyD;YACzD,qEAAqE,CACxE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,OAAO,qCAAqC,MAAM,CAAC,QAAQ,EAAE,CAAC;AAChE,CAAC"}
|
|
@@ -35,7 +35,9 @@ export declare function acquireTokenSilent(): Promise<AuthenticationResult | nul
|
|
|
35
35
|
* 1. First tries to get a cached/refreshed token silently
|
|
36
36
|
* 2. If that fails, prompts for device code authentication
|
|
37
37
|
*/
|
|
38
|
-
export declare function getAccessToken(deviceCodeCallback?: DeviceCodeCallback
|
|
38
|
+
export declare function getAccessToken(deviceCodeCallback?: DeviceCodeCallback, options?: {
|
|
39
|
+
interactiveOnExpired?: boolean;
|
|
40
|
+
}): Promise<string>;
|
|
39
41
|
/**
|
|
40
42
|
* Checks if the user is authenticated (has cached tokens).
|
|
41
43
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-code-flow.d.ts","sourceRoot":"","sources":["../../../src/graph/auth/device-code-flow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"device-code-flow.d.ts","sourceRoot":"","sources":["../../../src/graph/auth/device-code-flow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EAGL,KAAK,oBAAoB,EAEzB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AA+C1B;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAiBtG;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,kBAAkB,GAAE,kBAA8C,GACjE,OAAO,CAAC,oBAAoB,CAAC,CAgB/B;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAS/E;AA2CD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,kBAAkB,GAAE,kBAA8C,EAClE,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAYxD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAS9D;AAED;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAW7C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC"}
|