brightspace-mcp-server 3.2.0 → 3.3.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 (301) hide show
  1. package/build/api/cache.js +0 -1
  2. package/build/api/client.js +0 -1
  3. package/build/api/errors.js +0 -1
  4. package/build/api/index.js +0 -1
  5. package/build/api/paginate.js +0 -1
  6. package/build/api/rate-limiter.js +0 -1
  7. package/build/api/retry.js +0 -1
  8. package/build/api/types.js +0 -1
  9. package/build/api/version-discovery.js +0 -1
  10. package/build/auth/auth-cooldown.js +0 -1
  11. package/build/auth/auth-lock.js +0 -1
  12. package/build/auth/auth-runner.js +0 -1
  13. package/build/auth/browser-auth.js +0 -1
  14. package/build/auth/browser-state-store.js +0 -1
  15. package/build/auth/credential-store.js +0 -1
  16. package/build/auth/duo-mfa.js +0 -1
  17. package/build/auth/encrypted-store.js +0 -1
  18. package/build/auth/index.js +0 -1
  19. package/build/auth/legacy-profile.js +0 -1
  20. package/build/auth/legacy-state.js +0 -1
  21. package/build/auth/purdue-sso.js +0 -1
  22. package/build/auth/session-store.js +0 -1
  23. package/build/auth/sso-flow.js +0 -1
  24. package/build/auth/suny-sso.js +0 -1
  25. package/build/auth/token-manager.js +0 -1
  26. package/build/auth/token-mint.js +0 -1
  27. package/build/auth/western-sso.js +0 -1
  28. package/build/auth-cli.js +0 -1
  29. package/build/index.js +0 -1
  30. package/build/setup.js +0 -1
  31. package/build/tools/download-file.js +0 -1
  32. package/build/tools/get-announcements.js +0 -3
  33. package/build/tools/get-assignment-files.js +0 -1
  34. package/build/tools/get-assignments.js +5 -6
  35. package/build/tools/get-classlist-emails.js +0 -1
  36. package/build/tools/get-course-content.js +8 -9
  37. package/build/tools/get-discussions.js +0 -1
  38. package/build/tools/get-my-courses.js +0 -1
  39. package/build/tools/get-my-grades.js +0 -1
  40. package/build/tools/get-roster.js +0 -1
  41. package/build/tools/get-syllabus.js +1 -2
  42. package/build/tools/get-upcoming-due-dates.js +0 -1
  43. package/build/tools/get-video-transcript.js +0 -1
  44. package/build/tools/index.js +0 -1
  45. package/build/tools/schemas.js +0 -1
  46. package/build/tools/tool-helpers.js +1 -2
  47. package/build/types/index.js +0 -1
  48. package/build/update.js +0 -1
  49. package/build/utils/atomic-write.js +0 -1
  50. package/build/utils/browser-install.js +0 -1
  51. package/build/utils/commands.js +0 -1
  52. package/build/utils/config-store.js +0 -1
  53. package/build/utils/config.js +0 -1
  54. package/build/utils/course-filter.js +0 -1
  55. package/build/utils/deep-links.js +0 -1
  56. package/build/utils/download-errors.js +0 -1
  57. package/build/utils/download-helpers.js +0 -1
  58. package/build/utils/errors.js +0 -1
  59. package/build/utils/file-validator.js +10 -2
  60. package/build/utils/html-converter.js +16 -11
  61. package/build/utils/install-sites.js +0 -1
  62. package/build/utils/logger.js +0 -1
  63. package/build/utils/mcp-client-cli.js +0 -1
  64. package/build/utils/modified-since.js +0 -1
  65. package/build/utils/pdf-extractor.js +0 -1
  66. package/build/utils/secure-config.js +0 -1
  67. package/build/utils/self-update.js +0 -1
  68. package/build/utils/transcript/captions.js +0 -1
  69. package/build/utils/transcript/errors.js +0 -1
  70. package/build/utils/transcript/kaltura.js +0 -1
  71. package/build/utils/transcript/platform.js +0 -1
  72. package/build/utils/transcript/types.js +0 -1
  73. package/build/utils/transcript/youtube.js +0 -1
  74. package/build/utils/update-checker.js +0 -1
  75. package/build/utils/zip-extract.js +0 -1
  76. package/package.json +1 -2
  77. package/build/api/cache.d.ts +0 -15
  78. package/build/api/cache.d.ts.map +0 -1
  79. package/build/api/cache.js.map +0 -1
  80. package/build/api/client.d.ts +0 -141
  81. package/build/api/client.d.ts.map +0 -1
  82. package/build/api/client.js.map +0 -1
  83. package/build/api/errors.d.ts +0 -27
  84. package/build/api/errors.d.ts.map +0 -1
  85. package/build/api/errors.js.map +0 -1
  86. package/build/api/index.d.ts +0 -13
  87. package/build/api/index.d.ts.map +0 -1
  88. package/build/api/index.js.map +0 -1
  89. package/build/api/paginate.d.ts +0 -23
  90. package/build/api/paginate.d.ts.map +0 -1
  91. package/build/api/paginate.js.map +0 -1
  92. package/build/api/rate-limiter.d.ts +0 -17
  93. package/build/api/rate-limiter.d.ts.map +0 -1
  94. package/build/api/rate-limiter.js.map +0 -1
  95. package/build/api/retry.d.ts +0 -42
  96. package/build/api/retry.d.ts.map +0 -1
  97. package/build/api/retry.js.map +0 -1
  98. package/build/api/types.d.ts +0 -39
  99. package/build/api/types.d.ts.map +0 -1
  100. package/build/api/types.js.map +0 -1
  101. package/build/api/version-discovery.d.ts +0 -16
  102. package/build/api/version-discovery.d.ts.map +0 -1
  103. package/build/api/version-discovery.js.map +0 -1
  104. package/build/auth/auth-cooldown.d.ts +0 -24
  105. package/build/auth/auth-cooldown.d.ts.map +0 -1
  106. package/build/auth/auth-cooldown.js.map +0 -1
  107. package/build/auth/auth-lock.d.ts +0 -7
  108. package/build/auth/auth-lock.d.ts.map +0 -1
  109. package/build/auth/auth-lock.js.map +0 -1
  110. package/build/auth/auth-runner.d.ts +0 -61
  111. package/build/auth/auth-runner.d.ts.map +0 -1
  112. package/build/auth/auth-runner.js.map +0 -1
  113. package/build/auth/browser-auth.d.ts +0 -94
  114. package/build/auth/browser-auth.d.ts.map +0 -1
  115. package/build/auth/browser-auth.js.map +0 -1
  116. package/build/auth/browser-state-store.d.ts +0 -19
  117. package/build/auth/browser-state-store.d.ts.map +0 -1
  118. package/build/auth/browser-state-store.js.map +0 -1
  119. package/build/auth/credential-store.d.ts +0 -29
  120. package/build/auth/credential-store.d.ts.map +0 -1
  121. package/build/auth/credential-store.js.map +0 -1
  122. package/build/auth/duo-mfa.d.ts +0 -23
  123. package/build/auth/duo-mfa.d.ts.map +0 -1
  124. package/build/auth/duo-mfa.js.map +0 -1
  125. package/build/auth/encrypted-store.d.ts +0 -25
  126. package/build/auth/encrypted-store.d.ts.map +0 -1
  127. package/build/auth/encrypted-store.js.map +0 -1
  128. package/build/auth/index.d.ts +0 -14
  129. package/build/auth/index.d.ts.map +0 -1
  130. package/build/auth/index.js.map +0 -1
  131. package/build/auth/legacy-profile.d.ts +0 -3
  132. package/build/auth/legacy-profile.d.ts.map +0 -1
  133. package/build/auth/legacy-profile.js.map +0 -1
  134. package/build/auth/legacy-state.d.ts +0 -14
  135. package/build/auth/legacy-state.d.ts.map +0 -1
  136. package/build/auth/legacy-state.js.map +0 -1
  137. package/build/auth/purdue-sso.d.ts +0 -57
  138. package/build/auth/purdue-sso.d.ts.map +0 -1
  139. package/build/auth/purdue-sso.js.map +0 -1
  140. package/build/auth/session-store.d.ts +0 -28
  141. package/build/auth/session-store.d.ts.map +0 -1
  142. package/build/auth/session-store.js.map +0 -1
  143. package/build/auth/sso-flow.d.ts +0 -42
  144. package/build/auth/sso-flow.d.ts.map +0 -1
  145. package/build/auth/sso-flow.js.map +0 -1
  146. package/build/auth/suny-sso.d.ts +0 -53
  147. package/build/auth/suny-sso.d.ts.map +0 -1
  148. package/build/auth/suny-sso.js.map +0 -1
  149. package/build/auth/token-manager.d.ts +0 -74
  150. package/build/auth/token-manager.d.ts.map +0 -1
  151. package/build/auth/token-manager.js.map +0 -1
  152. package/build/auth/token-mint.d.ts +0 -32
  153. package/build/auth/token-mint.d.ts.map +0 -1
  154. package/build/auth/token-mint.js.map +0 -1
  155. package/build/auth/western-sso.d.ts +0 -15
  156. package/build/auth/western-sso.d.ts.map +0 -1
  157. package/build/auth/western-sso.js.map +0 -1
  158. package/build/auth-cli.d.ts +0 -4
  159. package/build/auth-cli.d.ts.map +0 -1
  160. package/build/auth-cli.js.map +0 -1
  161. package/build/index.d.ts +0 -10
  162. package/build/index.d.ts.map +0 -1
  163. package/build/index.js.map +0 -1
  164. package/build/setup.d.ts +0 -10
  165. package/build/setup.d.ts.map +0 -1
  166. package/build/setup.js.map +0 -1
  167. package/build/tools/download-file.d.ts +0 -16
  168. package/build/tools/download-file.d.ts.map +0 -1
  169. package/build/tools/download-file.js.map +0 -1
  170. package/build/tools/get-announcements.d.ts +0 -77
  171. package/build/tools/get-announcements.d.ts.map +0 -1
  172. package/build/tools/get-announcements.js.map +0 -1
  173. package/build/tools/get-assignment-files.d.ts +0 -12
  174. package/build/tools/get-assignment-files.d.ts.map +0 -1
  175. package/build/tools/get-assignment-files.js.map +0 -1
  176. package/build/tools/get-assignments.d.ts +0 -19
  177. package/build/tools/get-assignments.d.ts.map +0 -1
  178. package/build/tools/get-assignments.js.map +0 -1
  179. package/build/tools/get-classlist-emails.d.ts +0 -12
  180. package/build/tools/get-classlist-emails.d.ts.map +0 -1
  181. package/build/tools/get-classlist-emails.js.map +0 -1
  182. package/build/tools/get-course-content.d.ts +0 -12
  183. package/build/tools/get-course-content.d.ts.map +0 -1
  184. package/build/tools/get-course-content.js.map +0 -1
  185. package/build/tools/get-discussions.d.ts +0 -12
  186. package/build/tools/get-discussions.d.ts.map +0 -1
  187. package/build/tools/get-discussions.js.map +0 -1
  188. package/build/tools/get-my-courses.d.ts +0 -13
  189. package/build/tools/get-my-courses.d.ts.map +0 -1
  190. package/build/tools/get-my-courses.js.map +0 -1
  191. package/build/tools/get-my-grades.d.ts +0 -13
  192. package/build/tools/get-my-grades.d.ts.map +0 -1
  193. package/build/tools/get-my-grades.js.map +0 -1
  194. package/build/tools/get-roster.d.ts +0 -12
  195. package/build/tools/get-roster.d.ts.map +0 -1
  196. package/build/tools/get-roster.js.map +0 -1
  197. package/build/tools/get-syllabus.d.ts +0 -12
  198. package/build/tools/get-syllabus.d.ts.map +0 -1
  199. package/build/tools/get-syllabus.js.map +0 -1
  200. package/build/tools/get-upcoming-due-dates.d.ts +0 -13
  201. package/build/tools/get-upcoming-due-dates.d.ts.map +0 -1
  202. package/build/tools/get-upcoming-due-dates.js.map +0 -1
  203. package/build/tools/get-video-transcript.d.ts +0 -13
  204. package/build/tools/get-video-transcript.d.ts.map +0 -1
  205. package/build/tools/get-video-transcript.js.map +0 -1
  206. package/build/tools/index.d.ts +0 -21
  207. package/build/tools/index.d.ts.map +0 -1
  208. package/build/tools/index.js.map +0 -1
  209. package/build/tools/schemas.d.ts +0 -83
  210. package/build/tools/schemas.d.ts.map +0 -1
  211. package/build/tools/schemas.js.map +0 -1
  212. package/build/tools/tool-helpers.d.ts +0 -27
  213. package/build/tools/tool-helpers.d.ts.map +0 -1
  214. package/build/tools/tool-helpers.js.map +0 -1
  215. package/build/types/index.d.ts +0 -63
  216. package/build/types/index.d.ts.map +0 -1
  217. package/build/types/index.js.map +0 -1
  218. package/build/update.d.ts +0 -10
  219. package/build/update.d.ts.map +0 -1
  220. package/build/update.js.map +0 -1
  221. package/build/utils/atomic-write.d.ts +0 -18
  222. package/build/utils/atomic-write.d.ts.map +0 -1
  223. package/build/utils/atomic-write.js.map +0 -1
  224. package/build/utils/browser-install.d.ts +0 -23
  225. package/build/utils/browser-install.d.ts.map +0 -1
  226. package/build/utils/browser-install.js.map +0 -1
  227. package/build/utils/commands.d.ts +0 -26
  228. package/build/utils/commands.d.ts.map +0 -1
  229. package/build/utils/commands.js.map +0 -1
  230. package/build/utils/config-store.d.ts +0 -24
  231. package/build/utils/config-store.d.ts.map +0 -1
  232. package/build/utils/config-store.js.map +0 -1
  233. package/build/utils/config.d.ts +0 -10
  234. package/build/utils/config.d.ts.map +0 -1
  235. package/build/utils/config.js.map +0 -1
  236. package/build/utils/course-filter.d.ts +0 -31
  237. package/build/utils/course-filter.d.ts.map +0 -1
  238. package/build/utils/course-filter.js.map +0 -1
  239. package/build/utils/deep-links.d.ts +0 -17
  240. package/build/utils/deep-links.d.ts.map +0 -1
  241. package/build/utils/deep-links.js.map +0 -1
  242. package/build/utils/download-errors.d.ts +0 -45
  243. package/build/utils/download-errors.d.ts.map +0 -1
  244. package/build/utils/download-errors.js.map +0 -1
  245. package/build/utils/download-helpers.d.ts +0 -31
  246. package/build/utils/download-helpers.d.ts.map +0 -1
  247. package/build/utils/download-helpers.js.map +0 -1
  248. package/build/utils/errors.d.ts +0 -21
  249. package/build/utils/errors.d.ts.map +0 -1
  250. package/build/utils/errors.js.map +0 -1
  251. package/build/utils/file-validator.d.ts +0 -56
  252. package/build/utils/file-validator.d.ts.map +0 -1
  253. package/build/utils/file-validator.js.map +0 -1
  254. package/build/utils/html-converter.d.ts +0 -17
  255. package/build/utils/html-converter.d.ts.map +0 -1
  256. package/build/utils/html-converter.js.map +0 -1
  257. package/build/utils/install-sites.d.ts +0 -60
  258. package/build/utils/install-sites.d.ts.map +0 -1
  259. package/build/utils/install-sites.js.map +0 -1
  260. package/build/utils/logger.d.ts +0 -10
  261. package/build/utils/logger.d.ts.map +0 -1
  262. package/build/utils/logger.js.map +0 -1
  263. package/build/utils/mcp-client-cli.d.ts +0 -12
  264. package/build/utils/mcp-client-cli.d.ts.map +0 -1
  265. package/build/utils/mcp-client-cli.js.map +0 -1
  266. package/build/utils/modified-since.d.ts +0 -19
  267. package/build/utils/modified-since.d.ts.map +0 -1
  268. package/build/utils/modified-since.js.map +0 -1
  269. package/build/utils/pdf-extractor.d.ts +0 -14
  270. package/build/utils/pdf-extractor.d.ts.map +0 -1
  271. package/build/utils/pdf-extractor.js.map +0 -1
  272. package/build/utils/secure-config.d.ts +0 -6
  273. package/build/utils/secure-config.d.ts.map +0 -1
  274. package/build/utils/secure-config.js.map +0 -1
  275. package/build/utils/self-update.d.ts +0 -61
  276. package/build/utils/self-update.d.ts.map +0 -1
  277. package/build/utils/self-update.js.map +0 -1
  278. package/build/utils/transcript/captions.d.ts +0 -40
  279. package/build/utils/transcript/captions.d.ts.map +0 -1
  280. package/build/utils/transcript/captions.js.map +0 -1
  281. package/build/utils/transcript/errors.d.ts +0 -14
  282. package/build/utils/transcript/errors.d.ts.map +0 -1
  283. package/build/utils/transcript/errors.js.map +0 -1
  284. package/build/utils/transcript/kaltura.d.ts +0 -8
  285. package/build/utils/transcript/kaltura.d.ts.map +0 -1
  286. package/build/utils/transcript/kaltura.js.map +0 -1
  287. package/build/utils/transcript/platform.d.ts +0 -23
  288. package/build/utils/transcript/platform.d.ts.map +0 -1
  289. package/build/utils/transcript/platform.js.map +0 -1
  290. package/build/utils/transcript/types.d.ts +0 -22
  291. package/build/utils/transcript/types.d.ts.map +0 -1
  292. package/build/utils/transcript/types.js.map +0 -1
  293. package/build/utils/transcript/youtube.d.ts +0 -8
  294. package/build/utils/transcript/youtube.d.ts.map +0 -1
  295. package/build/utils/transcript/youtube.js.map +0 -1
  296. package/build/utils/update-checker.d.ts +0 -112
  297. package/build/utils/update-checker.d.ts.map +0 -1
  298. package/build/utils/update-checker.js.map +0 -1
  299. package/build/utils/zip-extract.d.ts +0 -15
  300. package/build/utils/zip-extract.d.ts.map +0 -1
  301. package/build/utils/zip-extract.js.map +0 -1
@@ -52,4 +52,3 @@ export class TTLCache {
52
52
  return this.cache.size;
53
53
  }
54
54
  }
55
- //# sourceMappingURL=cache.js.map
@@ -476,4 +476,3 @@ export class D2LApiClient {
476
476
  return this.cache.size;
477
477
  }
478
478
  }
479
- //# sourceMappingURL=client.js.map
@@ -51,4 +51,3 @@ export class TokenRefreshError extends NetworkError {
51
51
  this.name = "TokenRefreshError";
52
52
  }
53
53
  }
54
- //# sourceMappingURL=errors.js.map
@@ -14,4 +14,3 @@ export { TokenBucket } from "./rate-limiter.js";
14
14
  // Errors
15
15
  export { ApiError, RateLimitError, NetworkError } from "./errors.js";
16
16
  export { DEFAULT_CACHE_TTLS } from "./types.js";
17
- //# sourceMappingURL=index.js.map
@@ -91,4 +91,3 @@ function nextPath(firstPath, next) {
91
91
  }
92
92
  return withBookmark(firstPath, next);
93
93
  }
94
- //# sourceMappingURL=paginate.js.map
@@ -54,4 +54,3 @@ export class TokenBucket {
54
54
  return this.tokens;
55
55
  }
56
56
  }
57
- //# sourceMappingURL=rate-limiter.js.map
@@ -47,4 +47,3 @@ export function retryAfterMsFrom(error) {
47
47
  }
48
48
  return undefined;
49
49
  }
50
- //# sourceMappingURL=retry.js.map
@@ -13,4 +13,3 @@ export const DEFAULT_CACHE_TTLS = {
13
13
  roster: 3_600_000, // 1 hour
14
14
  profile: 3_600_000, // 1 hour
15
15
  };
16
- //# sourceMappingURL=types.js.map
@@ -53,4 +53,3 @@ export async function discoverVersions(baseUrl, timeoutMs = 15000) {
53
53
  throw new NetworkError(`Failed to discover API versions: ${message}`, error instanceof Error ? error : undefined);
54
54
  }
55
55
  }
56
- //# sourceMappingURL=version-discovery.js.map
@@ -57,4 +57,3 @@ export class AuthCooldown {
57
57
  await fs.rename(temporary, this.file);
58
58
  }
59
59
  }
60
- //# sourceMappingURL=auth-cooldown.js.map
@@ -159,4 +159,3 @@ async function acquireLease(lockPath, depth) {
159
159
  }
160
160
  throw new AuthenticationInProgressError();
161
161
  }
162
- //# sourceMappingURL=auth-lock.js.map
@@ -256,4 +256,3 @@ export class AuthRunner {
256
256
  });
257
257
  }
258
258
  }
259
- //# sourceMappingURL=auth-runner.js.map
@@ -694,4 +694,3 @@ export class BrowserAuth {
694
694
  }
695
695
  }
696
696
  }
697
- //# sourceMappingURL=browser-auth.js.map
@@ -98,4 +98,3 @@ export class BrowserStateStore {
98
98
  }
99
99
  }
100
100
  }
101
- //# sourceMappingURL=browser-state-store.js.map
@@ -240,4 +240,3 @@ export async function getSessionEncryptionKey(sessionDir, backend = nativeCreden
240
240
  await release?.();
241
241
  }
242
242
  }
243
- //# sourceMappingURL=credential-store.js.map
@@ -68,4 +68,3 @@ export class DuoMfaHandler {
68
68
  log("INFO", "Duo passcode submitted");
69
69
  }
70
70
  }
71
- //# sourceMappingURL=duo-mfa.js.map
@@ -58,4 +58,3 @@ export async function trashFile(file, options) {
58
58
  const { default: trash } = await import("trash");
59
59
  await trash(file);
60
60
  }
61
- //# sourceMappingURL=encrypted-store.js.map
@@ -10,4 +10,3 @@ export { createSSOFlow } from "./sso-flow.js";
10
10
  export { TokenManager } from "./token-manager.js";
11
11
  export { SessionStore } from "./session-store.js";
12
12
  export { AuthRunner } from "./auth-runner.js";
13
- //# sourceMappingURL=index.js.map
@@ -38,4 +38,3 @@ export async function retireLegacyProfile(sessionDir) {
38
38
  }
39
39
  }
40
40
  }
41
- //# sourceMappingURL=legacy-profile.js.map
@@ -104,4 +104,3 @@ export async function migrateLegacyState(sessionRoot) {
104
104
  await release();
105
105
  }
106
106
  }
107
- //# sourceMappingURL=legacy-state.js.map
@@ -296,4 +296,3 @@ export class PurdueSSOFlow {
296
296
  return number && /^\d{1,3}$/.test(number) ? number : null;
297
297
  }
298
298
  }
299
- //# sourceMappingURL=purdue-sso.js.map
@@ -195,4 +195,3 @@ export class SessionStore {
195
195
  }
196
196
  }
197
197
  }
198
- //# sourceMappingURL=session-store.js.map
@@ -51,4 +51,3 @@ export function createSSOFlow(config, requestMfaCode) {
51
51
  }
52
52
  return new PurdueSSOFlow(credentials);
53
53
  }
54
- //# sourceMappingURL=sso-flow.js.map
@@ -136,4 +136,3 @@ export class SunySSOFlow {
136
136
  options.find((option) => option.label.toLowerCase().startsWith(wanted)));
137
137
  }
138
138
  }
139
- //# sourceMappingURL=suny-sso.js.map
@@ -195,4 +195,3 @@ export class TokenManager {
195
195
  return token === null;
196
196
  }
197
197
  }
198
- //# sourceMappingURL=token-manager.js.map
@@ -90,4 +90,3 @@ export async function mintAccessToken({ baseUrl, cookieHeader, csrfToken, fetchI
90
90
  }
91
91
  return { ok: true, accessToken };
92
92
  }
93
- //# sourceMappingURL=token-mint.js.map
@@ -46,4 +46,3 @@ export class WesternSSOFlow {
46
46
  await button.click();
47
47
  }
48
48
  }
49
- //# sourceMappingURL=western-sso.js.map
package/build/auth-cli.js CHANGED
@@ -101,4 +101,3 @@ async function main() {
101
101
  }
102
102
  }
103
103
  await main();
104
- //# sourceMappingURL=auth-cli.js.map
package/build/index.js CHANGED
@@ -136,4 +136,3 @@ else {
136
136
  });
137
137
  main();
138
138
  }
139
- //# sourceMappingURL=index.js.map
package/build/setup.js CHANGED
@@ -471,4 +471,3 @@ main().catch((err) => {
471
471
  console.error("Setup failed:", err instanceof Error ? err.message : String(err));
472
472
  process.exit(1);
473
473
  });
474
- //# sourceMappingURL=setup.js.map
@@ -184,4 +184,3 @@ async function downloadSubmissionFile(apiClient, courseId, folderId, fileId, dow
184
184
  message: `File downloaded successfully to ${result.path}`,
185
185
  });
186
186
  }
187
- //# sourceMappingURL=download-file.js.map
@@ -60,8 +60,6 @@ export function mapNewsItem(item) {
60
60
  title: item.Title,
61
61
  body: item.Body?.Text ?? "",
62
62
  createdBy: item.CreatedBy?.DisplayName ?? "Unknown",
63
- createdDate: item.CreatedDate,
64
- startDate: item.StartDate,
65
63
  date: effectiveDate(item),
66
64
  isPinned: item.IsPinned,
67
65
  lastModified: item.LastModifiedDate ?? null,
@@ -166,4 +164,3 @@ export function registerGetAnnouncements(server, apiClient, config) {
166
164
  }
167
165
  });
168
166
  }
169
- //# sourceMappingURL=get-announcements.js.map
@@ -167,4 +167,3 @@ export function registerGetAssignmentFiles(server, apiClient, baseUrl) {
167
167
  }
168
168
  });
169
169
  }
170
- //# sourceMappingURL=get-assignment-files.js.map
@@ -147,8 +147,8 @@ export async function fetchCourseAssignments(apiClient, courseId, baseUrl) {
147
147
  name: folder.Name,
148
148
  url: baseUrl ? assignmentUrl(baseUrl, courseId, folder.Id) : null,
149
149
  instructions: folder.CustomInstructions?.Html
150
- ? convertHtmlToMarkdown(folder.CustomInstructions.Html)
151
- : { markdown: "", html: "" },
150
+ ? convertHtmlToMarkdown(folder.CustomInstructions.Html).markdown
151
+ : "",
152
152
  dueDate: folder.DueDate,
153
153
  points: folder.Assessment?.ScoreDenominator ?? null,
154
154
  isGroup: folder.GroupTypeId !== null,
@@ -178,7 +178,7 @@ export async function fetchCourseAssignments(apiClient, courseId, baseUrl) {
178
178
  ? {
179
179
  score: feedback.Score,
180
180
  feedback: feedback.Feedback?.Html
181
- ? convertHtmlToMarkdown(feedback.Feedback.Html)
181
+ ? convertHtmlToMarkdown(feedback.Feedback.Html).markdown
182
182
  : null,
183
183
  }
184
184
  : null,
@@ -268,8 +268,8 @@ export async function fetchCourseAssignments(apiClient, courseId, baseUrl) {
268
268
  name: quiz.Name,
269
269
  url: baseUrl ? quizUrl(baseUrl, courseId, quiz.QuizId) : null,
270
270
  instructions: descriptionHtml
271
- ? convertHtmlToMarkdown(descriptionHtml)
272
- : { markdown: "", html: "" },
271
+ ? convertHtmlToMarkdown(descriptionHtml).markdown
272
+ : "",
273
273
  dueDate: quiz.DueDate,
274
274
  startDate: quiz.StartDate,
275
275
  endDate: quiz.EndDate,
@@ -404,4 +404,3 @@ export function registerGetAssignments(server, apiClient, config) {
404
404
  }
405
405
  });
406
406
  }
407
- //# sourceMappingURL=get-assignments.js.map
@@ -43,4 +43,3 @@ export function registerGetClasslistEmails(server, apiClient) {
43
43
  }
44
44
  });
45
45
  }
46
- //# sourceMappingURL=get-classlist-emails.js.map
@@ -69,9 +69,9 @@ async function buildContentTree(apiClient, courseId, modules, progressMap, typeF
69
69
  id: item.Id,
70
70
  title: item.Title,
71
71
  description: item.Description?.Text ?? null,
72
- dueDate: item.ModuleDueDate ?? null,
73
- isHidden: item.IsHidden,
74
- isLocked: item.IsLocked,
72
+ ...(item.ModuleDueDate ? { dueDate: item.ModuleDueDate } : {}),
73
+ ...(item.IsHidden ? { isHidden: item.IsHidden } : {}),
74
+ ...(item.IsLocked ? { isLocked: item.IsLocked } : {}),
75
75
  lastModified: item.LastModifiedDate ?? null,
76
76
  children: processedChildren,
77
77
  });
@@ -90,12 +90,12 @@ async function buildContentTree(apiClient, courseId, modules, progressMap, typeF
90
90
  topicType,
91
91
  id: item.Id,
92
92
  title: item.Title,
93
- isHidden: item.IsHidden,
94
- isLocked: item.IsLocked,
95
- dueDate: item.DueDate ?? null,
93
+ ...(item.IsHidden ? { isHidden: item.IsHidden } : {}),
94
+ ...(item.IsLocked ? { isLocked: item.IsLocked } : {}),
95
+ ...(item.DueDate ? { dueDate: item.DueDate } : {}),
96
96
  lastModified: item.LastModifiedDate ?? null,
97
97
  isCompleted: topicProgress?.IsRead ?? false,
98
- completedDate: topicProgress?.DateCompleted ?? null,
98
+ ...(topicProgress?.DateCompleted ? { completedDate: topicProgress.DateCompleted } : {}),
99
99
  };
100
100
  // Add type-specific content
101
101
  if (item.TopicType === 1) {
@@ -109,7 +109,7 @@ async function buildContentTree(apiClient, courseId, modules, progressMap, typeF
109
109
  }
110
110
  // HTML content — include body converted to markdown
111
111
  if (item.Description?.Html) {
112
- topic.content = convertHtmlToMarkdown(item.Description.Html);
112
+ topic.content = convertHtmlToMarkdown(item.Description.Html).markdown;
113
113
  }
114
114
  tree.push(topic);
115
115
  }
@@ -237,4 +237,3 @@ export function registerGetCourseContent(server, apiClient) {
237
237
  }
238
238
  });
239
239
  }
240
- //# sourceMappingURL=get-course-content.js.map
@@ -209,4 +209,3 @@ function formatPosts(posts) {
209
209
  }))
210
210
  .sort((a, b) => new Date(a.datePosted).getTime() - new Date(b.datePosted).getTime());
211
211
  }
212
- //# sourceMappingURL=get-discussions.js.map
@@ -52,4 +52,3 @@ export function registerGetMyCourses(server, apiClient, config) {
52
52
  }
53
53
  });
54
54
  }
55
- //# sourceMappingURL=get-my-courses.js.map
@@ -98,4 +98,3 @@ export function registerGetMyGrades(server, apiClient, config) {
98
98
  }
99
99
  });
100
100
  }
101
- //# sourceMappingURL=get-my-grades.js.map
@@ -114,4 +114,3 @@ export function registerGetRoster(server, apiClient) {
114
114
  }
115
115
  });
116
116
  }
117
- //# sourceMappingURL=get-roster.js.map
@@ -61,7 +61,7 @@ export function registerGetSyllabus(server, apiClient) {
61
61
  }
62
62
  // Convert description HTML to markdown
63
63
  const description = overview?.Description?.Html
64
- ? convertHtmlToMarkdown(overview.Description.Html)
64
+ ? convertHtmlToMarkdown(overview.Description.Html).markdown
65
65
  : null;
66
66
  // Always attempt to fetch the attachment so we can extract PDF text
67
67
  let attachmentBuffer = null;
@@ -159,4 +159,3 @@ export function registerGetSyllabus(server, apiClient) {
159
159
  }
160
160
  });
161
161
  }
162
- //# sourceMappingURL=get-syllabus.js.map
@@ -194,4 +194,3 @@ export function registerGetUpcomingDueDates(server, apiClient, config) {
194
194
  }
195
195
  });
196
196
  }
197
- //# sourceMappingURL=get-upcoming-due-dates.js.map
@@ -165,4 +165,3 @@ export function registerGetVideoTranscript(server, apiClient, fetchImpl = fetch)
165
165
  }
166
166
  });
167
167
  }
168
- //# sourceMappingURL=get-video-transcript.js.map
@@ -20,4 +20,3 @@ export { registerGetVideoTranscript } from "./get-video-transcript.js";
20
20
  // Re-export shared helpers and schemas for convenience
21
21
  export { toolResponse, errorResponse, sanitizeError } from "./tool-helpers.js";
22
22
  export * from "./schemas.js";
23
- //# sourceMappingURL=index.js.map
@@ -113,4 +113,3 @@ export const GetRosterSchema = z.object({
113
113
  limit: z.coerce.number().int().positive().max(1000).default(100)
114
114
  .describe("Maximum users to return. Default 100. The response reports the true total and whether it was truncated."),
115
115
  });
116
- //# sourceMappingURL=schemas.js.map
@@ -24,7 +24,7 @@ export function toolResponse(data) {
24
24
  const content = [
25
25
  {
26
26
  type: "text",
27
- text: JSON.stringify(data, null, 2),
27
+ text: JSON.stringify(data),
28
28
  },
29
29
  ];
30
30
  const notice = getUpdateNotice();
@@ -166,4 +166,3 @@ export function sanitizeError(error) {
166
166
  // Default fallback
167
167
  return errorResponse("An unexpected error occurred. Please try again.");
168
168
  }
169
- //# sourceMappingURL=tool-helpers.js.map
@@ -4,4 +4,3 @@
4
4
  * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  export {};
7
- //# sourceMappingURL=index.js.map
package/build/update.js CHANGED
@@ -127,4 +127,3 @@ function main() {
127
127
  console.log("");
128
128
  }
129
129
  main();
130
- //# sourceMappingURL=update.js.map
@@ -81,4 +81,3 @@ export function writeFileAtomicSync(target, data, options = {}) {
81
81
  throw error;
82
82
  }
83
83
  }
84
- //# sourceMappingURL=atomic-write.js.map
@@ -30,4 +30,3 @@ export function isMissingBrowserError(error) {
30
30
  return false;
31
31
  return /Executable doesn't exist|playwright install|Failed to launch.*because executable doesn't exist/i.test(message);
32
32
  }
33
- //# sourceMappingURL=browser-install.js.map
@@ -23,4 +23,3 @@ export const SETUP_COMMAND = `npx -y ${PACKAGE_NAME}@latest setup`;
23
23
  export const GLOBAL_INSTALL_COMMAND = `npm install -g ${PACKAGE_NAME}@latest`;
24
24
  /** Drop cached npx copies so the next `@latest` genuinely refetches. */
25
25
  export const CLEAR_NPX_CACHE_COMMAND = "npx clear-npx-cache";
26
- //# sourceMappingURL=commands.js.map
@@ -29,4 +29,3 @@ export function saveConfigStore(config) {
29
29
  export function getConfigStorePath() {
30
30
  return CONFIG_FILE;
31
31
  }
32
- //# sourceMappingURL=config-store.js.map
@@ -85,4 +85,3 @@ function expandTilde(filePath) {
85
85
  }
86
86
  return filePath;
87
87
  }
88
- //# sourceMappingURL=config.js.map
@@ -41,4 +41,3 @@ export function applyCourseFilter(courses, config) {
41
41
  }
42
42
  return filtered;
43
43
  }
44
- //# sourceMappingURL=course-filter.js.map
@@ -32,4 +32,3 @@ export function gradebookUrl(baseUrl, courseId) {
32
32
  export function discussionUrl(baseUrl, courseId, topicId) {
33
33
  return `${trimBaseUrl(baseUrl)}/d2l/lms/discussions/threadlist.d2l?ou=${courseId}&tId=${topicId}`;
34
34
  }
35
- //# sourceMappingURL=deep-links.js.map
@@ -42,4 +42,3 @@ export class DownloadError extends Error {
42
42
  export function isSafeDetail(value) {
43
43
  return value.length <= 64 && /^[a-z0-9][a-z0-9.+-]*\/[a-z0-9][a-z0-9.+-]*$/.test(value);
44
44
  }
45
- //# sourceMappingURL=download-errors.js.map
@@ -91,4 +91,3 @@ export async function secureDownload(options) {
91
91
  mime,
92
92
  };
93
93
  }
94
- //# sourceMappingURL=download-helpers.js.map
@@ -33,4 +33,3 @@ export class SessionStoreError extends AuthError {
33
33
  this.name = "SessionStoreError";
34
34
  }
35
35
  }
36
- //# sourceMappingURL=errors.js.map
@@ -4,7 +4,6 @@
4
4
  * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import path from "node:path";
7
- import { fileTypeFromBuffer } from "file-type";
8
7
  import sanitizeFilename from "sanitize-filename";
9
8
  import { DownloadError } from "./download-errors.js";
10
9
  /**
@@ -20,6 +19,15 @@ import { DownloadError } from "./download-errors.js";
20
19
  * extension instead, which admits the formats the allowlist already intended
21
20
  * and still refuses everything else.
22
21
  */
22
+ // file-type v21 is ESM-only and costs ~50ms; defer the import to first use
23
+ // since validateFileType is already async.
24
+ let fileTypeFromBufferPromise;
25
+ function getFileTypeFromBuffer() {
26
+ if (!fileTypeFromBufferPromise) {
27
+ fileTypeFromBufferPromise = import("file-type").then((m) => m.fileTypeFromBuffer);
28
+ }
29
+ return fileTypeFromBufferPromise;
30
+ }
23
31
  const CFB_MIME = "application/x-cfb";
24
32
  const CFB_EXTENSION_MIMES = {
25
33
  ".doc": "application/msword",
@@ -113,6 +121,7 @@ export function validateDownloadPath(baseDir, filename) {
113
121
  */
114
122
  export async function validateFileType(buffer, allowedTypes = ALLOWED_MIME_TYPES, filename) {
115
123
  // Try magic byte detection first
124
+ const fileTypeFromBuffer = await getFileTypeFromBuffer();
116
125
  const detected = await fileTypeFromBuffer(buffer);
117
126
  if (detected) {
118
127
  if (detected.mime === CFB_MIME) {
@@ -181,4 +190,3 @@ export function validateBaseUrl(url, expectedBaseUrl) {
181
190
  throw new Error(`URL must start with ${expectedBaseUrl}, got: ${url.substring(0, 50)}...`);
182
191
  }
183
192
  }
184
- //# sourceMappingURL=file-validator.js.map
@@ -3,15 +3,21 @@
3
3
  * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
4
  * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
- import TurndownService from "turndown";
7
- /**
8
- * Singleton TurndownService instance configured for converting D2L HTML to markdown.
9
- * Uses ATX-style headings (###) and fenced code blocks (```).
10
- */
11
- const turndownService = new TurndownService({
12
- headingStyle: "atx",
13
- codeBlockStyle: "fenced",
14
- });
6
+ import { createRequire } from "node:module";
7
+ // turndown is CJS and costs ~50ms to import; defer it to first use via
8
+ // createRequire so callers keep a synchronous API instead of turning async.
9
+ const require = createRequire(import.meta.url);
10
+ let turndownService;
11
+ function getTurndownService() {
12
+ if (!turndownService) {
13
+ const TurndownService = require("turndown");
14
+ turndownService = new TurndownService({
15
+ headingStyle: "atx",
16
+ codeBlockStyle: "fenced",
17
+ });
18
+ }
19
+ return turndownService;
20
+ }
15
21
  /**
16
22
  * Convert D2L HTML content to clean markdown.
17
23
  * Returns both markdown (for LLM readability) and raw HTML (for fallback).
@@ -25,7 +31,7 @@ export function convertHtmlToMarkdown(html) {
25
31
  return { markdown: "", html: "" };
26
32
  }
27
33
  try {
28
- const markdown = turndownService.turndown(html);
34
+ const markdown = getTurndownService().turndown(html);
29
35
  return { markdown, html };
30
36
  }
31
37
  catch (error) {
@@ -33,4 +39,3 @@ export function convertHtmlToMarkdown(html) {
33
39
  return { markdown: html, html };
34
40
  }
35
41
  }
36
- //# sourceMappingURL=html-converter.js.map
@@ -194,4 +194,3 @@ export function formatSkewNotice(sites, runningVersion, home = homedir()) {
194
194
  `An out-of-date auth CLI fails during sign-in. Run \`${GLOBAL_INSTALL_COMMAND}\`, or use \`${AUTH_COMMAND}\`.`,
195
195
  ].join("\n");
196
196
  }
197
- //# sourceMappingURL=install-sites.js.map
@@ -83,4 +83,3 @@ export function enableStdoutGuard() {
83
83
  console.error("[WARN] console.log intercepted (would corrupt stdio):", ...args);
84
84
  };
85
85
  }
86
- //# sourceMappingURL=logger.js.map
@@ -39,4 +39,3 @@ export function configureCliMcpClient(client, runCommand = defaultRunCommand) {
39
39
  ? "configured"
40
40
  : "failed";
41
41
  }
42
- //# sourceMappingURL=mcp-client-cli.js.map
@@ -23,4 +23,3 @@ export function matchesModifiedSince(lastModified, cutoff) {
23
23
  return true;
24
24
  return time >= cutoff.getTime();
25
25
  }
26
- //# sourceMappingURL=modified-since.js.map
@@ -24,4 +24,3 @@ export async function extractPdfText(buffer) {
24
24
  return null;
25
25
  }
26
26
  }
27
- //# sourceMappingURL=pdf-extractor.js.map
@@ -54,4 +54,3 @@ export async function resolveStoredPassword(baseUrl, username, store) {
54
54
  }
55
55
  return (await getStoredPassword(baseUrl, username)) ?? undefined;
56
56
  }
57
- //# sourceMappingURL=secure-config.js.map
@@ -89,4 +89,3 @@ export async function reexecLatestIfStale(deps = {}) {
89
89
  child.on("exit", (code) => resolve(code ?? 1));
90
90
  });
91
91
  }
92
- //# sourceMappingURL=self-update.js.map
@@ -60,4 +60,3 @@ export function paginateText(text, offset, maxChars) {
60
60
  const truncated = offset + maxChars < totalChars;
61
61
  return { window, truncated, nextOffset: truncated ? offset + maxChars : null, totalChars };
62
62
  }
63
- //# sourceMappingURL=captions.js.map
@@ -17,4 +17,3 @@ export class TranscriptFetchError extends Error {
17
17
  this.name = "TranscriptFetchError";
18
18
  }
19
19
  }
20
- //# sourceMappingURL=errors.js.map
@@ -91,4 +91,3 @@ export async function getKalturaTranscript(partnerId, entryId, fetchImpl) {
91
91
  durationSeconds: media.durationSeconds,
92
92
  };
93
93
  }
94
- //# sourceMappingURL=kaltura.js.map
@@ -95,4 +95,3 @@ export function extractYouTubeVideoId(url) {
95
95
  }
96
96
  return null;
97
97
  }
98
- //# sourceMappingURL=platform.js.map
@@ -4,4 +4,3 @@
4
4
  * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  export {};
7
- //# sourceMappingURL=types.js.map
@@ -54,4 +54,3 @@ export async function getYouTubeTranscript(videoId, fetchImpl) {
54
54
  const title = await fetchTitle(videoId, fetchImpl);
55
55
  return { cues, format, language: lang, title, durationSeconds: null };
56
56
  }
57
- //# sourceMappingURL=youtube.js.map
@@ -229,4 +229,3 @@ export function getUpdateNotice(now = Date.now(), minIntervalMs = NOTICE_REPEAT_
229
229
  export function clearUpdateNotice() {
230
230
  state = null;
231
231
  }
232
- //# sourceMappingURL=update-checker.js.map