@noodleseed/one 0.96.2 → 0.97.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 (112) hide show
  1. package/README.md +2 -1
  2. package/dist/commands/author-loop.d.ts.map +1 -1
  3. package/dist/commands/author-loop.js +7 -1
  4. package/dist/commands/author-loop.js.map +1 -1
  5. package/dist/commands/catalog-data-local-authoring.d.ts.map +1 -1
  6. package/dist/commands/catalog-data-local-authoring.js +2 -2
  7. package/dist/commands/catalog-data-local-authoring.js.map +1 -1
  8. package/dist/deploy.d.ts +5 -0
  9. package/dist/deploy.d.ts.map +1 -1
  10. package/dist/deploy.js +1 -1
  11. package/dist/deploy.js.map +1 -1
  12. package/dist/dev.d.ts +13 -0
  13. package/dist/dev.d.ts.map +1 -1
  14. package/dist/dev.js +116 -7
  15. package/dist/dev.js.map +1 -1
  16. package/dist/devtools-auth-routes.d.ts +4 -0
  17. package/dist/devtools-auth-routes.d.ts.map +1 -0
  18. package/dist/devtools-auth-routes.js +205 -0
  19. package/dist/devtools-auth-routes.js.map +1 -0
  20. package/dist/devtools-auth-session-helpers.d.ts +6 -0
  21. package/dist/devtools-auth-session-helpers.d.ts.map +1 -0
  22. package/dist/devtools-auth-session-helpers.js +19 -0
  23. package/dist/devtools-auth-session-helpers.js.map +1 -0
  24. package/dist/devtools-auth-session.d.ts +35 -0
  25. package/dist/devtools-auth-session.d.ts.map +1 -0
  26. package/dist/devtools-auth-session.js +433 -0
  27. package/dist/devtools-auth-session.js.map +1 -0
  28. package/dist/devtools-auth-types.d.ts +51 -0
  29. package/dist/devtools-auth-types.d.ts.map +1 -0
  30. package/dist/devtools-auth-types.js +16 -0
  31. package/dist/devtools-auth-types.js.map +1 -0
  32. package/dist/devtools-auth-ui.d.ts +6 -0
  33. package/dist/devtools-auth-ui.d.ts.map +1 -0
  34. package/dist/devtools-auth-ui.js +127 -0
  35. package/dist/devtools-auth-ui.js.map +1 -0
  36. package/dist/devtools-delegated-credential.d.ts +10 -0
  37. package/dist/devtools-delegated-credential.d.ts.map +1 -0
  38. package/dist/devtools-delegated-credential.js +32 -0
  39. package/dist/devtools-delegated-credential.js.map +1 -0
  40. package/dist/devtools-firebase-auth.d.ts +55 -0
  41. package/dist/devtools-firebase-auth.d.ts.map +1 -0
  42. package/dist/devtools-firebase-auth.js +237 -0
  43. package/dist/devtools-firebase-auth.js.map +1 -0
  44. package/dist/devtools-harness.d.ts +5 -0
  45. package/dist/devtools-harness.d.ts.map +1 -1
  46. package/dist/devtools-harness.js +60 -21
  47. package/dist/devtools-harness.js.map +1 -1
  48. package/dist/devtools-microsoft-auth.d.ts +42 -0
  49. package/dist/devtools-microsoft-auth.d.ts.map +1 -0
  50. package/dist/devtools-microsoft-auth.js +362 -0
  51. package/dist/devtools-microsoft-auth.js.map +1 -0
  52. package/dist/devtools-microsoft-errors.d.ts +7 -0
  53. package/dist/devtools-microsoft-errors.d.ts.map +1 -0
  54. package/dist/devtools-microsoft-errors.js +60 -0
  55. package/dist/devtools-microsoft-errors.js.map +1 -0
  56. package/dist/devtools-preview.d.ts +15 -13
  57. package/dist/devtools-preview.d.ts.map +1 -1
  58. package/dist/devtools-preview.js +101 -179
  59. package/dist/devtools-preview.js.map +1 -1
  60. package/dist/devtools-rpc-forwarder.d.ts +37 -0
  61. package/dist/devtools-rpc-forwarder.d.ts.map +1 -0
  62. package/dist/devtools-rpc-forwarder.js +251 -0
  63. package/dist/devtools-rpc-forwarder.js.map +1 -0
  64. package/dist/devtools-tool-safety.d.ts +20 -0
  65. package/dist/devtools-tool-safety.d.ts.map +1 -0
  66. package/dist/devtools-tool-safety.js +43 -0
  67. package/dist/devtools-tool-safety.js.map +1 -0
  68. package/dist/preview-session.d.ts.map +1 -1
  69. package/dist/preview-session.js +5 -0
  70. package/dist/preview-session.js.map +1 -1
  71. package/dist/project-scaffold-templates.js +1 -1
  72. package/dist/project-scaffold-templates.js.map +1 -1
  73. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +1 -1
  74. package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
  75. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +1 -1
  76. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js.map +1 -1
  77. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  78. package/node_modules/@noodle-borg/auth/dist/index.d.ts +1 -0
  79. package/node_modules/@noodle-borg/auth/dist/index.d.ts.map +1 -1
  80. package/node_modules/@noodle-borg/auth/dist/index.js +1 -0
  81. package/node_modules/@noodle-borg/auth/dist/index.js.map +1 -1
  82. package/node_modules/@noodle-borg/auth/dist/mcp-oauth-client.d.ts +56 -0
  83. package/node_modules/@noodle-borg/auth/dist/mcp-oauth-client.d.ts.map +1 -0
  84. package/node_modules/@noodle-borg/auth/dist/mcp-oauth-client.js +367 -0
  85. package/node_modules/@noodle-borg/auth/dist/mcp-oauth-client.js.map +1 -0
  86. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.d.ts +13 -0
  87. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.d.ts.map +1 -0
  88. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.js +71 -0
  89. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.js.map +1 -0
  90. package/node_modules/@noodle-borg/service/dist/customer-verifier.d.ts +1 -1
  91. package/node_modules/@noodle-borg/service/dist/customer-verifier.d.ts.map +1 -1
  92. package/node_modules/@noodle-borg/service/dist/customer-verifier.js +43 -31
  93. package/node_modules/@noodle-borg/service/dist/customer-verifier.js.map +1 -1
  94. package/node_modules/@noodle-borg/service/dist/index.d.ts +3 -1
  95. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  96. package/node_modules/@noodle-borg/service/dist/index.js +1 -0
  97. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  98. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-credentials.d.ts +20 -0
  99. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-credentials.d.ts.map +1 -0
  100. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-credentials.js +107 -0
  101. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-credentials.js.map +1 -0
  102. package/node_modules/@noodle-borg/service/dist/oauth/microsoft.d.ts +5 -0
  103. package/node_modules/@noodle-borg/service/dist/oauth/microsoft.d.ts.map +1 -1
  104. package/node_modules/@noodle-borg/service/dist/oauth/microsoft.js +48 -28
  105. package/node_modules/@noodle-borg/service/dist/oauth/microsoft.js.map +1 -1
  106. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts +13 -0
  107. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts.map +1 -1
  108. package/node_modules/@noodle-borg/service/dist/serve.d.ts +3 -0
  109. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  110. package/node_modules/@noodle-borg/service/dist/serve.js +49 -18
  111. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  112. package/package.json +1 -1
@@ -0,0 +1,362 @@
1
+ import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';
2
+ import { canonicalScopes, } from '@noodle-borg/auth';
3
+ import { decodeJwt } from 'jose';
4
+ import { microsoftCallbackError, microsoftTokenError } from './devtools-microsoft-errors.js';
5
+ export { MicrosoftDevtoolsAuthError } from './devtools-microsoft-errors.js';
6
+ const MICROSOFT_CALLBACK_PATH = '/auth/callback/microsoft';
7
+ const MICROSOFT_REQUIRED_SCOPES = ['openid', 'profile', 'email', 'offline_access'];
8
+ const MAX_TOKEN_RESPONSE_BYTES = 256 * 1_024;
9
+ const TOKEN_REQUEST_TIMEOUT_MS = 10_000;
10
+ /**
11
+ * Confidential Microsoft authorization-code client for the loopback Devtools host. The Graph access
12
+ * token and client secret never cross into the browser; the ID token is retained as the local MCP bearer
13
+ * and is independently signature/issuer/audience verified by the loopback service before tool access.
14
+ */
15
+ export class MicrosoftDevtoolsAuthDriver {
16
+ #auth;
17
+ #resource;
18
+ #redirectUri;
19
+ #issuer;
20
+ #authorizationEndpoint;
21
+ #tokenEndpoint;
22
+ #fetch;
23
+ #now;
24
+ #stateFactory;
25
+ #codeVerifierFactory;
26
+ #nonceFactory;
27
+ #pendingNonces = new Map();
28
+ constructor(options) {
29
+ this.#auth = validateAuth(options.auth);
30
+ this.#resource = validateResource(options.resource);
31
+ this.#redirectUri = validateMicrosoftRedirect(options.redirectUri);
32
+ this.#issuer = microsoftIssuer(this.#auth.tenantId);
33
+ this.#authorizationEndpoint = validateEndpoint(this.#auth.authorizeUrl ?? microsoftAuthorizeUrl(this.#auth.tenantId), 'Microsoft authorization endpoint', this.#auth.allowInsecureLocalhost === true);
34
+ this.#tokenEndpoint = validateEndpoint(this.#auth.tokenUrl ?? microsoftTokenUrl(this.#auth.tenantId), 'Microsoft token endpoint', this.#auth.allowInsecureLocalhost === true);
35
+ this.#fetch = options.fetchFn ?? fetch;
36
+ this.#now = options.now ?? Date.now;
37
+ this.#stateFactory = options.stateFactory ?? (() => randomBytes(32).toString('base64url'));
38
+ this.#codeVerifierFactory =
39
+ options.codeVerifierFactory ?? (() => randomBytes(32).toString('base64url'));
40
+ this.#nonceFactory = options.nonceFactory ?? (() => randomBytes(32).toString('base64url'));
41
+ }
42
+ async discover() {
43
+ return {
44
+ resource: this.#resource,
45
+ issuer: this.#issuer,
46
+ authorizationEndpoint: this.#authorizationEndpoint,
47
+ tokenEndpoint: this.#tokenEndpoint,
48
+ // Microsoft clients are pre-registered in Entra; this sentinel is never fetched.
49
+ registrationEndpoint: 'urn:noodleseed:devtools:microsoft:pre-registered',
50
+ scopes: microsoftScopes(this.#auth.scopes),
51
+ authorizationResponseIssuerRequired: false,
52
+ };
53
+ }
54
+ async register(discovery, _scopes = discovery.scopes) {
55
+ this.#assertDiscovery(discovery);
56
+ // The shared OAuth shape models public DCR. This driver owns confidential client authentication
57
+ // internally, so no registration or secret is returned through this value.
58
+ return { clientId: this.#auth.clientId, tokenEndpointAuthMethod: 'none' };
59
+ }
60
+ beginAuthorization(discovery, registration, scopes = discovery.scopes) {
61
+ this.#assertDiscovery(discovery);
62
+ this.#assertRegistration(registration);
63
+ const state = this.#stateFactory();
64
+ const codeVerifier = this.#codeVerifierFactory();
65
+ const nonce = this.#nonceFactory();
66
+ assertEntropyValue(state, 'state');
67
+ assertEntropyValue(codeVerifier, 'PKCE verifier');
68
+ assertEntropyValue(nonce, 'nonce');
69
+ const selectedScopes = microsoftScopes(scopes);
70
+ const authorizationUrl = new URL(this.#authorizationEndpoint);
71
+ authorizationUrl.searchParams.set('client_id', this.#auth.clientId);
72
+ authorizationUrl.searchParams.set('response_type', 'code');
73
+ authorizationUrl.searchParams.set('response_mode', 'query');
74
+ authorizationUrl.searchParams.set('redirect_uri', this.#redirectUri);
75
+ authorizationUrl.searchParams.set('scope', selectedScopes.join(' '));
76
+ authorizationUrl.searchParams.set('state', state);
77
+ authorizationUrl.searchParams.set('nonce', nonce);
78
+ authorizationUrl.searchParams.set('code_challenge_method', 'S256');
79
+ authorizationUrl.searchParams.set('code_challenge', createHash('sha256').update(codeVerifier).digest('base64url'));
80
+ this.#pendingNonces.clear();
81
+ this.#pendingNonces.set(state, nonce);
82
+ return {
83
+ authorizationUrl: authorizationUrl.href,
84
+ state,
85
+ codeVerifier,
86
+ scopes: selectedScopes,
87
+ };
88
+ }
89
+ async exchangeCallback(discovery, registration, pending, callbackUrl) {
90
+ this.#assertDiscovery(discovery);
91
+ this.#assertRegistration(registration);
92
+ assertCallback(callbackUrl, this.#redirectUri);
93
+ const callback = new URL(callbackUrl);
94
+ if (!constantTimeStringEqual(callback.searchParams.get('state') ?? '', pending.state)) {
95
+ throw new Error('Microsoft callback state is invalid');
96
+ }
97
+ const expectedNonce = this.#pendingNonces.get(pending.state);
98
+ this.#pendingNonces.delete(pending.state);
99
+ if (expectedNonce === undefined)
100
+ throw new Error('Microsoft authorization request expired');
101
+ if (callback.searchParams.has('error')) {
102
+ throw microsoftCallbackError(callback.searchParams.get('error'));
103
+ }
104
+ const code = callback.searchParams.get('code');
105
+ if (!code)
106
+ throw new Error('Microsoft callback did not include an authorization code');
107
+ return this.#requestTokens(new URLSearchParams({
108
+ grant_type: 'authorization_code',
109
+ code,
110
+ code_verifier: pending.codeVerifier,
111
+ redirect_uri: this.#redirectUri,
112
+ scope: pending.scopes.join(' '),
113
+ }), pending.scopes, expectedNonce);
114
+ }
115
+ async refresh(discoveryOrCurrent, registration, currentMaybe) {
116
+ const current = currentMaybe ?? discoveryOrCurrent;
117
+ if (currentMaybe !== undefined) {
118
+ this.#assertDiscovery(discoveryOrCurrent);
119
+ if (registration === undefined)
120
+ throw new Error('Microsoft client registration is missing');
121
+ this.#assertRegistration(registration);
122
+ }
123
+ if (!current.refreshToken)
124
+ throw new Error('Microsoft session does not have a refresh token');
125
+ const refreshed = await this.#requestTokens(new URLSearchParams({
126
+ grant_type: 'refresh_token',
127
+ refresh_token: current.refreshToken,
128
+ scope: current.scope.join(' '),
129
+ }), current.scope);
130
+ return {
131
+ ...refreshed,
132
+ refreshToken: refreshed.refreshToken ?? current.refreshToken,
133
+ };
134
+ }
135
+ async #requestTokens(params, fallbackScopes, expectedNonce) {
136
+ const headers = {
137
+ accept: 'application/json',
138
+ 'content-type': 'application/x-www-form-urlencoded',
139
+ };
140
+ if ((this.#auth.authMethod ?? 'client_secret_post') === 'client_secret_basic') {
141
+ headers.authorization = `Basic ${Buffer.from(`${this.#auth.clientId}:${this.#auth.clientSecret}`).toString('base64')}`;
142
+ }
143
+ else {
144
+ params.set('client_id', this.#auth.clientId);
145
+ params.set('client_secret', this.#auth.clientSecret);
146
+ }
147
+ let response;
148
+ try {
149
+ response = await this.#fetch(this.#tokenEndpoint, {
150
+ method: 'POST',
151
+ headers,
152
+ body: params.toString(),
153
+ redirect: 'error',
154
+ signal: AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS),
155
+ });
156
+ }
157
+ catch {
158
+ throw new Error(`Microsoft token endpoint could not be reached: ${new URL(this.#tokenEndpoint).origin}`);
159
+ }
160
+ if (!response.ok) {
161
+ let json;
162
+ try {
163
+ json = await readBoundedJson(response);
164
+ }
165
+ catch (error) {
166
+ if (error instanceof Error && /too large/u.test(error.message))
167
+ throw error;
168
+ }
169
+ throw microsoftTokenError(response.status, json);
170
+ }
171
+ const json = await readBoundedJson(response);
172
+ if (typeof json.access_token !== 'string' || json.access_token.length === 0) {
173
+ throw new Error('Microsoft returned an invalid token response');
174
+ }
175
+ if (typeof json.id_token !== 'string' || json.id_token.length === 0) {
176
+ throw new Error('Microsoft token response did not include an ID token');
177
+ }
178
+ if (typeof json.token_type !== 'string' || json.token_type.toLowerCase() !== 'bearer') {
179
+ throw new Error('Microsoft returned an unsupported token type');
180
+ }
181
+ const claims = validateIdTokenShape(json.id_token, this.#auth.clientId, this.#issuer, this.#now(), expectedNonce);
182
+ const responseScopes = typeof json.scope === 'string' ? json.scope.split(/\s+/u) : fallbackScopes;
183
+ const expiresIn = typeof json.expires_in === 'number' && Number.isFinite(json.expires_in)
184
+ ? Math.max(0, json.expires_in)
185
+ : undefined;
186
+ return {
187
+ // Deliberately discard the Graph/API access token. The local MCP front door accepts only the ID
188
+ // token, which it verifies against Microsoft's keys and this configured client ID.
189
+ accessToken: json.id_token,
190
+ ...(typeof json.refresh_token === 'string' && json.refresh_token.length > 0
191
+ ? { refreshToken: json.refresh_token }
192
+ : {}),
193
+ tokenType: 'Bearer',
194
+ ...(typeof claims.exp === 'number'
195
+ ? { expiresAt: claims.exp * 1_000 }
196
+ : expiresIn === undefined
197
+ ? {}
198
+ : { expiresAt: this.#now() + expiresIn * 1_000 }),
199
+ scope: canonicalScopes(responseScopes),
200
+ };
201
+ }
202
+ #assertDiscovery(discovery) {
203
+ if (discovery.resource !== this.#resource ||
204
+ discovery.issuer !== this.#issuer ||
205
+ discovery.authorizationEndpoint !== this.#authorizationEndpoint ||
206
+ discovery.tokenEndpoint !== this.#tokenEndpoint) {
207
+ throw new Error('Microsoft OAuth state belongs to a different configuration');
208
+ }
209
+ }
210
+ #assertRegistration(registration) {
211
+ if (registration.clientId !== this.#auth.clientId) {
212
+ throw new Error('Microsoft OAuth client does not match the configured app');
213
+ }
214
+ }
215
+ }
216
+ export function microsoftIssuer(tenantId) {
217
+ return `https://login.microsoftonline.com/${encodeURIComponent(tenantId)}/v2.0`;
218
+ }
219
+ function microsoftAuthorizeUrl(tenantId) {
220
+ return `https://login.microsoftonline.com/${encodeURIComponent(tenantId)}/oauth2/v2.0/authorize`;
221
+ }
222
+ function microsoftTokenUrl(tenantId) {
223
+ return `https://login.microsoftonline.com/${encodeURIComponent(tenantId)}/oauth2/v2.0/token`;
224
+ }
225
+ function microsoftScopes(scopes) {
226
+ return canonicalScopes([...MICROSOFT_REQUIRED_SCOPES, ...(scopes ?? [])]);
227
+ }
228
+ function validateAuth(auth) {
229
+ if (auth.tenantId.trim().length === 0)
230
+ throw new Error('Microsoft tenant ID is required');
231
+ if (auth.clientId.trim().length === 0)
232
+ throw new Error('Microsoft client ID is required');
233
+ if (auth.clientSecret.length === 0)
234
+ throw new Error('Microsoft client secret is required');
235
+ return auth;
236
+ }
237
+ function validateResource(value) {
238
+ const url = new URL(value);
239
+ if (url.username || url.password || url.hash) {
240
+ throw new Error('Microsoft MCP resource must not contain credentials or a fragment');
241
+ }
242
+ if (url.protocol === 'https:' || (url.protocol === 'http:' && isLoopback(url.hostname))) {
243
+ return url.href;
244
+ }
245
+ throw new Error('Microsoft MCP resource must use HTTPS or an HTTP loopback URL');
246
+ }
247
+ function validateMicrosoftRedirect(value) {
248
+ const url = new URL(value);
249
+ if (url.protocol !== 'http:' ||
250
+ !isLoopback(url.hostname) ||
251
+ url.username ||
252
+ url.password ||
253
+ url.search ||
254
+ url.hash ||
255
+ url.pathname !== MICROSOFT_CALLBACK_PATH) {
256
+ throw new Error(`Microsoft redirect must be an HTTP loopback URL at ${MICROSOFT_CALLBACK_PATH}`);
257
+ }
258
+ return url.href;
259
+ }
260
+ function validateEndpoint(value, label, allowInsecureLocalhost) {
261
+ const url = new URL(value);
262
+ if (url.username || url.password || url.hash) {
263
+ throw new Error(`${label} must not contain credentials or a fragment`);
264
+ }
265
+ if (url.protocol !== 'https:' &&
266
+ !(allowInsecureLocalhost && url.protocol === 'http:' && isLoopback(url.hostname))) {
267
+ throw new Error(`${label} must use HTTPS`);
268
+ }
269
+ return url.href;
270
+ }
271
+ function assertCallback(callbackValue, redirectValue) {
272
+ const callback = new URL(callbackValue);
273
+ const redirect = new URL(redirectValue);
274
+ const sameLoopbackAlias = isLoopback(callback.hostname) && isLoopback(redirect.hostname);
275
+ if (callback.protocol !== redirect.protocol ||
276
+ callback.port !== redirect.port ||
277
+ callback.pathname !== redirect.pathname ||
278
+ callback.username ||
279
+ callback.password ||
280
+ callback.hash ||
281
+ (!sameLoopbackAlias && callback.hostname !== redirect.hostname)) {
282
+ throw new Error('Microsoft callback URL does not match the registered redirect');
283
+ }
284
+ }
285
+ function validateIdTokenShape(idToken, clientId, issuer, nowMs, expectedNonce) {
286
+ let claims;
287
+ try {
288
+ claims = decodeJwt(idToken);
289
+ }
290
+ catch {
291
+ throw new Error('Microsoft returned an invalid ID token');
292
+ }
293
+ const audiences = typeof claims.aud === 'string' ? [claims.aud] : claims.aud;
294
+ if (!Array.isArray(audiences) || !audiences.includes(clientId)) {
295
+ throw new Error('Microsoft ID token audience is invalid');
296
+ }
297
+ if (claims.iss !== issuer) {
298
+ throw new Error('Microsoft ID token issuer is invalid');
299
+ }
300
+ if (typeof claims.exp !== 'number' || claims.exp <= Math.floor(nowMs / 1_000)) {
301
+ throw new Error('Microsoft ID token is expired');
302
+ }
303
+ if (expectedNonce !== undefined &&
304
+ !constantTimeStringEqual(typeof claims.nonce === 'string' ? claims.nonce : '', expectedNonce)) {
305
+ throw new Error('Microsoft ID token nonce is invalid');
306
+ }
307
+ return claims;
308
+ }
309
+ async function readBoundedJson(response) {
310
+ const declared = Number(response.headers.get('content-length'));
311
+ if (Number.isFinite(declared) && declared > MAX_TOKEN_RESPONSE_BYTES) {
312
+ await response.body?.cancel().catch(() => undefined);
313
+ throw new Error('Microsoft token response is too large');
314
+ }
315
+ if (response.body === null)
316
+ throw new Error('Microsoft token endpoint returned invalid JSON');
317
+ const reader = response.body.getReader();
318
+ const decoder = new TextDecoder();
319
+ const chunks = [];
320
+ let bytes = 0;
321
+ try {
322
+ while (true) {
323
+ const chunk = await reader.read();
324
+ if (chunk.done)
325
+ break;
326
+ bytes += chunk.value.byteLength;
327
+ if (bytes > MAX_TOKEN_RESPONSE_BYTES) {
328
+ await reader.cancel().catch(() => undefined);
329
+ throw new Error('Microsoft token response is too large');
330
+ }
331
+ chunks.push(decoder.decode(chunk.value, { stream: true }));
332
+ }
333
+ chunks.push(decoder.decode());
334
+ }
335
+ finally {
336
+ reader.releaseLock();
337
+ }
338
+ try {
339
+ const value = JSON.parse(chunks.join(''));
340
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
341
+ throw new Error();
342
+ return value;
343
+ }
344
+ catch {
345
+ throw new Error('Microsoft token endpoint returned invalid JSON');
346
+ }
347
+ }
348
+ function assertEntropyValue(value, label) {
349
+ if (value.length < 16 || !/^[A-Za-z0-9._~-]+$/u.test(value)) {
350
+ throw new Error(`Microsoft ${label} is invalid`);
351
+ }
352
+ }
353
+ function constantTimeStringEqual(left, right) {
354
+ const leftBytes = Buffer.from(left);
355
+ const rightBytes = Buffer.from(right);
356
+ return leftBytes.length === rightBytes.length && timingSafeEqual(leftBytes, rightBytes);
357
+ }
358
+ function isLoopback(hostname) {
359
+ const normalized = hostname.replace(/^\[|\]$/gu, '').toLowerCase();
360
+ return normalized === 'localhost' || normalized === '127.0.0.1' || normalized === '::1';
361
+ }
362
+ //# sourceMappingURL=devtools-microsoft-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-microsoft-auth.js","sourceRoot":"","sources":["../src/devtools-microsoft-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { DevtoolsAuthError } from './devtools-auth-types.js';
2
+ export declare class MicrosoftDevtoolsAuthError extends DevtoolsAuthError {
3
+ constructor(code: string, message: string);
4
+ }
5
+ export declare function microsoftCallbackError(error: string | null): MicrosoftDevtoolsAuthError;
6
+ export declare function microsoftTokenError(status: number, response: Readonly<Record<string, unknown>> | undefined): MicrosoftDevtoolsAuthError;
7
+ //# sourceMappingURL=devtools-microsoft-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-microsoft-errors.d.ts","sourceRoot":"","sources":["../src/devtools-microsoft-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,qBAAa,0BAA2B,SAAQ,iBAAiB;gBACnD,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI1C;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,0BAA0B,CAWvF;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,GACtD,0BAA0B,CAQ5B"}
@@ -0,0 +1,60 @@
1
+ import { DevtoolsAuthError } from './devtools-auth-types.js';
2
+ export class MicrosoftDevtoolsAuthError extends DevtoolsAuthError {
3
+ constructor(code, message) {
4
+ super(code, message);
5
+ this.name = 'MicrosoftDevtoolsAuthError';
6
+ }
7
+ }
8
+ export function microsoftCallbackError(error) {
9
+ if (error === 'access_denied') {
10
+ return new MicrosoftDevtoolsAuthError('access_denied', 'Microsoft sign-in was cancelled or denied. Start a fresh sign-in when you are ready.');
11
+ }
12
+ return new MicrosoftDevtoolsAuthError('microsoft_authorization_failed', 'Microsoft did not authorize this sign-in. Return to Devtools and start a fresh sign-in.');
13
+ }
14
+ export function microsoftTokenError(status, response) {
15
+ const code = microsoftProviderCode(response);
16
+ const remediation = code === undefined ? undefined : MICROSOFT_ERROR_REMEDIATION[code];
17
+ return new MicrosoftDevtoolsAuthError(code ?? 'microsoft_token_exchange_failed', remediation ??
18
+ `Microsoft rejected the token exchange (HTTP ${status}). Check the app registration and start a fresh sign-in.`);
19
+ }
20
+ function microsoftProviderCode(response) {
21
+ if (response === undefined)
22
+ return undefined;
23
+ const firstNumeric = Array.isArray(response.error_codes)
24
+ ? response.error_codes.find((value) => typeof value === 'number' &&
25
+ Number.isSafeInteger(value) &&
26
+ value >= 0 &&
27
+ value <= 9_999_999_999)
28
+ : undefined;
29
+ if (firstNumeric !== undefined)
30
+ return `AADSTS${firstNumeric}`;
31
+ const description = response.error_description;
32
+ if (typeof description === 'string') {
33
+ const match = /\bAADSTS(\d{3,10})\b/u.exec(description);
34
+ if (match?.[1] !== undefined)
35
+ return `AADSTS${match[1]}`;
36
+ }
37
+ const standardError = response.error;
38
+ return typeof standardError === 'string' && SAFE_OAUTH_ERROR_CODES.has(standardError)
39
+ ? standardError
40
+ : undefined;
41
+ }
42
+ const SAFE_OAUTH_ERROR_CODES = new Set([
43
+ 'access_denied',
44
+ 'invalid_client',
45
+ 'invalid_grant',
46
+ 'interaction_required',
47
+ 'temporarily_unavailable',
48
+ ]);
49
+ const MICROSOFT_ERROR_REMEDIATION = {
50
+ AADSTS50020: 'This account is not available in the configured tenant. Use an invited tenant account or update the tenant setting.',
51
+ AADSTS65001: 'Microsoft requires consent for this app or scope. Grant consent, then start a fresh sign-in.',
52
+ AADSTS700016: 'Microsoft could not find this app registration in the configured tenant. Check the tenant ID and client ID.',
53
+ AADSTS7000215: 'Microsoft rejected the client secret. Create a fresh secret value for this app registration.',
54
+ AADSTS7000222: 'The Microsoft client secret has expired. Create and configure a fresh secret value.',
55
+ invalid_client: 'Microsoft rejected the app credentials. Check the client ID and client secret value.',
56
+ invalid_grant: 'The Microsoft authorization grant is no longer valid. Start a fresh sign-in.',
57
+ interaction_required: 'Microsoft requires user interaction. Return to Devtools and sign in again.',
58
+ temporarily_unavailable: 'Microsoft sign-in is temporarily unavailable. Try again shortly.',
59
+ };
60
+ //# sourceMappingURL=devtools-microsoft-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-microsoft-errors.js","sourceRoot":"","sources":["../src/devtools-microsoft-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,OAAO,0BAA2B,SAAQ,iBAAiB;IAC/D,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAoB;IACzD,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;QAC9B,OAAO,IAAI,0BAA0B,CACnC,eAAe,EACf,sFAAsF,CACvF,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,0BAA0B,CACnC,gCAAgC,EAChC,yFAAyF,CAC1F,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,QAAuD;IAEvD,MAAM,IAAI,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;IACvF,OAAO,IAAI,0BAA0B,CACnC,IAAI,IAAI,iCAAiC,EACzC,WAAW;QACT,+CAA+C,MAAM,0DAA0D,CAClH,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,QAAuD;IAEvD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;QACtD,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CACvB,CAAC,KAAK,EAAmB,EAAE,CACzB,OAAO,KAAK,KAAK,QAAQ;YACzB,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;YAC3B,KAAK,IAAI,CAAC;YACV,KAAK,IAAI,aAAa,CACzB;QACH,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,SAAS,YAAY,EAAE,CAAC;IAC/D,MAAM,WAAW,GAAG,QAAQ,CAAC,iBAAiB,CAAC;IAC/C,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,CAAC;IACD,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;IACrC,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI,sBAAsB,CAAC,GAAG,CAAC,aAAa,CAAC;QACnF,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,sBAAsB;IACtB,yBAAyB;CAC1B,CAAC,CAAC;AAEH,MAAM,2BAA2B,GAAqC;IACpE,WAAW,EACT,qHAAqH;IACvH,WAAW,EACT,8FAA8F;IAChG,YAAY,EACV,6GAA6G;IAC/G,aAAa,EACX,8FAA8F;IAChG,aAAa,EACX,qFAAqF;IACvF,cAAc,EACZ,sFAAsF;IACxF,aAAa,EAAE,8EAA8E;IAC7F,oBAAoB,EAClB,4EAA4E;IAC9E,uBAAuB,EAAE,kEAAkE;CAC5F,CAAC"}
@@ -1,5 +1,8 @@
1
+ import type { LocalDevtoolsDelegatedCredentialSink } from '@noodle-borg/service';
2
+ import { type DevtoolsCustomerAuth } from './devtools-auth-session.js';
1
3
  import { type DesignRouteContext } from './devtools-design-routes.js';
2
4
  import { calculateRangeProgress, harnessHtml, openAiShimScript, type PreviewDevice, type PreviewTheme, wrapWidgetHtml } from './devtools-harness.js';
5
+ import { type RpcLogEntry } from './devtools-rpc-forwarder.js';
3
6
  /**
4
7
  * `noodle devtools` preview server. It boots alongside a `dev` MCP endpoint and:
5
8
  * - serves the three-pane harness shell (HTML/CSS/JS in `devtools-harness.ts`),
@@ -9,7 +12,7 @@ import { calculateRangeProgress, harnessHtml, openAiShimScript, type PreviewDevi
9
12
  * The MCP server already inlines the ext-apps bridge; the shim lets a widget's `callServerTool` become a
10
13
  * `fetch('/rpc')` the harness proxies and records, without reimplementing the ext-apps host protocol.
11
14
  */
12
- export type { PreviewDevice, PreviewTheme };
15
+ export type { PreviewDevice, PreviewTheme, RpcLogEntry };
13
16
  export { calculateRangeProgress, harnessHtml, openAiShimScript, wrapWidgetHtml };
14
17
  export interface PreviewOptions {
15
18
  readonly mcpUrl: string;
@@ -25,24 +28,23 @@ export interface PreviewOptions {
25
28
  readonly geminiModel?: string;
26
29
  /** Trusted local project context for Design Session persistence. Never sourced from browser input. */
27
30
  readonly design?: DesignRouteContext;
28
- }
29
- export interface RpcLogEntry {
30
- readonly time: number;
31
- readonly method: string;
32
- readonly name?: string;
33
- readonly status: 'ok' | 'error';
34
- readonly durationMs: number;
35
- readonly summary: string;
36
- /** Request params (input) captured for the inspector; size-capped. */
37
- readonly request?: unknown;
38
- /** Response result or error (output) captured for the inspector; size-capped. */
39
- readonly response?: unknown;
31
+ /**
32
+ * Isolate untrusted widgets from the credential-owning host. Enabled automatically for authenticated
33
+ * previews; exposed here so the boundary can be tested independently.
34
+ */
35
+ readonly secureWidgets?: boolean;
36
+ /** Sanitized customer-auth projection from the compiled local app. */
37
+ readonly customerAuth?: DevtoolsCustomerAuth;
38
+ /** In-process-only credential bridge supplied by `noodle dev`; never reachable from browser routes. */
39
+ readonly delegatedCredentialSink?: LocalDevtoolsDelegatedCredentialSink;
40
40
  }
41
41
  export interface PreviewHandle {
42
42
  readonly url: string;
43
43
  readonly log: readonly RpcLogEntry[];
44
44
  /** Tell connected browsers to reload (refresh the tool list + re-fetch the open widget). */
45
45
  signalReload(): void;
46
+ /** Rebind auth after a successful source reload; changing auth hard-reloads connected browsers. */
47
+ updateCustomerAuth(auth: DevtoolsCustomerAuth | undefined): void;
46
48
  close(): Promise<void>;
47
49
  }
48
50
  export declare function startPreview(options: PreviewOptions): Promise<PreviewHandle>;
@@ -1 +1 @@
1
- {"version":3,"file":"devtools-preview.d.ts","sourceRoot":"","sources":["../src/devtools-preview.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,kBAAkB,EAAqB,MAAM,6BAA6B,CAAC;AACzF,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;GAQG;AAEH,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,2GAA2G;IAC3G,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,sGAAsG;IACtG,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CACtC;AAOD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,SAAS,WAAW,EAAE,CAAC;IACrC,4FAA4F;IAC5F,YAAY,IAAI,IAAI,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AA8HD,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAkelF"}
1
+ {"version":3,"file":"devtools-preview.d.ts","sourceRoot":"","sources":["../src/devtools-preview.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAQ5F,OAAO,EAAE,KAAK,kBAAkB,EAAqB,MAAM,6BAA6B,CAAC;AACzF,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAA8B,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG3F;;;;;;;;GAQG;AAEH,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AAEzD,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,2GAA2G;IAC3G,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,sGAAsG;IACtG,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,sEAAsE;IACtE,QAAQ,CAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IAC7C,uGAAuG;IACvG,QAAQ,CAAC,uBAAuB,CAAC,EAAE,oCAAoC,CAAC;CACzE;AAOD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,SAAS,WAAW,EAAE,CAAC;IACrC,4FAA4F;IAC5F,YAAY,IAAI,IAAI,CAAC;IACrB,mGAAmG;IACnG,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,SAAS,GAAG,IAAI,CAAC;IACjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAyDD,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA+elF"}