brightspace-mcp-server 1.6.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +43 -35
  2. package/build/api/client.d.ts +37 -10
  3. package/build/api/client.d.ts.map +1 -1
  4. package/build/api/client.js +158 -100
  5. package/build/api/client.js.map +1 -1
  6. package/build/api/errors.d.ts +4 -0
  7. package/build/api/errors.d.ts.map +1 -1
  8. package/build/api/errors.js +7 -0
  9. package/build/api/errors.js.map +1 -1
  10. package/build/auth/auth-cooldown.d.ts +24 -0
  11. package/build/auth/auth-cooldown.d.ts.map +1 -0
  12. package/build/auth/auth-cooldown.js +60 -0
  13. package/build/auth/auth-cooldown.js.map +1 -0
  14. package/build/auth/auth-lock.d.ts +7 -0
  15. package/build/auth/auth-lock.d.ts.map +1 -0
  16. package/build/auth/auth-lock.js +162 -0
  17. package/build/auth/auth-lock.js.map +1 -0
  18. package/build/auth/auth-runner.d.ts +30 -9
  19. package/build/auth/auth-runner.d.ts.map +1 -1
  20. package/build/auth/auth-runner.js +171 -56
  21. package/build/auth/auth-runner.js.map +1 -1
  22. package/build/auth/browser-auth.d.ts +19 -87
  23. package/build/auth/browser-auth.d.ts.map +1 -1
  24. package/build/auth/browser-auth.js +266 -614
  25. package/build/auth/browser-auth.js.map +1 -1
  26. package/build/auth/browser-state-store.d.ts +19 -0
  27. package/build/auth/browser-state-store.d.ts.map +1 -0
  28. package/build/auth/browser-state-store.js +101 -0
  29. package/build/auth/browser-state-store.js.map +1 -0
  30. package/build/auth/credential-store.d.ts +29 -0
  31. package/build/auth/credential-store.d.ts.map +1 -0
  32. package/build/auth/credential-store.js +233 -0
  33. package/build/auth/credential-store.js.map +1 -0
  34. package/build/auth/encrypted-store.d.ts +25 -0
  35. package/build/auth/encrypted-store.d.ts.map +1 -0
  36. package/build/auth/encrypted-store.js +61 -0
  37. package/build/auth/encrypted-store.js.map +1 -0
  38. package/build/auth/legacy-profile.d.ts +3 -0
  39. package/build/auth/legacy-profile.d.ts.map +1 -0
  40. package/build/auth/legacy-profile.js +41 -0
  41. package/build/auth/legacy-profile.js.map +1 -0
  42. package/build/auth/legacy-state.d.ts +14 -0
  43. package/build/auth/legacy-state.d.ts.map +1 -0
  44. package/build/auth/legacy-state.js +107 -0
  45. package/build/auth/legacy-state.js.map +1 -0
  46. package/build/auth/purdue-sso.d.ts +25 -36
  47. package/build/auth/purdue-sso.d.ts.map +1 -1
  48. package/build/auth/purdue-sso.js +210 -191
  49. package/build/auth/purdue-sso.js.map +1 -1
  50. package/build/auth/session-store.d.ts +16 -38
  51. package/build/auth/session-store.d.ts.map +1 -1
  52. package/build/auth/session-store.js +157 -152
  53. package/build/auth/session-store.js.map +1 -1
  54. package/build/auth/sso-flow.d.ts +16 -4
  55. package/build/auth/sso-flow.d.ts.map +1 -1
  56. package/build/auth/sso-flow.js +24 -2
  57. package/build/auth/sso-flow.js.map +1 -1
  58. package/build/auth/suny-sso.d.ts +6 -2
  59. package/build/auth/suny-sso.d.ts.map +1 -1
  60. package/build/auth/suny-sso.js +17 -24
  61. package/build/auth/suny-sso.js.map +1 -1
  62. package/build/auth/token-manager.d.ts +10 -3
  63. package/build/auth/token-manager.d.ts.map +1 -1
  64. package/build/auth/token-manager.js +62 -26
  65. package/build/auth/token-manager.js.map +1 -1
  66. package/build/auth/token-mint.d.ts +2 -2
  67. package/build/auth/token-mint.d.ts.map +1 -1
  68. package/build/auth/token-mint.js +31 -9
  69. package/build/auth/token-mint.js.map +1 -1
  70. package/build/auth-cli.d.ts +1 -7
  71. package/build/auth-cli.d.ts.map +1 -1
  72. package/build/auth-cli.js +71 -70
  73. package/build/auth-cli.js.map +1 -1
  74. package/build/index.js +20 -64
  75. package/build/index.js.map +1 -1
  76. package/build/setup.js +44 -19
  77. package/build/setup.js.map +1 -1
  78. package/build/tools/tool-helpers.d.ts +7 -1
  79. package/build/tools/tool-helpers.d.ts.map +1 -1
  80. package/build/tools/tool-helpers.js +96 -11
  81. package/build/tools/tool-helpers.js.map +1 -1
  82. package/build/types/index.d.ts +6 -0
  83. package/build/types/index.d.ts.map +1 -1
  84. package/build/utils/browser-install.d.ts +23 -0
  85. package/build/utils/browser-install.d.ts.map +1 -0
  86. package/build/utils/browser-install.js +33 -0
  87. package/build/utils/browser-install.js.map +1 -0
  88. package/build/utils/commands.d.ts +26 -0
  89. package/build/utils/commands.d.ts.map +1 -0
  90. package/build/utils/commands.js +26 -0
  91. package/build/utils/commands.js.map +1 -0
  92. package/build/utils/config-store.d.ts +1 -0
  93. package/build/utils/config-store.d.ts.map +1 -1
  94. package/build/utils/config-store.js +3 -0
  95. package/build/utils/config-store.js.map +1 -1
  96. package/build/utils/config.d.ts +2 -1
  97. package/build/utils/config.d.ts.map +1 -1
  98. package/build/utils/config.js +32 -10
  99. package/build/utils/config.js.map +1 -1
  100. package/build/utils/download-errors.d.ts +45 -0
  101. package/build/utils/download-errors.d.ts.map +1 -0
  102. package/build/utils/download-errors.js +45 -0
  103. package/build/utils/download-errors.js.map +1 -0
  104. package/build/utils/download-helpers.d.ts.map +1 -1
  105. package/build/utils/download-helpers.js +2 -1
  106. package/build/utils/download-helpers.js.map +1 -1
  107. package/build/utils/file-validator.d.ts +1 -1
  108. package/build/utils/file-validator.d.ts.map +1 -1
  109. package/build/utils/file-validator.js +47 -7
  110. package/build/utils/file-validator.js.map +1 -1
  111. package/build/utils/install-sites.d.ts +61 -0
  112. package/build/utils/install-sites.d.ts.map +1 -0
  113. package/build/utils/install-sites.js +207 -0
  114. package/build/utils/install-sites.js.map +1 -0
  115. package/build/utils/secure-config.d.ts +6 -0
  116. package/build/utils/secure-config.d.ts.map +1 -0
  117. package/build/utils/secure-config.js +57 -0
  118. package/build/utils/secure-config.js.map +1 -0
  119. package/build/utils/self-update.d.ts +61 -0
  120. package/build/utils/self-update.d.ts.map +1 -0
  121. package/build/utils/self-update.js +92 -0
  122. package/build/utils/self-update.js.map +1 -0
  123. package/build/utils/update-checker.d.ts +85 -7
  124. package/build/utils/update-checker.d.ts.map +1 -1
  125. package/build/utils/update-checker.js +141 -36
  126. package/build/utils/update-checker.js.map +1 -1
  127. package/package.json +4 -2
package/README.md CHANGED
@@ -6,7 +6,7 @@ Talk to your Brightspace courses with AI. Ask about grades, due dates, quizzes,
6
6
 
7
7
  This is an [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that connects your AI to D2L Brightspace so it can pull your grades, assignments, syllabus, and course content on demand.
8
8
 
9
- Works with any school that uses D2L Brightspace, including Purdue, SUNY, USC, and hundreds more.
9
+ Connects to D2L Brightspace. Automatic login supports Purdue's Microsoft Entra flow and SUNY campus selection. Other schools need a compatible automated sign-in flow; unsupported login pages return an actionable error.
10
10
 
11
11
  <p align="center">
12
12
  <img src="https://raw.githubusercontent.com/RohanMuppa/brightspace-mcp-server/main/docs/how-it-works.svg" alt="Architecture diagram" width="100%">
@@ -19,7 +19,7 @@ Works with any school that uses D2L Brightspace, including Purdue, SUNY, USC, an
19
19
 
20
20
  ## Install
21
21
 
22
- **You need:** [Node.js 18+](https://nodejs.org/) (download the current LTS, 20 or newer)
22
+ **You need:** [Node.js 20+](https://nodejs.org/) and an available native credential store: macOS Keychain, Windows Credential Manager, or Linux Secret Service. Linux requires `secret-tool` and an unlocked desktop keyring. Install `libsecret-tools` on Debian/Ubuntu, or the package providing `secret-tool` on your distribution. A container or SSH session without Secret Service cannot persist authentication in v2.
23
23
 
24
24
  **Option 1: Let your AI do it**
25
25
 
@@ -34,23 +34,23 @@ https://github.com/RohanMuppa/brightspace-mcp-server/blob/main/LLMs.md
34
34
  **Option 2: Run it yourself**
35
35
 
36
36
  ```bash
37
- npx brightspace-mcp-server setup
37
+ npx -y brightspace-mcp-server@latest setup
38
38
  ```
39
39
 
40
40
  Purdue students can add `--purdue` to skip entering the school URL:
41
41
 
42
42
  ```bash
43
- npx brightspace-mcp-server setup --purdue
43
+ npx -y brightspace-mcp-server@latest setup --purdue
44
44
  ```
45
45
 
46
46
  SUNY campuses share one Brightspace site, so `--suny` also asks which campus
47
47
  you're at and skips SUNY's campus picker when you sign in:
48
48
 
49
49
  ```bash
50
- npx brightspace-mcp-server setup --suny
50
+ npx -y brightspace-mcp-server@latest setup --suny
51
51
  ```
52
52
 
53
- The wizard walks you through login and MFA, auto configures Claude Desktop and Cursor, and prints the config to paste into ChatGPT Desktop if it is installed. Restart your AI client when it finishes.
53
+ The wizard saves your password in the native credential store and asks how you complete MFA. Authentication can wait for approval or number matching, prompt in the terminal for a code from Google Authenticator or another app, or open a visible browser for other interactive methods. The wizard can configure Claude Desktop and Cursor. Restart your AI client when it finishes.
54
54
 
55
55
  Any other D2L school: run `setup` without a flag and paste your Brightspace URL (for example `https://yourschool.brightspace.com`).
56
56
 
@@ -65,19 +65,25 @@ npx -y brightspace-mcp-server@latest
65
65
 
66
66
  On **Windows**, npx must be wrapped: `cmd /c npx -y brightspace-mcp-server@latest`
67
67
 
68
- You still need to run `npx brightspace-mcp-server setup` first to save your credentials.
68
+ You still need to run `npx -y brightspace-mcp-server@latest setup` first to save your credentials.
69
69
 
70
70
  </details>
71
71
 
72
72
  ## Session Expired?
73
73
 
74
- You should rarely see this. Access tokens are re-minted from your saved session cookie in the background, with no browser, in about 200 ms. A browser only opens when the Brightspace session itself has ended. How long that takes is set by your school, not by this tool, and it has not been measured over a long enough stretch to quote a number here. If the automatic re-login fails, run:
74
+ There is nothing to log into first. Ask for your grades and the sign-in happens as part of that request, so the assistant never has to check whether you are authenticated before it can answer. Starting your AI client touches Brightspace not at all: a restart on its own will never set off an MFA prompt.
75
+
76
+ Returning the next day normally requires no action. The server renews short-lived API tokens over HTTPS using the saved Brightspace session. If that session ends, a browser restores your saved Microsoft session and tries silent SSO. Approval and code-based modes stay headless; when an automatic run needs a code, run the auth command below to enter it securely in the terminal.
77
+
78
+ Your school's policy controls when MFA is required. There is no local 24-hour cutoff, and the server no longer discards browser state after one hour. A network outage preserves the saved session and returns a temporary error.
79
+
80
+ If you miss an MFA request, automatic browser authentication pauses for five minutes before trying again. Existing tokens and HTTP token renewal still work. Browser-based SSO also pauses because Microsoft can send another phone prompt during a redirect, even without a password submission. Run this command in a terminal to retry immediately, see a number match, or enter an authenticator code:
75
81
 
76
82
  ```bash
77
- npx brightspace-mcp-server auth
83
+ npx -y brightspace-mcp-server@latest auth
78
84
  ```
79
85
 
80
- **MFA at Purdue** is Microsoft Authenticator number matching: a two digit number appears in the browser and is also printed in the terminal. Enter it on your phone. Other schools may use Duo or their own app.
86
+ **MFA at Purdue** commonly uses Microsoft Authenticator number matching: enter the terminal-displayed number on your phone. Google Authenticator and other one-time-code apps work too, with no setting to change: run the auth command above in a terminal and it prompts for the code when your provider asks for one. Pick the visible-browser option during setup only if your identity provider needs interaction the server cannot drive. The MCP also sends authentication progress as logging notifications to clients that display them. Some desktop clients hide server logs, so use the terminal command above for interactive MFA.
81
87
 
82
88
  ## What You Can Ask About
83
89
 
@@ -96,8 +102,9 @@ npx brightspace-mcp-server auth
96
102
 
97
103
  ## Security
98
104
 
99
- - Your username and password stay on your machine in `~/.brightspace-mcp/config.json`, readable only by your user (mode 0600). They are typed into your school's real login page and nowhere else.
100
- - Session tokens and cookies live in `~/.d2l-session/`, encrypted with AES-256-GCM.
105
+ - Your school URL and username live in `~/.brightspace-mcp/config.json`. Your password lives in the native credential store. macOS and Windows use `@napi-rs/keyring`; Linux uses `secret-tool` directly to require Secret Service without a temporary kernel-key fallback. Linux secrets travel through stdin, never command-line arguments.
106
+ - Each account directory stores `session.json` for access tokens and `storage-state.encrypted.json` for cookies and browser storage. Both use AES-256-GCM with a random key held in the native credential store. The application never writes new plaintext password or browser-state snapshots. `D2L_SESSION_DIR` changes the local root of these account directories.
107
+ - On Unix, session files are mode 0600 and their directory is mode 0700. Security also depends on your operating-system account: software running as you may be able to access the same credential store. Runtime memory and recoverable v1 files in Trash are outside the encrypted-file guarantee.
101
108
  - All traffic to Brightspace is HTTPS.
102
109
  - On startup the server asks the npm registry whether a newer version exists. When running through `npx`, it clears this package's own stale npx cache directories so the next start downloads the new version. It never installs anything itself. Set `D2L_NO_UPDATE_CHECK=1` to turn the check off.
103
110
  - Read only: this server never submits, posts, or changes anything in Brightspace.
@@ -124,38 +131,39 @@ Licensed under the MIT License.
124
131
 
125
132
  ## Updates
126
133
 
127
- Automatic. Every time your AI client starts a session, it runs `npx brightspace-mcp-server@latest` which pulls the newest version from npm. No action needed.
134
+ Automatic, in both places it matters.
135
+
136
+ **The MCP server** is registered as `npx -y brightspace-mcp-server@latest`, so your AI client pulls the newest version every time it starts a session.
128
137
 
129
- If you ever suspect you're on an old version (the auth banner prints the version), clear the npx cache and restart your client:
138
+ **The auth CLI** updates itself too. If you installed globally with `npm install -g`, that copy stays at whatever version you installed it at — npm never revisits it. So when the CLI notices it is behind, it re-runs itself through `npx -y brightspace-mcp-server@latest auth` and you get the current code. You are not prompted and there is nothing to confirm.
139
+
140
+ One caveat worth knowing: a re-exec runs the newest code, it does not overwrite the old copy on disk. `npm ls -g` will still report the version you installed. To actually replace it:
130
141
 
131
142
  ```bash
143
+ npm install -g brightspace-mcp-server@latest
132
144
  npx clear-npx-cache
133
145
  ```
134
146
 
135
- ## What's new in 1.6.1
136
-
137
- - Your saved login now survives a network change. The session file was encrypted with a key derived from the machine hostname, which on campus wifi is a DHCP name that changes with the lease. When it changed, the saved session became unreadable and you were sent back through a full MFA login. Upgrading costs one final login, then it stops.
138
-
139
- ## What's new in 1.6.0
140
-
141
- - **Read the files attached to an assignment.** The spec PDF, the starter workbook, the rubric. Ask what an assignment requires and the answer comes from the actual document, not just its one-line description. Handles PDF, Word, Excel, and PowerPoint.
142
- - The roster no longer hides people: a class larger than the limit now reports the true total and says it was truncated, and the limit can be raised.
143
- - Fixed a case where a class list or course list could stop short of the last page.
147
+ Then restart your AI client. The server and the CLI both check npm on startup, and the server re-checks every few hours, so you get told when either one falls behind — including when they disagree with each other.
144
148
 
145
- ## What's new in 1.5.0
149
+ Set `D2L_NO_UPDATE_CHECK=1` to switch all of this off.
146
150
 
147
- - Token refresh no longer opens a browser: the access token is re-minted from your session cookie in about 200 ms.
148
- - Silent re-login when your Microsoft session is still alive, and a fast fallback to the credential login when it is not.
149
- - The Microsoft Authenticator number match is printed in the terminal, so headless logins can be approved.
150
- - `get_upcoming_due_dates` reads due dates from assignments and quizzes directly. It no longer reports a quiz as due on the day it opens.
151
- - Every assignment, quiz, and due date carries a `url` that opens the item in Brightspace.
152
- - Gradebook columns with no matching assignment or quiz (a proctored midterm, for example) are surfaced as `gradeOnly` items.
153
- - Unpublished announcements are hidden, and announcements sort by the date they were scheduled to post.
154
- - A dead session is detected even when Brightspace answers with HTTP 200, so re-login triggers instead of a confusing network error.
155
- - SUNY preset (`--suny`) and a more robust Microsoft Entra login, contributed by the community.
151
+ ## What's new in 3.0.0
156
152
 
157
- ---
153
+ - Signing in is part of the first tool call. The separate `check_auth` tool is gone, and so is the step where the assistant had to ask about your login before it could answer anything. **This removes a tool, so any saved prompt that names `check_auth` needs updating.**
154
+ - Starting the server makes no network requests. API versions are discovered by the first request that needs them, and a tenant that is briefly unreachable no longer stops the server from starting.
155
+ - Concurrent tool calls on a cold session share one sign-in instead of racing, so you get one MFA prompt rather than several.
156
+ - Failed sign-ins now explain themselves in the tool's answer: a locked keychain, a paused MFA cooldown, or a network outage each say what to do.
157
+ - A missed MFA prompt pauses automatic sign-in for five minutes instead of four hours.
158
+ - Authenticator-code MFA (Google Authenticator and similar) works, with the code entered in the terminal.
159
+ - Every command the server prints is pinned to `@latest`, so following its own advice can never run a stale copy.
158
160
 
159
- Proudly made for Boilermakers by [Rohan Muppa](https://github.com/rohanmuppa) 🚂
161
+ ## What's new in 2.0.0
160
162
 
163
+ - Headless saved-credential login and terminal MFA, with silent session reuse across restarts.
164
+ - Native secure credential storage and encrypted browser-state migration from v1.
165
+ - Removed the one-hour browser-state cutoff and destructive profile recovery.
166
+ - Process-level authentication coordination, failed-MFA cooldown, and transport errors that preserve your session.
167
+ - Publishing waits for the test matrix on macOS, Windows, and Linux.
168
+
161
169
  [Report a bug](https://github.com/rohanmuppa/brightspace-mcp-server/issues) · MIT · Copyright 2026 Rohan Muppa
@@ -8,11 +8,11 @@ import type { D2LApiClientOptions, ApiVersions } from "./types.js";
8
8
  * D2L API client with authentication, caching, rate limiting, and version discovery.
9
9
  *
10
10
  * Key features:
11
- * - Auto-discovers LP/LE versions from /d2l/api/versions/
11
+ * - Auto-discovers LP/LE versions from /d2l/api/versions/ on the first request
12
12
  * - Supports both Bearer tokens and cookie-based auth (auto-detected via "cookie:" prefix)
13
13
  * - Client-side rate limiting using token bucket algorithm
14
14
  * - In-memory response caching with per-data-type TTLs
15
- * - 401 retry logic: retry once with fresh token, then clear and throw
15
+ * - 401 recovery: refresh the token before requesting browser authentication
16
16
  * - HTTPS-only enforcement
17
17
  * - Browser-like User-Agent for requests
18
18
  * - Raw response passthrough (no transformation)
@@ -27,17 +27,38 @@ export declare class D2LApiClient {
27
27
  private readonly onAuthExpired?;
28
28
  private readonly retryConfig;
29
29
  private versions;
30
+ /** Single in-flight discovery, so concurrent first requests share one fetch. */
31
+ private versionsInFlight;
30
32
  constructor(options: D2LApiClientOptions);
31
33
  /**
32
- * Initialize the client by discovering API versions.
33
- * Must be called before making API requests.
34
+ * Discover the API versions, joining a discovery already in flight.
35
+ *
36
+ * Called from get() and getRaw() rather than at startup, so the server
37
+ * answers tools/list without touching the network and a user who never
38
+ * calls a tool never pays for a request. Nothing needs to call this
39
+ * directly.
40
+ */
41
+ ensureVersions(): Promise<ApiVersions>;
42
+ /**
43
+ * Discover API versions eagerly. Idempotent, and no longer required:
44
+ * requests discover on demand. Kept for callers that want the network
45
+ * failure up front rather than on the first tool call.
34
46
  */
35
47
  initialize(): Promise<void>;
36
48
  /**
37
49
  * Get discovered API versions.
38
- * @throws Error if initialize() hasn't been called yet
50
+ * @throws Error if no request has discovered them yet
39
51
  */
40
52
  get apiVersions(): ApiVersions;
53
+ /**
54
+ * Substitute the discovered versions into a path built by lp(), le(), or
55
+ * leGlobal(), discovering them first if no request has yet.
56
+ *
57
+ * A path that carries no placeholder is returned untouched and costs
58
+ * nothing: a bookmark page whose URL came back fully resolved from D2L
59
+ * does not trigger a discovery of its own.
60
+ */
61
+ private resolvePath;
41
62
  /**
42
63
  * Make a GET request to the D2L API.
43
64
  *
@@ -61,6 +82,8 @@ export declare class D2LApiClient {
61
82
  * @throws NetworkError on network/fetch failures
62
83
  */
63
84
  getRaw(path: string): Promise<Response>;
85
+ /** One HTTP refresh and at most one browser login per caller. */
86
+ private withAuthentication;
64
87
  /** One rate limiter token per attempt. */
65
88
  private throttled;
66
89
  /** Retry 429, 5xx, and network failures. A 401 is never retried here. */
@@ -71,11 +94,11 @@ export declare class D2LApiClient {
71
94
  */
72
95
  private tryAutoReauth;
73
96
  /**
74
- * Internal method to make HTTP request with 401 retry logic.
97
+ * Make one HTTP request. Authentication recovery is shared with raw downloads.
75
98
  */
76
99
  private makeRequest;
77
100
  /**
78
- * Internal method to make HTTP request for raw binary data with 401 retry logic.
101
+ * Make one HTTP request for raw binary data.
79
102
  */
80
103
  private makeRawRequest;
81
104
  /**
@@ -85,21 +108,25 @@ export declare class D2LApiClient {
85
108
  private buildAuthHeaders;
86
109
  /**
87
110
  * Build path for LP (Learning Platform) API endpoints.
111
+ *
112
+ * The version is left as a placeholder and substituted by get() or getRaw()
113
+ * once it has been discovered. See LP_VERSION above.
114
+ *
88
115
  * @param path - Path within LP API (e.g., "/users/whoami")
89
- * @returns Full versioned path (e.g., "/d2l/api/lp/1.56/users/whoami")
116
+ * @returns Versioned path template (e.g., "/d2l/api/lp/{lp}/users/whoami")
90
117
  */
91
118
  lp(path: string): string;
92
119
  /**
93
120
  * Build path for LE (Learning Environment) API endpoints with orgUnitId.
94
121
  * @param orgUnitId - Organizational unit ID (course ID)
95
122
  * @param path - Path within LE API (e.g., "/content/root/")
96
- * @returns Full versioned path (e.g., "/d2l/api/le/1.91/123456/content/root/")
123
+ * @returns Versioned path template (e.g., "/d2l/api/le/{le}/123456/content/root/")
97
124
  */
98
125
  le(orgUnitId: number, path: string): string;
99
126
  /**
100
127
  * Build path for global LE (Learning Environment) API endpoints without orgUnitId.
101
128
  * @param path - Path within LE API (e.g., "/enrollments/myenrollments/")
102
- * @returns Full versioned path (e.g., "/d2l/api/le/1.91/enrollments/myenrollments/")
129
+ * @returns Versioned path template (e.g., "/d2l/api/le/{le}/enrollments/myenrollments/")
103
130
  */
104
131
  leGlobal(path: string): string;
105
132
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAwB,MAAM,YAAY,CAAC;AAezF;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsC;IACnE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAA4B;gBAEhC,OAAO,EAAE,mBAAmB;IAuCxC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC;;;OAGG;IACH,IAAI,WAAW,IAAI,WAAW,CAO7B;IAED;;;;;;;;OAQG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IA8BlE;;;;;;;;;OASG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsB7C,0CAA0C;YAC5B,SAAS;IAKvB,yEAAyE;IACzE,OAAO,CAAC,QAAQ;IAQhB;;;OAGG;YACW,aAAa;IAgB3B;;OAEG;YACW,WAAW;IAyHzB;;OAEG;YACW,cAAc;IAuH5B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;;;OAIG;IACH,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKxB;;;;;OAKG;IACH,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAK3C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAK9B;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;CACF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAwB,MAAM,YAAY,CAAC;AAsDzF;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsC;IACnE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,gFAAgF;IAChF,OAAO,CAAC,gBAAgB,CAAqC;gBAEjD,OAAO,EAAE,mBAAmB;IAuCxC;;;;;;;OAOG;IACG,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IAsB5C;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;OAGG;IACH,IAAI,WAAW,IAAI,WAAW,CAO7B;IAED;;;;;;;OAOG;YACW,WAAW;IAMzB;;;;;;;;OAQG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAmBlE;;;;;;;;;OASG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK7C,iEAAiE;YACnD,kBAAkB;IA+BhC,0CAA0C;YAC5B,SAAS;IAKvB,yEAAyE;IACzE,OAAO,CAAC,QAAQ;IAQhB;;;OAGG;YACW,aAAa;IAgB3B;;OAEG;YACW,WAAW;IAuFzB;;OAEG;YACW,cAAc;IA2F5B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;;;;;;;OAQG;IACH,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIxB;;;;;OAKG;IACH,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAI3C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI9B;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;CACF"}