@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.
Files changed (369) hide show
  1. package/README.md +66 -57
  2. package/dist/approval/hash.d.ts +8 -8
  3. package/dist/approval/token-manager.d.ts +37 -19
  4. package/dist/approval/token-manager.d.ts.map +1 -1
  5. package/dist/approval/token-manager.js +133 -37
  6. package/dist/approval/token-manager.js.map +1 -1
  7. package/dist/approval/types.d.ts +7 -3
  8. package/dist/approval/types.d.ts.map +1 -1
  9. package/dist/cli.d.ts +21 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +100 -2
  12. package/dist/cli.js.map +1 -1
  13. package/dist/database/repository.d.ts +48 -48
  14. package/dist/database/repository.d.ts.map +1 -1
  15. package/dist/database/repository.js.map +1 -1
  16. package/dist/delta/mirror.d.ts +67 -0
  17. package/dist/delta/mirror.d.ts.map +1 -0
  18. package/dist/delta/mirror.js +183 -0
  19. package/dist/delta/mirror.js.map +1 -0
  20. package/dist/graph/auth/account-id.d.ts +19 -0
  21. package/dist/graph/auth/account-id.d.ts.map +1 -0
  22. package/dist/graph/auth/account-id.js +55 -0
  23. package/dist/graph/auth/account-id.js.map +1 -0
  24. package/dist/graph/auth/config.d.ts +1 -1
  25. package/dist/graph/auth/config.d.ts.map +1 -1
  26. package/dist/graph/auth/config.js +13 -1
  27. package/dist/graph/auth/config.js.map +1 -1
  28. package/dist/graph/auth/device-code-flow.d.ts +3 -1
  29. package/dist/graph/auth/device-code-flow.d.ts.map +1 -1
  30. package/dist/graph/auth/device-code-flow.js +42 -14
  31. package/dist/graph/auth/device-code-flow.js.map +1 -1
  32. package/dist/graph/auth/index.d.ts +1 -0
  33. package/dist/graph/auth/index.d.ts.map +1 -1
  34. package/dist/graph/auth/index.js +1 -0
  35. package/dist/graph/auth/index.js.map +1 -1
  36. package/dist/graph/auth/token-cache.js +2 -2
  37. package/dist/graph/auth/token-cache.js.map +1 -1
  38. package/dist/graph/client/graph-client.d.ts +141 -8
  39. package/dist/graph/client/graph-client.d.ts.map +1 -1
  40. package/dist/graph/client/graph-client.js +536 -48
  41. package/dist/graph/client/graph-client.js.map +1 -1
  42. package/dist/graph/client/immutable-id-middleware.d.ts +50 -0
  43. package/dist/graph/client/immutable-id-middleware.d.ts.map +1 -0
  44. package/dist/graph/client/immutable-id-middleware.js +137 -0
  45. package/dist/graph/client/immutable-id-middleware.js.map +1 -0
  46. package/dist/graph/content-readers.d.ts +0 -12
  47. package/dist/graph/content-readers.d.ts.map +1 -1
  48. package/dist/graph/content-readers.js +0 -21
  49. package/dist/graph/content-readers.js.map +1 -1
  50. package/dist/graph/index.d.ts +5 -6
  51. package/dist/graph/index.d.ts.map +1 -1
  52. package/dist/graph/index.js +5 -6
  53. package/dist/graph/index.js.map +1 -1
  54. package/dist/graph/mailbox-adapter.d.ts +15 -15
  55. package/dist/graph/mappers/contact-mapper.d.ts +4 -1
  56. package/dist/graph/mappers/contact-mapper.d.ts.map +1 -1
  57. package/dist/graph/mappers/contact-mapper.js +7 -3
  58. package/dist/graph/mappers/contact-mapper.js.map +1 -1
  59. package/dist/graph/mappers/email-mapper.d.ts.map +1 -1
  60. package/dist/graph/mappers/email-mapper.js +7 -4
  61. package/dist/graph/mappers/email-mapper.js.map +1 -1
  62. package/dist/graph/mappers/event-mapper.d.ts.map +1 -1
  63. package/dist/graph/mappers/event-mapper.js +6 -3
  64. package/dist/graph/mappers/event-mapper.js.map +1 -1
  65. package/dist/graph/mappers/folder-mapper.d.ts +0 -4
  66. package/dist/graph/mappers/folder-mapper.d.ts.map +1 -1
  67. package/dist/graph/mappers/folder-mapper.js +9 -19
  68. package/dist/graph/mappers/folder-mapper.js.map +1 -1
  69. package/dist/graph/mappers/index.d.ts +2 -2
  70. package/dist/graph/mappers/index.d.ts.map +1 -1
  71. package/dist/graph/mappers/index.js +2 -2
  72. package/dist/graph/mappers/index.js.map +1 -1
  73. package/dist/graph/mappers/task-mapper.d.ts +4 -2
  74. package/dist/graph/mappers/task-mapper.d.ts.map +1 -1
  75. package/dist/graph/mappers/task-mapper.js +7 -5
  76. package/dist/graph/mappers/task-mapper.js.map +1 -1
  77. package/dist/graph/mappers/utils.d.ts +0 -10
  78. package/dist/graph/mappers/utils.d.ts.map +1 -1
  79. package/dist/graph/mappers/utils.js +0 -19
  80. package/dist/graph/mappers/utils.js.map +1 -1
  81. package/dist/graph/repository.d.ts +409 -276
  82. package/dist/graph/repository.d.ts.map +1 -1
  83. package/dist/graph/repository.js +772 -1082
  84. package/dist/graph/repository.js.map +1 -1
  85. package/dist/ids/mint.d.ts +31 -0
  86. package/dist/ids/mint.d.ts.map +1 -0
  87. package/dist/ids/mint.js +36 -0
  88. package/dist/ids/mint.js.map +1 -0
  89. package/dist/ids/next-action.d.ts +29 -0
  90. package/dist/ids/next-action.d.ts.map +1 -0
  91. package/dist/ids/next-action.js +58 -0
  92. package/dist/ids/next-action.js.map +1 -0
  93. package/dist/ids/resolver.d.ts +31 -0
  94. package/dist/ids/resolver.d.ts.map +1 -0
  95. package/dist/ids/resolver.js +52 -0
  96. package/dist/ids/resolver.js.map +1 -0
  97. package/dist/ids/schema.d.ts +91 -0
  98. package/dist/ids/schema.d.ts.map +1 -0
  99. package/dist/ids/schema.js +131 -0
  100. package/dist/ids/schema.js.map +1 -0
  101. package/dist/ids/token.d.ts +62 -0
  102. package/dist/ids/token.d.ts.map +1 -0
  103. package/dist/ids/token.js +225 -0
  104. package/dist/ids/token.js.map +1 -0
  105. package/dist/index.d.ts +10 -6
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +255 -5925
  108. package/dist/index.js.map +1 -1
  109. package/dist/parsers/index.d.ts +0 -1
  110. package/dist/parsers/index.d.ts.map +1 -1
  111. package/dist/parsers/index.js +0 -1
  112. package/dist/parsers/index.js.map +1 -1
  113. package/dist/registry/all-tools.d.ts +14 -0
  114. package/dist/registry/all-tools.d.ts.map +1 -0
  115. package/dist/registry/all-tools.js +68 -0
  116. package/dist/registry/all-tools.js.map +1 -0
  117. package/dist/registry/context.d.ts +19 -0
  118. package/dist/registry/context.d.ts.map +1 -0
  119. package/dist/registry/context.js +20 -0
  120. package/dist/registry/context.js.map +1 -0
  121. package/dist/registry/define-tool.d.ts +15 -0
  122. package/dist/registry/define-tool.d.ts.map +1 -0
  123. package/dist/registry/define-tool.js +8 -0
  124. package/dist/registry/define-tool.js.map +1 -0
  125. package/dist/registry/elicit-links.d.ts +35 -0
  126. package/dist/registry/elicit-links.d.ts.map +1 -0
  127. package/dist/registry/elicit-links.js +102 -0
  128. package/dist/registry/elicit-links.js.map +1 -0
  129. package/dist/registry/elicitor.d.ts +24 -0
  130. package/dist/registry/elicitor.d.ts.map +1 -0
  131. package/dist/registry/elicitor.js +51 -0
  132. package/dist/registry/elicitor.js.map +1 -0
  133. package/dist/registry/index.d.ts +13 -0
  134. package/dist/registry/index.d.ts.map +1 -0
  135. package/dist/registry/index.js +8 -0
  136. package/dist/registry/index.js.map +1 -0
  137. package/dist/registry/registry.d.ts +73 -0
  138. package/dist/registry/registry.d.ts.map +1 -0
  139. package/dist/registry/registry.js +221 -0
  140. package/dist/registry/registry.js.map +1 -0
  141. package/dist/registry/types.d.ts +146 -0
  142. package/dist/registry/types.d.ts.map +1 -0
  143. package/dist/registry/types.js +6 -0
  144. package/dist/registry/types.js.map +1 -0
  145. package/dist/search/compiler.d.ts +49 -0
  146. package/dist/search/compiler.d.ts.map +1 -0
  147. package/dist/search/compiler.js +168 -0
  148. package/dist/search/compiler.js.map +1 -0
  149. package/dist/signature.js +2 -2
  150. package/dist/signature.js.map +1 -1
  151. package/dist/state/delta-store.d.ts +85 -0
  152. package/dist/state/delta-store.d.ts.map +1 -0
  153. package/dist/state/delta-store.js +124 -0
  154. package/dist/state/delta-store.js.map +1 -0
  155. package/dist/state/migrate.d.ts +23 -0
  156. package/dist/state/migrate.d.ts.map +1 -0
  157. package/dist/state/migrate.js +81 -0
  158. package/dist/state/migrate.js.map +1 -0
  159. package/dist/state/schema.d.ts +26 -0
  160. package/dist/state/schema.d.ts.map +1 -0
  161. package/dist/state/schema.js +77 -0
  162. package/dist/state/schema.js.map +1 -0
  163. package/dist/state/store.d.ts +155 -0
  164. package/dist/state/store.d.ts.map +1 -0
  165. package/dist/state/store.js +321 -0
  166. package/dist/state/store.js.map +1 -0
  167. package/dist/tools/calendar-graph.d.ts +41 -0
  168. package/dist/tools/calendar-graph.d.ts.map +1 -0
  169. package/dist/tools/calendar-graph.js +299 -0
  170. package/dist/tools/calendar-graph.js.map +1 -0
  171. package/dist/tools/calendar-permissions.d.ts +17 -7
  172. package/dist/tools/calendar-permissions.d.ts.map +1 -1
  173. package/dist/tools/calendar-permissions.js +60 -4
  174. package/dist/tools/calendar-permissions.js.map +1 -1
  175. package/dist/tools/calendar.d.ts +133 -82
  176. package/dist/tools/calendar.d.ts.map +1 -1
  177. package/dist/tools/calendar.js +249 -136
  178. package/dist/tools/calendar.js.map +1 -1
  179. package/dist/tools/categories.d.ts +14 -4
  180. package/dist/tools/categories.d.ts.map +1 -1
  181. package/dist/tools/categories.js +59 -2
  182. package/dist/tools/categories.js.map +1 -1
  183. package/dist/tools/checklist-items.d.ts +19 -9
  184. package/dist/tools/checklist-items.d.ts.map +1 -1
  185. package/dist/tools/checklist-items.js +71 -5
  186. package/dist/tools/checklist-items.js.map +1 -1
  187. package/dist/tools/contact-folders.d.ts +50 -0
  188. package/dist/tools/contact-folders.d.ts.map +1 -0
  189. package/dist/tools/contact-folders.js +136 -0
  190. package/dist/tools/contact-folders.js.map +1 -0
  191. package/dist/tools/contacts-graph.d.ts +45 -0
  192. package/dist/tools/contacts-graph.d.ts.map +1 -0
  193. package/dist/tools/contacts-graph.js +174 -0
  194. package/dist/tools/contacts-graph.js.map +1 -0
  195. package/dist/tools/contacts.d.ts +61 -30
  196. package/dist/tools/contacts.d.ts.map +1 -1
  197. package/dist/tools/contacts.js +150 -93
  198. package/dist/tools/contacts.js.map +1 -1
  199. package/dist/tools/excel.d.ts +20 -10
  200. package/dist/tools/excel.d.ts.map +1 -1
  201. package/dist/tools/excel.js +82 -6
  202. package/dist/tools/excel.js.map +1 -1
  203. package/dist/tools/focused-overrides.d.ts +14 -4
  204. package/dist/tools/focused-overrides.d.ts.map +1 -1
  205. package/dist/tools/focused-overrides.js +59 -2
  206. package/dist/tools/focused-overrides.js.map +1 -1
  207. package/dist/tools/index.d.ts +4 -5
  208. package/dist/tools/index.d.ts.map +1 -1
  209. package/dist/tools/index.js +4 -6
  210. package/dist/tools/index.js.map +1 -1
  211. package/dist/tools/linked-resources.d.ts +17 -7
  212. package/dist/tools/linked-resources.d.ts.map +1 -1
  213. package/dist/tools/linked-resources.js +60 -4
  214. package/dist/tools/linked-resources.js.map +1 -1
  215. package/dist/tools/mail-graph.d.ts +38 -0
  216. package/dist/tools/mail-graph.d.ts.map +1 -0
  217. package/dist/tools/mail-graph.js +187 -0
  218. package/dist/tools/mail-graph.js.map +1 -0
  219. package/dist/tools/mail-rules.d.ts +20 -8
  220. package/dist/tools/mail-rules.d.ts.map +1 -1
  221. package/dist/tools/mail-rules.js +63 -7
  222. package/dist/tools/mail-rules.js.map +1 -1
  223. package/dist/tools/mail-send.d.ts +39 -27
  224. package/dist/tools/mail-send.d.ts.map +1 -1
  225. package/dist/tools/mail-send.js +249 -24
  226. package/dist/tools/mail-send.js.map +1 -1
  227. package/dist/tools/mail.d.ts +91 -68
  228. package/dist/tools/mail.d.ts.map +1 -1
  229. package/dist/tools/mail.js +232 -243
  230. package/dist/tools/mail.js.map +1 -1
  231. package/dist/tools/mailbox-organization.d.ts +51 -34
  232. package/dist/tools/mailbox-organization.d.ts.map +1 -1
  233. package/dist/tools/mailbox-organization.js +318 -35
  234. package/dist/tools/mailbox-organization.js.map +1 -1
  235. package/dist/tools/mailbox-settings.d.ts +59 -0
  236. package/dist/tools/mailbox-settings.d.ts.map +1 -0
  237. package/dist/tools/mailbox-settings.js +136 -0
  238. package/dist/tools/mailbox-settings.js.map +1 -0
  239. package/dist/tools/meetings.d.ts +24 -14
  240. package/dist/tools/meetings.d.ts.map +1 -1
  241. package/dist/tools/meetings.js +82 -6
  242. package/dist/tools/meetings.js.map +1 -1
  243. package/dist/tools/onedrive.d.ts +26 -16
  244. package/dist/tools/onedrive.d.ts.map +1 -1
  245. package/dist/tools/onedrive.js +140 -11
  246. package/dist/tools/onedrive.js.map +1 -1
  247. package/dist/tools/onenote.d.ts +63 -0
  248. package/dist/tools/onenote.d.ts.map +1 -0
  249. package/dist/tools/onenote.js +221 -0
  250. package/dist/tools/onenote.js.map +1 -0
  251. package/dist/tools/people.d.ts +10 -0
  252. package/dist/tools/people.d.ts.map +1 -1
  253. package/dist/tools/people.js +94 -0
  254. package/dist/tools/people.js.map +1 -1
  255. package/dist/tools/planner-visualization.d.ts +15 -5
  256. package/dist/tools/planner-visualization.d.ts.map +1 -1
  257. package/dist/tools/planner-visualization.js +58 -4
  258. package/dist/tools/planner-visualization.js.map +1 -1
  259. package/dist/tools/planner.d.ts +69 -39
  260. package/dist/tools/planner.d.ts.map +1 -1
  261. package/dist/tools/planner.js +231 -23
  262. package/dist/tools/planner.js.map +1 -1
  263. package/dist/tools/scheduling.d.ts +12 -0
  264. package/dist/tools/scheduling.d.ts.map +1 -1
  265. package/dist/tools/scheduling.js +38 -0
  266. package/dist/tools/scheduling.js.map +1 -1
  267. package/dist/tools/shared-mailbox.d.ts +164 -0
  268. package/dist/tools/shared-mailbox.d.ts.map +1 -0
  269. package/dist/tools/shared-mailbox.js +318 -0
  270. package/dist/tools/shared-mailbox.js.map +1 -0
  271. package/dist/tools/sharepoint-lists.d.ts +131 -0
  272. package/dist/tools/sharepoint-lists.d.ts.map +1 -0
  273. package/dist/tools/sharepoint-lists.js +246 -0
  274. package/dist/tools/sharepoint-lists.js.map +1 -0
  275. package/dist/tools/sharepoint.d.ts +24 -14
  276. package/dist/tools/sharepoint.d.ts.map +1 -1
  277. package/dist/tools/sharepoint.js +85 -9
  278. package/dist/tools/sharepoint.js.map +1 -1
  279. package/dist/tools/task-attachments.d.ts +17 -7
  280. package/dist/tools/task-attachments.d.ts.map +1 -1
  281. package/dist/tools/task-attachments.js +60 -4
  282. package/dist/tools/task-attachments.js.map +1 -1
  283. package/dist/tools/task-lists.d.ts +56 -0
  284. package/dist/tools/task-lists.d.ts.map +1 -0
  285. package/dist/tools/task-lists.js +155 -0
  286. package/dist/tools/task-lists.js.map +1 -0
  287. package/dist/tools/tasks-graph.d.ts +49 -0
  288. package/dist/tools/tasks-graph.d.ts.map +1 -0
  289. package/dist/tools/tasks-graph.js +193 -0
  290. package/dist/tools/tasks-graph.js.map +1 -0
  291. package/dist/tools/tasks.d.ts +121 -29
  292. package/dist/tools/tasks.d.ts.map +1 -1
  293. package/dist/tools/tasks.js +136 -84
  294. package/dist/tools/tasks.js.map +1 -1
  295. package/dist/tools/teams.d.ts +57 -46
  296. package/dist/tools/teams.d.ts.map +1 -1
  297. package/dist/tools/teams.js +288 -26
  298. package/dist/tools/teams.js.map +1 -1
  299. package/dist/tools/what-changed.d.ts +48 -0
  300. package/dist/tools/what-changed.d.ts.map +1 -0
  301. package/dist/tools/what-changed.js +149 -0
  302. package/dist/tools/what-changed.js.map +1 -0
  303. package/dist/types/calendar.d.ts +1 -1
  304. package/dist/types/calendar.d.ts.map +1 -1
  305. package/dist/types/calendar.js.map +1 -1
  306. package/dist/types/contacts.d.ts +1 -1
  307. package/dist/types/contacts.d.ts.map +1 -1
  308. package/dist/types/contacts.js.map +1 -1
  309. package/dist/types/mail.d.ts +1 -1
  310. package/dist/types/mail.d.ts.map +1 -1
  311. package/dist/types/mail.js.map +1 -1
  312. package/dist/utils/errors.d.ts +110 -38
  313. package/dist/utils/errors.d.ts.map +1 -1
  314. package/dist/utils/errors.js +239 -56
  315. package/dist/utils/errors.js.map +1 -1
  316. package/dist/visualization/types.d.ts +4 -4
  317. package/package.json +2 -3
  318. package/dist/applescript/account-repository.d.ts +0 -30
  319. package/dist/applescript/account-repository.d.ts.map +0 -1
  320. package/dist/applescript/account-repository.js +0 -38
  321. package/dist/applescript/account-repository.js.map +0 -1
  322. package/dist/applescript/account-scripts.d.ts +0 -21
  323. package/dist/applescript/account-scripts.d.ts.map +0 -1
  324. package/dist/applescript/account-scripts.js +0 -180
  325. package/dist/applescript/account-scripts.js.map +0 -1
  326. package/dist/applescript/calendar-manager.d.ts +0 -44
  327. package/dist/applescript/calendar-manager.d.ts.map +0 -1
  328. package/dist/applescript/calendar-manager.js +0 -92
  329. package/dist/applescript/calendar-manager.js.map +0 -1
  330. package/dist/applescript/calendar-writer.d.ts +0 -36
  331. package/dist/applescript/calendar-writer.d.ts.map +0 -1
  332. package/dist/applescript/calendar-writer.js +0 -94
  333. package/dist/applescript/calendar-writer.js.map +0 -1
  334. package/dist/applescript/content-readers.d.ts +0 -114
  335. package/dist/applescript/content-readers.d.ts.map +0 -1
  336. package/dist/applescript/content-readers.js +0 -328
  337. package/dist/applescript/content-readers.js.map +0 -1
  338. package/dist/applescript/executor.d.ts +0 -60
  339. package/dist/applescript/executor.d.ts.map +0 -1
  340. package/dist/applescript/executor.js +0 -173
  341. package/dist/applescript/executor.js.map +0 -1
  342. package/dist/applescript/index.d.ts +0 -20
  343. package/dist/applescript/index.d.ts.map +0 -1
  344. package/dist/applescript/index.js +0 -29
  345. package/dist/applescript/index.js.map +0 -1
  346. package/dist/applescript/mail-sender.d.ts +0 -38
  347. package/dist/applescript/mail-sender.d.ts.map +0 -1
  348. package/dist/applescript/mail-sender.js +0 -67
  349. package/dist/applescript/mail-sender.js.map +0 -1
  350. package/dist/applescript/parser.d.ts +0 -235
  351. package/dist/applescript/parser.d.ts.map +0 -1
  352. package/dist/applescript/parser.js +0 -496
  353. package/dist/applescript/parser.js.map +0 -1
  354. package/dist/applescript/repository.d.ts +0 -64
  355. package/dist/applescript/repository.d.ts.map +0 -1
  356. package/dist/applescript/repository.js +0 -444
  357. package/dist/applescript/repository.js.map +0 -1
  358. package/dist/applescript/scripts.d.ts +0 -265
  359. package/dist/applescript/scripts.d.ts.map +0 -1
  360. package/dist/applescript/scripts.js +0 -1483
  361. package/dist/applescript/scripts.js.map +0 -1
  362. package/dist/parsers/olk15.d.ts +0 -87
  363. package/dist/parsers/olk15.d.ts.map +0 -1
  364. package/dist/parsers/olk15.js +0 -368
  365. package/dist/parsers/olk15.js.map +0 -1
  366. package/dist/tools/notes.d.ts +0 -74
  367. package/dist/tools/notes.d.ts.map +0 -1
  368. package/dist/tools/notes.js +0 -136
  369. package/dist/tools/notes.js.map +0 -1
@@ -0,0 +1,321 @@
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
+ * Durable state store (U4) — a better-sqlite3-backed store at
7
+ * `~/.mcp-office365/state.db` holding durable-ID aliases and two-phase approval
8
+ * tokens. Provides the concurrency (WAL + busy_timeout + atomic consume, D7),
9
+ * at-rest (0700/0600 permissions, D18), account-stamping (D7), and
10
+ * degradation (in-memory fallback, D15) semantics the rest of v3 builds on.
11
+ *
12
+ * This unit is the storage layer only; wiring into the ID resolver (U5) and the
13
+ * approval manager (U9) lands in those units.
14
+ */
15
+ import Database from 'better-sqlite3';
16
+ import { chmodSync, existsSync, mkdirSync } from 'node:fs';
17
+ import { homedir } from 'node:os';
18
+ import { join } from 'node:path';
19
+ import { runMigrations, migrateLegacyTokens } from './migrate.js';
20
+ import { APPROVAL_RETENTION_MS } from './schema.js';
21
+ import { DeltaStore } from './delta-store.js';
22
+ const DEFAULT_DIR = join(homedir(), '.mcp-office365');
23
+ const LEGACY_DIR = join(homedir(), '.outlook-mcp');
24
+ const DB_FILENAME = 'state.db';
25
+ export class StateStore {
26
+ /** True when running from an in-memory fallback (durability degraded). */
27
+ degraded;
28
+ /** The db path, or ':memory:' when degraded. */
29
+ path;
30
+ /** Effective `journal_mode` pragma (e.g. 'wal'). */
31
+ journalMode;
32
+ /** Effective `busy_timeout` pragma in ms. */
33
+ busyTimeout;
34
+ /** Delta-sync mirror storage (U12), sharing this store's connection. */
35
+ delta;
36
+ db;
37
+ now;
38
+ constructor(db, path, degraded, now) {
39
+ this.db = db;
40
+ this.path = path;
41
+ this.degraded = degraded;
42
+ this.now = now;
43
+ this.journalMode = String(db.pragma('journal_mode', { simple: true }));
44
+ this.busyTimeout = Number(db.pragma('busy_timeout', { simple: true }));
45
+ this.delta = new DeltaStore(db, now);
46
+ }
47
+ /**
48
+ * Opens (creating if needed) the durable store. On any failure to use the
49
+ * on-disk db (corrupt/locked file, unwritable dir) it degrades to an in-memory
50
+ * store, emits a stderr warning, and reports `degraded = true` — the server
51
+ * stays usable, only durability is lost for the run.
52
+ */
53
+ static open(options = {}) {
54
+ const dir = options.dir ?? DEFAULT_DIR;
55
+ const legacyDir = options.legacyDir ?? LEGACY_DIR;
56
+ const now = options.now ?? (() => Date.now());
57
+ const warn = options.warn ?? ((msg) => void process.stderr.write(`${msg}\n`));
58
+ let fileDb;
59
+ try {
60
+ // Directory: create 0700, or repair perms if it already exists (D18).
61
+ if (!existsSync(dir)) {
62
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
63
+ }
64
+ else {
65
+ safeChmod(dir, 0o700, warn);
66
+ }
67
+ const dbPath = join(dir, DB_FILENAME);
68
+ fileDb = new Database(dbPath);
69
+ configurePragmas(fileDb);
70
+ runMigrations(fileDb); // executes DDL — surfaces a corrupt/newer file here
71
+ // The file (and its -wal/-shm sidecars) may have just been created;
72
+ // enforce 0600 across all three (and repair a loose one).
73
+ safeChmod(dbPath, 0o600, warn);
74
+ safeChmod(`${dbPath}-wal`, 0o600, warn);
75
+ safeChmod(`${dbPath}-shm`, 0o600, warn);
76
+ const store = new StateStore(fileDb, dbPath, false, now);
77
+ // The legacy token copy and boot purge are conveniences — a failure in
78
+ // either must NOT discard an otherwise-healthy on-disk store, so they run
79
+ // outside the degrade-governing path (warn-and-continue).
80
+ try {
81
+ migrateLegacyTokens(fileDb, dir, legacyDir);
82
+ }
83
+ catch (e) {
84
+ warn(`[mcp-office365] legacy token migration skipped (${e instanceof Error ? e.message : String(e)}).`);
85
+ }
86
+ try {
87
+ store.purgeExpired(now());
88
+ }
89
+ catch (e) {
90
+ warn(`[mcp-office365] boot purge skipped (${e instanceof Error ? e.message : String(e)}).`);
91
+ }
92
+ return store;
93
+ }
94
+ catch (error) {
95
+ // Release the on-disk handle (and its WAL lock) before degrading, so a
96
+ // failed open does not leak a file descriptor / lock for the process.
97
+ if (fileDb !== undefined) {
98
+ try {
99
+ fileDb.close();
100
+ }
101
+ catch {
102
+ /* best-effort */
103
+ }
104
+ }
105
+ const reason = error instanceof Error ? error.message : String(error);
106
+ warn(`[mcp-office365] state store unavailable (${reason}); running in-memory (durability degraded).`);
107
+ const mem = new Database(':memory:');
108
+ configurePragmas(mem);
109
+ runMigrations(mem);
110
+ return new StateStore(mem, ':memory:', true, now);
111
+ }
112
+ }
113
+ // ---- Aliases (D3) --------------------------------------------------------
114
+ /** Inserts or replaces a durable-ID alias. */
115
+ putAlias(input) {
116
+ this.db
117
+ .prepare(`INSERT INTO aliases (token, graph_id, entity_type, account_id, mutable, created_at)
118
+ VALUES (@token, @graphId, @entityType, @accountId, @mutable, @createdAt)
119
+ ON CONFLICT(token) DO UPDATE SET
120
+ graph_id = excluded.graph_id,
121
+ entity_type = excluded.entity_type,
122
+ account_id = excluded.account_id,
123
+ mutable = excluded.mutable`)
124
+ .run({
125
+ token: input.token,
126
+ graphId: input.graphId,
127
+ entityType: input.entityType,
128
+ accountId: input.accountId,
129
+ mutable: input.mutable === true ? 1 : 0,
130
+ createdAt: input.createdAt ?? this.now(),
131
+ });
132
+ }
133
+ /**
134
+ * Resolves an alias token, scoped to `accountId` (D7 account stamping). The
135
+ * account is a mandatory, fail-closed argument: a row minted under a different
136
+ * account is invisible, so no caller can accidentally resolve a foreign
137
+ * account's durable ID into a live Graph ID by omitting the scope.
138
+ */
139
+ getAlias(token, accountId) {
140
+ const raw = this.db
141
+ .prepare('SELECT * FROM aliases WHERE token = ? AND account_id = ?')
142
+ .get(token, accountId);
143
+ if (raw === undefined) {
144
+ return null;
145
+ }
146
+ return {
147
+ token: raw.token,
148
+ graphId: raw.graph_id,
149
+ entityType: raw.entity_type,
150
+ accountId: raw.account_id,
151
+ mutable: raw.mutable !== 0,
152
+ createdAt: raw.created_at,
153
+ };
154
+ }
155
+ /**
156
+ * Atomically registers an alias with D1a collision enforcement, in a single
157
+ * IMMEDIATE transaction so the check-and-write is not a read-then-write race:
158
+ * two concurrent immutable registrations of the same token cannot both pass
159
+ * the check and then clobber each other. Returns `'collision'` when a
160
+ * *different* Graph ID already occupies the token for an immutable entity
161
+ * (neither the stored nor the new row is mutable); otherwise upserts and
162
+ * returns `'ok'`.
163
+ */
164
+ registerAlias(input) {
165
+ const run = this.db.transaction(() => {
166
+ const existing = this.getAliasUnscoped(input.token);
167
+ if (existing !== null &&
168
+ existing.graphId !== input.graphId &&
169
+ !existing.mutable &&
170
+ input.mutable !== true) {
171
+ return 'collision';
172
+ }
173
+ this.putAlias(input);
174
+ return 'ok';
175
+ });
176
+ return run.immediate();
177
+ }
178
+ /**
179
+ * Returns an alias row regardless of account, or null. Reserved for two
180
+ * internal uses that must see across accounts: foreign-account disambiguation
181
+ * during resolution, and collision detection at mint time (D1a). It is NOT a
182
+ * resolution path — {@link getAlias} (account-scoped) is the only one of those.
183
+ */
184
+ getAliasUnscoped(token) {
185
+ const raw = this.db.prepare('SELECT * FROM aliases WHERE token = ?').get(token);
186
+ if (raw === undefined) {
187
+ return null;
188
+ }
189
+ return {
190
+ token: raw.token,
191
+ graphId: raw.graph_id,
192
+ entityType: raw.entity_type,
193
+ accountId: raw.account_id,
194
+ mutable: raw.mutable !== 0,
195
+ createdAt: raw.created_at,
196
+ };
197
+ }
198
+ /**
199
+ * Returns the account a token was minted under (any account), or null when the
200
+ * token is unknown. Distinguishes "foreign account" from "unknown" during
201
+ * resolution so a foreign token yields a typed ID_FOREIGN_ACCOUNT.
202
+ */
203
+ getAliasAccount(token) {
204
+ return this.getAliasUnscoped(token)?.accountId ?? null;
205
+ }
206
+ // ---- Approval tokens (D7/D8) --------------------------------------------
207
+ /**
208
+ * Reads an approval token scoped to `accountId` (or null). A read view for
209
+ * validation/preview; redemption still goes through {@link consumeApprovalToken}
210
+ * so the atomic guard is never bypassed.
211
+ */
212
+ getApprovalToken(token, accountId) {
213
+ const raw = this.db
214
+ .prepare('SELECT token, action, target_json, content_hash, expires_at, redeemed_at, receipt_json, created_at FROM approval_tokens WHERE token = ? AND account_id = ?')
215
+ .get(token, accountId);
216
+ if (raw === undefined) {
217
+ return null;
218
+ }
219
+ return {
220
+ token: raw.token,
221
+ action: raw.action,
222
+ targetJson: raw.target_json,
223
+ contentHash: raw.content_hash,
224
+ expiresAt: raw.expires_at,
225
+ redeemedAt: raw.redeemed_at,
226
+ receiptJson: raw.receipt_json,
227
+ createdAt: raw.created_at,
228
+ };
229
+ }
230
+ /** Stages a two-phase approval token. */
231
+ putApprovalToken(input) {
232
+ this.db
233
+ .prepare(`INSERT INTO approval_tokens
234
+ (token, operation_key, action, target_json, content_hash, account_id, expires_at, created_at)
235
+ VALUES (@token, @operationKey, @action, @targetJson, @contentHash, @accountId, @expiresAt, @createdAt)`)
236
+ .run({
237
+ token: input.token,
238
+ operationKey: input.operationKey ?? null,
239
+ action: input.action,
240
+ targetJson: input.targetJson,
241
+ contentHash: input.contentHash ?? null,
242
+ accountId: input.accountId,
243
+ expiresAt: input.expiresAt,
244
+ createdAt: input.createdAt ?? this.now(),
245
+ });
246
+ }
247
+ /**
248
+ * Atomically consumes an approval token (D8). The guarded `UPDATE … WHERE
249
+ * redeemed_at IS NULL AND expires_at > now RETURNING` means only one caller —
250
+ * across processes sharing the db — can win the redemption; the loser sees
251
+ * `already_redeemed` and can return the stored receipt. Expiry is enforced
252
+ * here at the trust boundary (not left to callers): an expired token that
253
+ * still authorizes a send/delete would defeat the whole point of a time-boxed
254
+ * two-phase approval. Foreign-account tokens are refused.
255
+ */
256
+ consumeApprovalToken(args) {
257
+ const now = args.now ?? this.now();
258
+ const updated = this.db
259
+ .prepare(`UPDATE approval_tokens
260
+ SET redeemed_at = ?, receipt_json = ?
261
+ WHERE token = ? AND account_id = ? AND redeemed_at IS NULL AND expires_at > ?
262
+ RETURNING receipt_json`)
263
+ .get(now, args.receiptJson ?? null, args.token, args.accountId, now);
264
+ if (updated !== undefined) {
265
+ return { status: 'consumed', receiptJson: updated.receipt_json };
266
+ }
267
+ // Classify why the guarded update matched nothing.
268
+ const row = this.db
269
+ .prepare('SELECT account_id, redeemed_at, receipt_json, expires_at FROM approval_tokens WHERE token = ?')
270
+ .get(args.token);
271
+ if (row === undefined) {
272
+ return { status: 'not_found' };
273
+ }
274
+ if (row.account_id !== args.accountId) {
275
+ return { status: 'foreign_account' };
276
+ }
277
+ // Redemption takes precedence over expiry so an idempotent re-consume of an
278
+ // already-redeemed token still returns its receipt.
279
+ if (row.redeemed_at !== null) {
280
+ return { status: 'already_redeemed', receiptJson: row.receipt_json };
281
+ }
282
+ return { status: 'expired' };
283
+ }
284
+ // ---- Maintenance ---------------------------------------------------------
285
+ /**
286
+ * Deletes approval tokens whose expiry is older than the retention window
287
+ * (D8, 90 days). Recently-expired receipts linger so idempotent redemption
288
+ * still returns them. Returns the number of rows purged.
289
+ */
290
+ purgeExpired(now) {
291
+ const cutoff = now - APPROVAL_RETENTION_MS;
292
+ const result = this.db.prepare('DELETE FROM approval_tokens WHERE expires_at < ?').run(cutoff);
293
+ return result.changes;
294
+ }
295
+ close() {
296
+ this.db.close();
297
+ }
298
+ }
299
+ function configurePragmas(db) {
300
+ db.pragma('journal_mode = WAL');
301
+ db.pragma('busy_timeout = 5000');
302
+ }
303
+ /**
304
+ * chmod that never throws. Windows/filesystems without POSIX modes fail benignly
305
+ * and are ignored; a genuine failure on a POSIX host (e.g. EPERM) means the file
306
+ * may sit with looser-than-intended permissions, so we surface it via `warn`
307
+ * rather than swallow silently — the at-rest exposure should be observable.
308
+ * A missing sidecar (-wal/-shm not yet created) is not a failure worth noting.
309
+ */
310
+ function safeChmod(target, mode, warn) {
311
+ try {
312
+ chmodSync(target, mode);
313
+ }
314
+ catch (error) {
315
+ const code = error.code;
316
+ if (process.platform !== 'win32' && code !== 'ENOENT' && warn != null) {
317
+ warn(`[mcp-office365] could not set permissions on ${target} (${code ?? 'error'}); it may be readable by other local users.`);
318
+ }
319
+ }
320
+ }
321
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
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
+ * Graph-backend calendar tools (v3 registry-driven architecture, U2 — dual
7
+ * backend). Holds the calendar logic that previously lived inline in the
8
+ * `handleGraphToolCall` switch, so the registry handlers stay thin and branch
9
+ * on `ctx.backend`.
10
+ */
11
+ import type { GraphRepository } from '../graph/repository.js';
12
+ import type { GraphContentReaders } from '../graph/content-readers.js';
13
+ import { type ApprovalTokenManager } from '../approval/index.js';
14
+ import type { ToolResult } from '../registry/types.js';
15
+ import type { ListEventsParams, GetEventParams, SearchEventsParams, CreateEventGraphParams, UpdateEventParams, DeleteEventParams, RespondToEventParams, ListEventInstancesParams, PrepareDeleteEventParams, ConfirmDeleteEventParams, CreateCalendarGroupParams, ListRoomsParams } from './calendar.js';
16
+ /**
17
+ * Graph calendar tools. Each method mirrors the extracted inline graph case
18
+ * body and returns an MCP `ToolResult`.
19
+ */
20
+ export declare class GraphCalendarTools {
21
+ private readonly repository;
22
+ private readonly contentReaders;
23
+ private readonly tokenManager;
24
+ constructor(repository: GraphRepository, contentReaders: GraphContentReaders, tokenManager: ApprovalTokenManager);
25
+ listCalendars(): Promise<ToolResult>;
26
+ listEvents(params: ListEventsParams): Promise<ToolResult>;
27
+ getEvent(params: GetEventParams): Promise<ToolResult>;
28
+ searchEvents(params: SearchEventsParams): Promise<ToolResult>;
29
+ createEvent(params: CreateEventGraphParams): Promise<ToolResult>;
30
+ updateEvent(params: UpdateEventParams): Promise<ToolResult>;
31
+ respondToEvent(params: RespondToEventParams): Promise<ToolResult>;
32
+ deleteEvent(params: DeleteEventParams): Promise<ToolResult>;
33
+ listEventInstances(params: ListEventInstancesParams): Promise<ToolResult>;
34
+ prepareDeleteEvent(params: PrepareDeleteEventParams): Promise<ToolResult>;
35
+ confirmDeleteEvent(params: ConfirmDeleteEventParams): Promise<ToolResult>;
36
+ listCalendarGroups(): Promise<ToolResult>;
37
+ createCalendarGroup(params: CreateCalendarGroupParams): Promise<ToolResult>;
38
+ listRoomLists(): Promise<ToolResult>;
39
+ listRooms(params: ListRoomsParams): Promise<ToolResult>;
40
+ }
41
+ //# sourceMappingURL=calendar-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-graph.d.ts","sourceRoot":"","sources":["../../src/tools/calendar-graph.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAGvE,OAAO,EAAwB,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAEV,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EACzB,eAAe,EAChB,MAAM,eAAe,CAAC;AA4DvB;;;GAGG;AACH,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFZ,UAAU,EAAE,eAAe,EAC3B,cAAc,EAAE,mBAAmB,EACnC,YAAY,EAAE,oBAAoB;IAG/C,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAKpC,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAczD,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IAUrD,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC;IAsB7D,WAAW,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAoDhE,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAiC3D,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC;IAejE,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAO3D,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,UAAU,CAAC;IAKzE,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6BzE,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,UAAU,CAAC;IAqCzE,kBAAkB,IAAI,OAAO,CAAC,UAAU,CAAC;IAKzC,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,UAAU,CAAC;IAK3E,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAKpC,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;CAI9D"}