@jbctechsolutions/mcp-office365 2.5.1 → 4.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 +66 -57
- package/dist/approval/hash.d.ts +8 -8
- package/dist/approval/token-manager.d.ts +37 -19
- package/dist/approval/token-manager.d.ts.map +1 -1
- package/dist/approval/token-manager.js +133 -37
- package/dist/approval/token-manager.js.map +1 -1
- package/dist/approval/types.d.ts +7 -3
- package/dist/approval/types.d.ts.map +1 -1
- package/dist/cli.d.ts +21 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +100 -2
- package/dist/cli.js.map +1 -1
- package/dist/database/repository.d.ts +48 -48
- package/dist/database/repository.d.ts.map +1 -1
- package/dist/database/repository.js.map +1 -1
- package/dist/delta/mirror.d.ts +67 -0
- package/dist/delta/mirror.d.ts.map +1 -0
- package/dist/delta/mirror.js +183 -0
- package/dist/delta/mirror.js.map +1 -0
- package/dist/graph/auth/account-id.d.ts +19 -0
- package/dist/graph/auth/account-id.d.ts.map +1 -0
- package/dist/graph/auth/account-id.js +55 -0
- package/dist/graph/auth/account-id.js.map +1 -0
- 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 +13 -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/index.d.ts +1 -0
- package/dist/graph/auth/index.d.ts.map +1 -1
- package/dist/graph/auth/index.js +1 -0
- package/dist/graph/auth/index.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 +141 -8
- package/dist/graph/client/graph-client.d.ts.map +1 -1
- package/dist/graph/client/graph-client.js +536 -48
- package/dist/graph/client/graph-client.js.map +1 -1
- package/dist/graph/client/immutable-id-middleware.d.ts +50 -0
- package/dist/graph/client/immutable-id-middleware.d.ts.map +1 -0
- package/dist/graph/client/immutable-id-middleware.js +137 -0
- package/dist/graph/client/immutable-id-middleware.js.map +1 -0
- package/dist/graph/content-readers.d.ts +0 -12
- package/dist/graph/content-readers.d.ts.map +1 -1
- package/dist/graph/content-readers.js +0 -21
- package/dist/graph/content-readers.js.map +1 -1
- package/dist/graph/index.d.ts +5 -6
- package/dist/graph/index.d.ts.map +1 -1
- package/dist/graph/index.js +5 -6
- package/dist/graph/index.js.map +1 -1
- package/dist/graph/mailbox-adapter.d.ts +15 -15
- package/dist/graph/mappers/contact-mapper.d.ts +4 -1
- package/dist/graph/mappers/contact-mapper.d.ts.map +1 -1
- package/dist/graph/mappers/contact-mapper.js +7 -3
- package/dist/graph/mappers/contact-mapper.js.map +1 -1
- package/dist/graph/mappers/email-mapper.d.ts.map +1 -1
- package/dist/graph/mappers/email-mapper.js +7 -4
- package/dist/graph/mappers/email-mapper.js.map +1 -1
- package/dist/graph/mappers/event-mapper.d.ts.map +1 -1
- package/dist/graph/mappers/event-mapper.js +6 -3
- package/dist/graph/mappers/event-mapper.js.map +1 -1
- package/dist/graph/mappers/folder-mapper.d.ts +0 -4
- package/dist/graph/mappers/folder-mapper.d.ts.map +1 -1
- package/dist/graph/mappers/folder-mapper.js +9 -19
- package/dist/graph/mappers/folder-mapper.js.map +1 -1
- package/dist/graph/mappers/index.d.ts +2 -2
- package/dist/graph/mappers/index.d.ts.map +1 -1
- package/dist/graph/mappers/index.js +2 -2
- package/dist/graph/mappers/index.js.map +1 -1
- package/dist/graph/mappers/task-mapper.d.ts +4 -2
- package/dist/graph/mappers/task-mapper.d.ts.map +1 -1
- package/dist/graph/mappers/task-mapper.js +7 -5
- package/dist/graph/mappers/task-mapper.js.map +1 -1
- package/dist/graph/mappers/utils.d.ts +0 -10
- package/dist/graph/mappers/utils.d.ts.map +1 -1
- package/dist/graph/mappers/utils.js +0 -19
- package/dist/graph/mappers/utils.js.map +1 -1
- package/dist/graph/repository.d.ts +409 -276
- package/dist/graph/repository.d.ts.map +1 -1
- package/dist/graph/repository.js +772 -1082
- 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/next-action.d.ts +29 -0
- package/dist/ids/next-action.d.ts.map +1 -0
- package/dist/ids/next-action.js +58 -0
- package/dist/ids/next-action.js.map +1 -0
- package/dist/ids/resolver.d.ts +31 -0
- package/dist/ids/resolver.d.ts.map +1 -0
- package/dist/ids/resolver.js +52 -0
- package/dist/ids/resolver.js.map +1 -0
- package/dist/ids/schema.d.ts +91 -0
- package/dist/ids/schema.d.ts.map +1 -0
- package/dist/ids/schema.js +131 -0
- package/dist/ids/schema.js.map +1 -0
- package/dist/ids/token.d.ts +62 -0
- package/dist/ids/token.d.ts.map +1 -0
- package/dist/ids/token.js +225 -0
- package/dist/ids/token.js.map +1 -0
- package/dist/index.d.ts +10 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +255 -5925
- package/dist/index.js.map +1 -1
- package/dist/parsers/index.d.ts +0 -1
- package/dist/parsers/index.d.ts.map +1 -1
- package/dist/parsers/index.js +0 -1
- package/dist/parsers/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 +68 -0
- package/dist/registry/all-tools.js.map +1 -0
- package/dist/registry/context.d.ts +19 -0
- package/dist/registry/context.d.ts.map +1 -0
- package/dist/registry/context.js +20 -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/elicit-links.d.ts +35 -0
- package/dist/registry/elicit-links.d.ts.map +1 -0
- package/dist/registry/elicit-links.js +102 -0
- package/dist/registry/elicit-links.js.map +1 -0
- package/dist/registry/elicitor.d.ts +24 -0
- package/dist/registry/elicitor.d.ts.map +1 -0
- package/dist/registry/elicitor.js +51 -0
- package/dist/registry/elicitor.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 +73 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +221 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/types.d.ts +146 -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/delta-store.d.ts +85 -0
- package/dist/state/delta-store.d.ts.map +1 -0
- package/dist/state/delta-store.js +124 -0
- package/dist/state/delta-store.js.map +1 -0
- 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 +26 -0
- package/dist/state/schema.d.ts.map +1 -0
- package/dist/state/schema.js +77 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/state/store.d.ts +155 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +321 -0
- package/dist/state/store.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 +299 -0
- package/dist/tools/calendar-graph.js.map +1 -0
- package/dist/tools/calendar-permissions.d.ts +17 -7
- package/dist/tools/calendar-permissions.d.ts.map +1 -1
- package/dist/tools/calendar-permissions.js +60 -4
- package/dist/tools/calendar-permissions.js.map +1 -1
- package/dist/tools/calendar.d.ts +133 -82
- package/dist/tools/calendar.d.ts.map +1 -1
- package/dist/tools/calendar.js +249 -136
- package/dist/tools/calendar.js.map +1 -1
- package/dist/tools/categories.d.ts +14 -4
- package/dist/tools/categories.d.ts.map +1 -1
- package/dist/tools/categories.js +59 -2
- package/dist/tools/categories.js.map +1 -1
- package/dist/tools/checklist-items.d.ts +19 -9
- package/dist/tools/checklist-items.d.ts.map +1 -1
- package/dist/tools/checklist-items.js +71 -5
- 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 +136 -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 +174 -0
- package/dist/tools/contacts-graph.js.map +1 -0
- package/dist/tools/contacts.d.ts +61 -30
- package/dist/tools/contacts.d.ts.map +1 -1
- package/dist/tools/contacts.js +150 -93
- package/dist/tools/contacts.js.map +1 -1
- package/dist/tools/excel.d.ts +20 -10
- package/dist/tools/excel.d.ts.map +1 -1
- package/dist/tools/excel.js +82 -6
- package/dist/tools/excel.js.map +1 -1
- package/dist/tools/focused-overrides.d.ts +14 -4
- package/dist/tools/focused-overrides.d.ts.map +1 -1
- package/dist/tools/focused-overrides.js +59 -2
- package/dist/tools/focused-overrides.js.map +1 -1
- package/dist/tools/index.d.ts +4 -5
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -6
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/linked-resources.d.ts +17 -7
- package/dist/tools/linked-resources.d.ts.map +1 -1
- package/dist/tools/linked-resources.js +60 -4
- package/dist/tools/linked-resources.js.map +1 -1
- 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 +187 -0
- package/dist/tools/mail-graph.js.map +1 -0
- package/dist/tools/mail-rules.d.ts +20 -8
- package/dist/tools/mail-rules.d.ts.map +1 -1
- package/dist/tools/mail-rules.js +63 -7
- package/dist/tools/mail-rules.js.map +1 -1
- package/dist/tools/mail-send.d.ts +39 -27
- package/dist/tools/mail-send.d.ts.map +1 -1
- package/dist/tools/mail-send.js +249 -24
- package/dist/tools/mail-send.js.map +1 -1
- package/dist/tools/mail.d.ts +91 -68
- package/dist/tools/mail.d.ts.map +1 -1
- package/dist/tools/mail.js +232 -243
- package/dist/tools/mail.js.map +1 -1
- package/dist/tools/mailbox-organization.d.ts +51 -34
- package/dist/tools/mailbox-organization.d.ts.map +1 -1
- package/dist/tools/mailbox-organization.js +318 -35
- 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 +24 -14
- package/dist/tools/meetings.d.ts.map +1 -1
- package/dist/tools/meetings.js +82 -6
- package/dist/tools/meetings.js.map +1 -1
- package/dist/tools/onedrive.d.ts +26 -16
- package/dist/tools/onedrive.d.ts.map +1 -1
- package/dist/tools/onedrive.js +140 -11
- package/dist/tools/onedrive.js.map +1 -1
- package/dist/tools/onenote.d.ts +63 -0
- package/dist/tools/onenote.d.ts.map +1 -0
- package/dist/tools/onenote.js +221 -0
- package/dist/tools/onenote.js.map +1 -0
- 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 +15 -5
- package/dist/tools/planner-visualization.d.ts.map +1 -1
- package/dist/tools/planner-visualization.js +58 -4
- package/dist/tools/planner-visualization.js.map +1 -1
- package/dist/tools/planner.d.ts +69 -39
- package/dist/tools/planner.d.ts.map +1 -1
- package/dist/tools/planner.js +231 -23
- 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/shared-mailbox.d.ts +164 -0
- package/dist/tools/shared-mailbox.d.ts.map +1 -0
- package/dist/tools/shared-mailbox.js +318 -0
- package/dist/tools/shared-mailbox.js.map +1 -0
- package/dist/tools/sharepoint-lists.d.ts +131 -0
- package/dist/tools/sharepoint-lists.d.ts.map +1 -0
- package/dist/tools/sharepoint-lists.js +246 -0
- package/dist/tools/sharepoint-lists.js.map +1 -0
- package/dist/tools/sharepoint.d.ts +24 -14
- package/dist/tools/sharepoint.d.ts.map +1 -1
- package/dist/tools/sharepoint.js +85 -9
- package/dist/tools/sharepoint.js.map +1 -1
- package/dist/tools/task-attachments.d.ts +17 -7
- package/dist/tools/task-attachments.d.ts.map +1 -1
- package/dist/tools/task-attachments.js +60 -4
- 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 +155 -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 +193 -0
- package/dist/tools/tasks-graph.js.map +1 -0
- package/dist/tools/tasks.d.ts +121 -29
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +136 -84
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/teams.d.ts +57 -46
- package/dist/tools/teams.d.ts.map +1 -1
- package/dist/tools/teams.js +288 -26
- package/dist/tools/teams.js.map +1 -1
- package/dist/tools/what-changed.d.ts +48 -0
- package/dist/tools/what-changed.d.ts.map +1 -0
- package/dist/tools/what-changed.js +149 -0
- package/dist/tools/what-changed.js.map +1 -0
- package/dist/types/calendar.d.ts +1 -1
- package/dist/types/calendar.d.ts.map +1 -1
- package/dist/types/calendar.js.map +1 -1
- package/dist/types/contacts.d.ts +1 -1
- package/dist/types/contacts.d.ts.map +1 -1
- package/dist/types/contacts.js.map +1 -1
- package/dist/types/mail.d.ts +1 -1
- package/dist/types/mail.d.ts.map +1 -1
- package/dist/types/mail.js.map +1 -1
- package/dist/utils/errors.d.ts +110 -38
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +239 -56
- package/dist/utils/errors.js.map +1 -1
- package/dist/visualization/types.d.ts +4 -4
- package/package.json +2 -3
- package/dist/applescript/account-repository.d.ts +0 -30
- package/dist/applescript/account-repository.d.ts.map +0 -1
- package/dist/applescript/account-repository.js +0 -38
- package/dist/applescript/account-repository.js.map +0 -1
- package/dist/applescript/account-scripts.d.ts +0 -21
- package/dist/applescript/account-scripts.d.ts.map +0 -1
- package/dist/applescript/account-scripts.js +0 -180
- package/dist/applescript/account-scripts.js.map +0 -1
- package/dist/applescript/calendar-manager.d.ts +0 -44
- package/dist/applescript/calendar-manager.d.ts.map +0 -1
- package/dist/applescript/calendar-manager.js +0 -92
- package/dist/applescript/calendar-manager.js.map +0 -1
- package/dist/applescript/calendar-writer.d.ts +0 -36
- package/dist/applescript/calendar-writer.d.ts.map +0 -1
- package/dist/applescript/calendar-writer.js +0 -94
- package/dist/applescript/calendar-writer.js.map +0 -1
- package/dist/applescript/content-readers.d.ts +0 -114
- package/dist/applescript/content-readers.d.ts.map +0 -1
- package/dist/applescript/content-readers.js +0 -328
- package/dist/applescript/content-readers.js.map +0 -1
- package/dist/applescript/executor.d.ts +0 -60
- package/dist/applescript/executor.d.ts.map +0 -1
- package/dist/applescript/executor.js +0 -173
- package/dist/applescript/executor.js.map +0 -1
- package/dist/applescript/index.d.ts +0 -20
- package/dist/applescript/index.d.ts.map +0 -1
- package/dist/applescript/index.js +0 -29
- package/dist/applescript/index.js.map +0 -1
- package/dist/applescript/mail-sender.d.ts +0 -38
- package/dist/applescript/mail-sender.d.ts.map +0 -1
- package/dist/applescript/mail-sender.js +0 -67
- package/dist/applescript/mail-sender.js.map +0 -1
- package/dist/applescript/parser.d.ts +0 -235
- package/dist/applescript/parser.d.ts.map +0 -1
- package/dist/applescript/parser.js +0 -496
- package/dist/applescript/parser.js.map +0 -1
- package/dist/applescript/repository.d.ts +0 -64
- package/dist/applescript/repository.d.ts.map +0 -1
- package/dist/applescript/repository.js +0 -444
- package/dist/applescript/repository.js.map +0 -1
- package/dist/applescript/scripts.d.ts +0 -265
- package/dist/applescript/scripts.d.ts.map +0 -1
- package/dist/applescript/scripts.js +0 -1483
- package/dist/applescript/scripts.js.map +0 -1
- package/dist/parsers/olk15.d.ts +0 -87
- package/dist/parsers/olk15.d.ts.map +0 -1
- package/dist/parsers/olk15.js +0 -368
- package/dist/parsers/olk15.js.map +0 -1
- package/dist/tools/notes.d.ts +0 -74
- package/dist/tools/notes.d.ts.map +0 -1
- package/dist/tools/notes.js +0 -136
- package/dist/tools/notes.js.map +0 -1
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 JBC Tech Solutions, LLC
|
|
3
|
+
* Licensed under the MIT License. See LICENSE file in the project root.
|
|
4
|
+
*/
|
|
5
|
+
import { mintSelfEncoded } from '../ids/token.js';
|
|
6
|
+
/** How far forward/back the initial calendar-view window spans (baked into the cursor). */
|
|
7
|
+
const CALENDAR_WINDOW_PAST_MS = 1 * 24 * 60 * 60 * 1000;
|
|
8
|
+
const CALENDAR_WINDOW_FUTURE_MS = 90 * 24 * 60 * 60 * 1000;
|
|
9
|
+
/**
|
|
10
|
+
* The calendar cursor bakes an absolute time window that cannot advance, so it
|
|
11
|
+
* is force-refreshed (re-baselined with a fresh window) once it is this old —
|
|
12
|
+
* bounding how far the tracked window can drift from "now".
|
|
13
|
+
*/
|
|
14
|
+
const CALENDAR_CURSOR_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
15
|
+
/** Reads `@removed` (and its reason) regardless of the concrete Graph type. */
|
|
16
|
+
function removal(item) {
|
|
17
|
+
const marker = item['@removed'];
|
|
18
|
+
if (marker == null)
|
|
19
|
+
return { removed: false, reason: '' };
|
|
20
|
+
return { removed: true, reason: marker.reason ?? 'deleted' };
|
|
21
|
+
}
|
|
22
|
+
const MAIL_RESOURCE = {
|
|
23
|
+
key: 'mail',
|
|
24
|
+
storageKey: 'mail:inbox',
|
|
25
|
+
entityType: 'message',
|
|
26
|
+
async fetch(client, deltaLink) {
|
|
27
|
+
const { messages, deltaLink: next } = await client.getMessagesDelta('inbox', deltaLink);
|
|
28
|
+
const items = [];
|
|
29
|
+
for (const m of messages) {
|
|
30
|
+
const graphId = m.id ?? '';
|
|
31
|
+
if (graphId.length === 0)
|
|
32
|
+
continue;
|
|
33
|
+
const { removed, reason } = removal(m);
|
|
34
|
+
items.push({
|
|
35
|
+
graphId,
|
|
36
|
+
removed,
|
|
37
|
+
removedReason: reason,
|
|
38
|
+
summary: m.subject ?? '(no subject)',
|
|
39
|
+
snapshot: {
|
|
40
|
+
from: m.from?.emailAddress?.address ?? '',
|
|
41
|
+
receivedDateTime: m.receivedDateTime ?? '',
|
|
42
|
+
isRead: m.isRead ?? null,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return { items, deltaLink: next };
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
const CALENDAR_RESOURCE = {
|
|
50
|
+
key: 'calendar',
|
|
51
|
+
storageKey: 'calendar:primary',
|
|
52
|
+
entityType: 'event',
|
|
53
|
+
maxCursorAgeMs: CALENDAR_CURSOR_MAX_AGE_MS,
|
|
54
|
+
async fetch(client, deltaLink, now) {
|
|
55
|
+
const start = new Date(now - CALENDAR_WINDOW_PAST_MS).toISOString();
|
|
56
|
+
const end = new Date(now + CALENDAR_WINDOW_FUTURE_MS).toISOString();
|
|
57
|
+
const { events, deltaLink: next } = await client.getCalendarViewDelta(start, end, deltaLink);
|
|
58
|
+
const items = [];
|
|
59
|
+
for (const e of events) {
|
|
60
|
+
const graphId = e.id ?? '';
|
|
61
|
+
if (graphId.length === 0)
|
|
62
|
+
continue;
|
|
63
|
+
const { removed, reason } = removal(e);
|
|
64
|
+
items.push({
|
|
65
|
+
graphId,
|
|
66
|
+
removed,
|
|
67
|
+
removedReason: reason,
|
|
68
|
+
summary: e.subject ?? '(no subject)',
|
|
69
|
+
snapshot: {
|
|
70
|
+
start: e.start?.dateTime ?? '',
|
|
71
|
+
end: e.end?.dateTime ?? '',
|
|
72
|
+
organizer: e.organizer?.emailAddress?.address ?? '',
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return { items, deltaLink: next };
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
const RESOURCES = {
|
|
80
|
+
mail: MAIL_RESOURCE,
|
|
81
|
+
calendar: CALENDAR_RESOURCE,
|
|
82
|
+
};
|
|
83
|
+
/** All resource keys, in a stable order. */
|
|
84
|
+
export const ALL_RESOURCES = ['mail', 'calendar'];
|
|
85
|
+
/**
|
|
86
|
+
* Orchestrates delta sync + change classification against a {@link StateStore}
|
|
87
|
+
* mirror. Stateless beyond its dependencies; safe to construct per call.
|
|
88
|
+
*/
|
|
89
|
+
export class DeltaMirror {
|
|
90
|
+
client;
|
|
91
|
+
store;
|
|
92
|
+
accountId;
|
|
93
|
+
now;
|
|
94
|
+
constructor(client, store, accountId, now = () => Date.now()) {
|
|
95
|
+
this.client = client;
|
|
96
|
+
this.store = store;
|
|
97
|
+
this.accountId = accountId;
|
|
98
|
+
this.now = now;
|
|
99
|
+
}
|
|
100
|
+
/** Syncs the given resources (all by default) and returns the change report. */
|
|
101
|
+
async sync(resources = ALL_RESOURCES) {
|
|
102
|
+
const syncedAt = this.now();
|
|
103
|
+
const out = [];
|
|
104
|
+
for (const key of resources) {
|
|
105
|
+
out.push(await this.syncResource(RESOURCES[key], syncedAt));
|
|
106
|
+
}
|
|
107
|
+
return { syncedAt, resources: out };
|
|
108
|
+
}
|
|
109
|
+
/** Clears tracking for the given resources (all by default) — local only. */
|
|
110
|
+
reset(resources = ALL_RESOURCES) {
|
|
111
|
+
const accountId = this.accountId();
|
|
112
|
+
for (const key of resources) {
|
|
113
|
+
this.store.delta.reset(accountId, RESOURCES[key].storageKey);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async syncResource(desc, syncedAt) {
|
|
117
|
+
const accountId = this.accountId();
|
|
118
|
+
const cursor = this.store.delta.getCursor(accountId, desc.storageKey);
|
|
119
|
+
// A stale calendar-style cursor (fixed window that can no longer advance) is
|
|
120
|
+
// treated as absent so this round re-baselines with a fresh window.
|
|
121
|
+
const stale = cursor != null &&
|
|
122
|
+
desc.maxCursorAgeMs != null &&
|
|
123
|
+
syncedAt - cursor.syncedAt > desc.maxCursorAgeMs;
|
|
124
|
+
const prevLink = stale ? undefined : (cursor?.deltaLink ?? undefined);
|
|
125
|
+
const baseline = prevLink == null;
|
|
126
|
+
const { items, deltaLink } = await desc.fetch(this.client, prevLink, syncedAt);
|
|
127
|
+
// Collapse duplicate ids within one response (last entry wins, per Graph
|
|
128
|
+
// ordering) so a created-then-deleted or repeated id can't be double-counted
|
|
129
|
+
// or leave the report inconsistent with the committed mirror.
|
|
130
|
+
const latest = new Map();
|
|
131
|
+
for (const item of items)
|
|
132
|
+
latest.set(item.graphId, item);
|
|
133
|
+
const seen = baseline ? new Set() : this.store.delta.getSeenIds(accountId, desc.storageKey);
|
|
134
|
+
const upserts = [];
|
|
135
|
+
const deletes = [];
|
|
136
|
+
const created = [];
|
|
137
|
+
const updated = [];
|
|
138
|
+
const deleted = [];
|
|
139
|
+
for (const item of latest.values()) {
|
|
140
|
+
const token = mintSelfEncoded(desc.entityType, item.graphId);
|
|
141
|
+
if (item.removed) {
|
|
142
|
+
// Drop from the mirror either way, but only report an actual deletion
|
|
143
|
+
// ('deleted'). 'changed' means the item merely left our view (moved
|
|
144
|
+
// folder / rescheduled out of window) — reporting it as deleted lies.
|
|
145
|
+
deletes.push(item.graphId);
|
|
146
|
+
if (!baseline && item.removedReason === 'deleted' && seen.has(item.graphId)) {
|
|
147
|
+
const known = this.store.delta.getItem(accountId, desc.storageKey, item.graphId);
|
|
148
|
+
deleted.push({ token, graphId: item.graphId, summary: known?.summary ?? '', changeType: 'deleted' });
|
|
149
|
+
}
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
upserts.push({ graphId: item.graphId, token, summary: item.summary, snapshot: JSON.stringify(item.snapshot) });
|
|
153
|
+
if (!baseline) {
|
|
154
|
+
const changeType = seen.has(item.graphId) ? 'updated' : 'created';
|
|
155
|
+
const entry = { token, graphId: item.graphId, summary: item.summary, changeType, detail: item.snapshot };
|
|
156
|
+
(changeType === 'updated' ? updated : created).push(entry);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
this.store.delta.commit({
|
|
160
|
+
accountId,
|
|
161
|
+
resource: desc.storageKey,
|
|
162
|
+
deltaLink,
|
|
163
|
+
syncedAt,
|
|
164
|
+
upserts,
|
|
165
|
+
deletes,
|
|
166
|
+
replaceMirror: baseline,
|
|
167
|
+
});
|
|
168
|
+
const result = {
|
|
169
|
+
resource: desc.key,
|
|
170
|
+
baseline,
|
|
171
|
+
trackedCount: this.store.delta.countItems(accountId, desc.storageKey),
|
|
172
|
+
created,
|
|
173
|
+
updated,
|
|
174
|
+
deleted,
|
|
175
|
+
};
|
|
176
|
+
if (deltaLink.length === 0) {
|
|
177
|
+
result.note =
|
|
178
|
+
'Graph returned no delta cursor (large initial page); tracking will re-baseline on the next call.';
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=mirror.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../src/delta/mirror.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 JBC Tech Solutions, LLC
|
|
3
|
+
* Licensed under the MIT License. See LICENSE file in the project root.
|
|
4
|
+
*/
|
|
5
|
+
/** Scope key used before sign-in (or when the account can't be determined). */
|
|
6
|
+
export declare const DEFAULT_ACCOUNT_ID = "default";
|
|
7
|
+
/**
|
|
8
|
+
* Resolves the signed-in account's stable id from MSAL, memoizing the first real
|
|
9
|
+
* value. Returns {@link DEFAULT_ACCOUNT_ID} (uncached) when unauthenticated.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveAccountId(): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* The last resolved account id without touching the MSAL cache. Returns
|
|
14
|
+
* {@link DEFAULT_ACCOUNT_ID} until {@link resolveAccountId} has populated it.
|
|
15
|
+
*/
|
|
16
|
+
export declare function currentAccountId(): string;
|
|
17
|
+
/** Clears the memo so a sign-out / account switch re-resolves the identity. */
|
|
18
|
+
export declare function resetAccountId(): void;
|
|
19
|
+
//# sourceMappingURL=account-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-id.d.ts","sourceRoot":"","sources":["../../../src/graph/auth/account-id.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAI5C;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAWxD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 JBC Tech Solutions, LLC
|
|
3
|
+
* Licensed under the MIT License. See LICENSE file in the project root.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Signed-in account identity (U5 / D7). Durable state — approval tokens (D8) and
|
|
7
|
+
* the durable-ID alias table (D3) — is scoped per account so a token minted
|
|
8
|
+
* while signed in as one user can never be redeemed as another. MSAL's
|
|
9
|
+
* `homeAccountId` (`<oid>.<tid>`) is the stable per-account key.
|
|
10
|
+
*
|
|
11
|
+
* `getAccount()` is async (it reads the MSAL cache), but the token manager and
|
|
12
|
+
* resolver need a scope key synchronously at call time. So the resolved id is
|
|
13
|
+
* memoized after sign-in and read back via {@link currentAccountId}. Only a real
|
|
14
|
+
* id is memoized — an unauthenticated lookup returns the `'default'` fallback
|
|
15
|
+
* WITHOUT caching, so the real id is still picked up once sign-in completes. The
|
|
16
|
+
* caller retries {@link resolveAccountId} on each tool call while still on the
|
|
17
|
+
* fallback (see index.ts), so a transient miss at init can't pin the fallback.
|
|
18
|
+
*
|
|
19
|
+
* Single-account assumption (v3): `getAccount()` returns the first MSAL cache
|
|
20
|
+
* account, matching how the access token is acquired, so scope and auth identity
|
|
21
|
+
* agree within a process. A multi-account cache is out of scope for v3 — pinning
|
|
22
|
+
* the active account across the whole auth layer is a separate change.
|
|
23
|
+
*/
|
|
24
|
+
import { getAccount } from './device-code-flow.js';
|
|
25
|
+
/** Scope key used before sign-in (or when the account can't be determined). */
|
|
26
|
+
export const DEFAULT_ACCOUNT_ID = 'default';
|
|
27
|
+
let cachedAccountId = null;
|
|
28
|
+
/**
|
|
29
|
+
* Resolves the signed-in account's stable id from MSAL, memoizing the first real
|
|
30
|
+
* value. Returns {@link DEFAULT_ACCOUNT_ID} (uncached) when unauthenticated.
|
|
31
|
+
*/
|
|
32
|
+
export async function resolveAccountId() {
|
|
33
|
+
if (cachedAccountId !== null) {
|
|
34
|
+
return cachedAccountId;
|
|
35
|
+
}
|
|
36
|
+
const account = await getAccount();
|
|
37
|
+
const homeAccountId = account?.homeAccountId;
|
|
38
|
+
if (homeAccountId != null && homeAccountId.length > 0) {
|
|
39
|
+
cachedAccountId = homeAccountId;
|
|
40
|
+
return cachedAccountId;
|
|
41
|
+
}
|
|
42
|
+
return DEFAULT_ACCOUNT_ID;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The last resolved account id without touching the MSAL cache. Returns
|
|
46
|
+
* {@link DEFAULT_ACCOUNT_ID} until {@link resolveAccountId} has populated it.
|
|
47
|
+
*/
|
|
48
|
+
export function currentAccountId() {
|
|
49
|
+
return cachedAccountId ?? DEFAULT_ACCOUNT_ID;
|
|
50
|
+
}
|
|
51
|
+
/** Clears the memo so a sign-out / account switch re-resolves the identity. */
|
|
52
|
+
export function resetAccountId() {
|
|
53
|
+
cachedAccountId = null;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=account-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-id.js","sourceRoot":"","sources":["../../../src/graph/auth/account-id.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAE5C,IAAI,eAAe,GAAkB,IAAI,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;QAC7B,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IACnC,MAAM,aAAa,GAAG,OAAO,EAAE,aAAa,CAAC;IAC7C,IAAI,aAAa,IAAI,IAAI,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,eAAe,GAAG,aAAa,CAAC;QAChC,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,eAAe,IAAI,kBAAkB,CAAC;AAC/C,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc;IAC5B,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC"}
|
|
@@ -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", "Mail.Read.Shared", "Calendars.Read.Shared", "Files.Read.All", "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", "Notes.ReadWrite"];
|
|
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,scAiCf,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
|
*
|
|
@@ -35,6 +35,12 @@ export const GRAPH_SCOPES = [
|
|
|
35
35
|
'Tasks.ReadWrite',
|
|
36
36
|
'User.Read',
|
|
37
37
|
'offline_access',
|
|
38
|
+
// Shared mailboxes / delegate access (#40) — read another user's mailbox,
|
|
39
|
+
// calendar, and OneDrive via /users/{upn}/... where the signed-in user has
|
|
40
|
+
// shared/delegate access.
|
|
41
|
+
'Mail.Read.Shared',
|
|
42
|
+
'Calendars.Read.Shared',
|
|
43
|
+
'Files.Read.All',
|
|
38
44
|
// Teams
|
|
39
45
|
'ChannelMessage.Read.All',
|
|
40
46
|
'ChannelMessage.Send',
|
|
@@ -48,6 +54,12 @@ export const GRAPH_SCOPES = [
|
|
|
48
54
|
'Presence.Read.All',
|
|
49
55
|
// Planner
|
|
50
56
|
'Group.Read.All',
|
|
57
|
+
// OneDrive
|
|
58
|
+
'Files.ReadWrite',
|
|
59
|
+
// SharePoint
|
|
60
|
+
'Sites.Read.All',
|
|
61
|
+
// OneNote (read/search pages + create pages)
|
|
62
|
+
'Notes.ReadWrite',
|
|
51
63
|
];
|
|
52
64
|
/**
|
|
53
65
|
* 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;
|
|
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,0EAA0E;IAC1E,2EAA2E;IAC3E,0BAA0B;IAC1B,kBAAkB;IAClB,uBAAuB;IACvB,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;IAChB,6CAA6C;IAC7C,iBAAiB;CACT,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"}
|
|
@@ -11,9 +11,10 @@
|
|
|
11
11
|
* 3. User authenticates with Microsoft
|
|
12
12
|
* 4. Application receives tokens
|
|
13
13
|
*/
|
|
14
|
-
import { PublicClientApplication, } from '@azure/msal-node';
|
|
14
|
+
import { PublicClientApplication, InteractionRequiredAuthError, } from '@azure/msal-node';
|
|
15
15
|
import { loadGraphConfig, getAuthorityUrl } from './config.js';
|
|
16
16
|
import { createTokenCachePlugin, hasTokenCache } from './token-cache.js';
|
|
17
|
+
import { GraphAuthRequiredError } from '../../utils/errors.js';
|
|
17
18
|
/**
|
|
18
19
|
* Singleton MSAL application instance.
|
|
19
20
|
*/
|
|
@@ -89,24 +90,41 @@ export async function acquireTokenInteractive(deviceCodeCallback = defaultDevice
|
|
|
89
90
|
* Returns null if no cached token is available or if refresh fails.
|
|
90
91
|
*/
|
|
91
92
|
export async function acquireTokenSilent() {
|
|
93
|
+
try {
|
|
94
|
+
const outcome = await acquireTokenSilentDetailed();
|
|
95
|
+
return outcome.status === 'ok' ? outcome.result : null;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Preserve this wrapper's "null on any failure" contract even for the
|
|
99
|
+
// transient errors acquireTokenSilentDetailed now rethrows.
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async function acquireTokenSilentDetailed() {
|
|
92
104
|
const msal = getMsalInstance();
|
|
93
105
|
const config = getConfig();
|
|
94
|
-
// Get accounts from cache
|
|
95
106
|
const accounts = await msal.getTokenCache().getAllAccounts();
|
|
96
|
-
// Use the first account (most common case)
|
|
97
107
|
const account = accounts[0];
|
|
98
108
|
if (account == null) {
|
|
99
|
-
return
|
|
109
|
+
return { status: 'no_account' };
|
|
100
110
|
}
|
|
101
111
|
try {
|
|
102
|
-
|
|
112
|
+
const result = await msal.acquireTokenSilent({
|
|
103
113
|
account,
|
|
104
114
|
scopes: [...config.scopes],
|
|
105
115
|
});
|
|
116
|
+
return { status: 'ok', result };
|
|
106
117
|
}
|
|
107
|
-
catch {
|
|
108
|
-
//
|
|
109
|
-
|
|
118
|
+
catch (cause) {
|
|
119
|
+
// Only an interaction-required failure (expired/revoked refresh token,
|
|
120
|
+
// invalid_grant) means a re-auth is needed. Transient failures (network,
|
|
121
|
+
// throttling, server errors) are NOT auth problems — rethrow so the caller
|
|
122
|
+
// surfaces them as retriable errors rather than a misleading AUTH_EXPIRED or
|
|
123
|
+
// an unnecessary device-code prompt.
|
|
124
|
+
if (cause instanceof InteractionRequiredAuthError) {
|
|
125
|
+
return { status: 'refresh_failed', cause };
|
|
126
|
+
}
|
|
127
|
+
throw cause;
|
|
110
128
|
}
|
|
111
129
|
}
|
|
112
130
|
/**
|
|
@@ -116,13 +134,23 @@ export async function acquireTokenSilent() {
|
|
|
116
134
|
* 1. First tries to get a cached/refreshed token silently
|
|
117
135
|
* 2. If that fails, prompts for device code authentication
|
|
118
136
|
*/
|
|
119
|
-
export async function getAccessToken(deviceCodeCallback = defaultDeviceCodeCallback) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
137
|
+
export async function getAccessToken(deviceCodeCallback = defaultDeviceCodeCallback, options = {}) {
|
|
138
|
+
const silent = await acquireTokenSilentDetailed();
|
|
139
|
+
if (silent.status === 'ok') {
|
|
140
|
+
return silent.result.accessToken;
|
|
141
|
+
}
|
|
142
|
+
// A cached session that failed to refresh (expired/revoked, `invalid_grant`):
|
|
143
|
+
// in the MCP server (default) we must NOT fall into a fresh interactive
|
|
144
|
+
// device-code flow — it prints to an unwatched stderr and the call hangs until
|
|
145
|
+
// the code expires — so surface a typed AUTH_EXPIRED with the re-auth hint (U9).
|
|
146
|
+
// The CLI `auth` command sets interactiveOnExpired so a user at a terminal can
|
|
147
|
+
// actually recover by re-authenticating (otherwise the hint would be circular).
|
|
148
|
+
if (silent.status === 'refresh_failed' && options.interactiveOnExpired !== true) {
|
|
149
|
+
throw new GraphAuthRequiredError('session_expired');
|
|
125
150
|
}
|
|
151
|
+
// No cached account (genuine first-time), or an interactive-capable caller on
|
|
152
|
+
// an expired session: the device code is appropriate.
|
|
153
|
+
const result = await acquireTokenInteractive(deviceCodeCallback);
|
|
126
154
|
return result.accessToken;
|
|
127
155
|
}
|
|
128
156
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-code-flow.js","sourceRoot":"","sources":["../../../src/graph/auth/device-code-flow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AAEH,OAAO,EACL,uBAAuB,
|
|
1
|
+
{"version":3,"file":"device-code-flow.js","sourceRoot":"","sources":["../../../src/graph/auth/device-code-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,4 +10,5 @@
|
|
|
10
10
|
export { loadGraphConfig, getAuthorityUrl, GRAPH_SCOPES, type GraphAuthConfig } from './config.js';
|
|
11
11
|
export { createTokenCachePlugin, hasTokenCache, clearTokenCache, getTokenCacheDir, getTokenCacheFile, } from './token-cache.js';
|
|
12
12
|
export { acquireTokenInteractive, acquireTokenSilent, getAccessToken, isAuthenticated, getAccount, signOut, resetMsalInstance, type DeviceCodeCallback, } from './device-code-flow.js';
|
|
13
|
+
export { DEFAULT_ACCOUNT_ID, resolveAccountId, currentAccountId, resetAccountId, } from './account-id.js';
|
|
13
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/graph/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnG,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,KAAK,kBAAkB,GACxB,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/graph/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnG,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,KAAK,kBAAkB,GACxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACf,MAAM,iBAAiB,CAAC"}
|
package/dist/graph/auth/index.js
CHANGED
|
@@ -10,4 +10,5 @@
|
|
|
10
10
|
export { loadGraphConfig, getAuthorityUrl, GRAPH_SCOPES } from './config.js';
|
|
11
11
|
export { createTokenCachePlugin, hasTokenCache, clearTokenCache, getTokenCacheDir, getTokenCacheFile, } from './token-cache.js';
|
|
12
12
|
export { acquireTokenInteractive, acquireTokenSilent, getAccessToken, isAuthenticated, getAccount, signOut, resetMsalInstance, } from './device-code-flow.js';
|
|
13
|
+
export { DEFAULT_ACCOUNT_ID, resolveAccountId, currentAccountId, resetAccountId, } from './account-id.js';
|
|
13
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/graph/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAwB,MAAM,aAAa,CAAC;AAEnG,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,UAAU,EACV,OAAO,EACP,iBAAiB,GAElB,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/graph/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAwB,MAAM,aAAa,CAAC;AAEnG,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,UAAU,EACV,OAAO,EACP,iBAAiB,GAElB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACf,MAAM,iBAAiB,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* MSAL token cache plugin for persistent token storage.
|
|
7
7
|
*
|
|
8
|
-
* Stores tokens in ~/.
|
|
8
|
+
* Stores tokens in ~/.mcp-office365/tokens.json for persistence
|
|
9
9
|
* across application restarts.
|
|
10
10
|
*/
|
|
11
11
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
@@ -14,7 +14,7 @@ import { join } from 'node:path';
|
|
|
14
14
|
/**
|
|
15
15
|
* Directory where tokens are stored.
|
|
16
16
|
*/
|
|
17
|
-
const TOKEN_CACHE_DIR = join(homedir(), '.
|
|
17
|
+
const TOKEN_CACHE_DIR = join(homedir(), '.mcp-office365');
|
|
18
18
|
/**
|
|
19
19
|
* Path to the token cache file.
|
|
20
20
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-cache.js","sourceRoot":"","sources":["../../../src/graph/auth/token-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;GAEG;AACH,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"token-cache.js","sourceRoot":"","sources":["../../../src/graph/auth/token-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;GAEG;AACH,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAE1D;;GAEG;AACH,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AAE9D;;GAEG;AACH,SAAS,cAAc;IACrB,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAC/B;;;OAGG;IACH,4DAA4D;IAC5D,KAAK,CAAC,iBAAiB,CAAC,OAA0B;QAChD,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBACrD,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,4DAA4D;IAC5D,KAAK,CAAC,gBAAgB,CAAC,OAA0B;QAC/C,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,cAAc,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;gBAC5C,aAAa,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,sEAAsE;YACxE,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,oBAAoB,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjC,aAAa,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
|