@noodleseed/one 0.96.3 → 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 (106) 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/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  72. package/node_modules/@noodle-borg/auth/dist/index.d.ts +1 -0
  73. package/node_modules/@noodle-borg/auth/dist/index.d.ts.map +1 -1
  74. package/node_modules/@noodle-borg/auth/dist/index.js +1 -0
  75. package/node_modules/@noodle-borg/auth/dist/index.js.map +1 -1
  76. package/node_modules/@noodle-borg/auth/dist/mcp-oauth-client.d.ts +56 -0
  77. package/node_modules/@noodle-borg/auth/dist/mcp-oauth-client.d.ts.map +1 -0
  78. package/node_modules/@noodle-borg/auth/dist/mcp-oauth-client.js +367 -0
  79. package/node_modules/@noodle-borg/auth/dist/mcp-oauth-client.js.map +1 -0
  80. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.d.ts +13 -0
  81. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.d.ts.map +1 -0
  82. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.js +71 -0
  83. package/node_modules/@noodle-borg/service/dist/customer-verifier-boundaries.js.map +1 -0
  84. package/node_modules/@noodle-borg/service/dist/customer-verifier.d.ts +1 -1
  85. package/node_modules/@noodle-borg/service/dist/customer-verifier.d.ts.map +1 -1
  86. package/node_modules/@noodle-borg/service/dist/customer-verifier.js +43 -31
  87. package/node_modules/@noodle-borg/service/dist/customer-verifier.js.map +1 -1
  88. package/node_modules/@noodle-borg/service/dist/index.d.ts +3 -1
  89. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  90. package/node_modules/@noodle-borg/service/dist/index.js +1 -0
  91. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  92. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-credentials.d.ts +20 -0
  93. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-credentials.d.ts.map +1 -0
  94. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-credentials.js +107 -0
  95. package/node_modules/@noodle-borg/service/dist/local-devtools-delegated-credentials.js.map +1 -0
  96. package/node_modules/@noodle-borg/service/dist/oauth/microsoft.d.ts +5 -0
  97. package/node_modules/@noodle-borg/service/dist/oauth/microsoft.d.ts.map +1 -1
  98. package/node_modules/@noodle-borg/service/dist/oauth/microsoft.js +48 -28
  99. package/node_modules/@noodle-borg/service/dist/oauth/microsoft.js.map +1 -1
  100. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts +13 -0
  101. package/node_modules/@noodle-borg/service/dist/serve-options.d.ts.map +1 -1
  102. package/node_modules/@noodle-borg/service/dist/serve.d.ts +3 -0
  103. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  104. package/node_modules/@noodle-borg/service/dist/serve.js +49 -18
  105. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  106. package/package.json +1 -1
@@ -6,11 +6,13 @@
6
6
  * The client script is plain (no template literals / no `${...}`) so it splices safely into the shell
7
7
  * and so the shim's classic script runs before the widget's deferred bridge module.
8
8
  */
9
+ import { DEVTOOLS_AUTH_CLIENT_JS, DEVTOOLS_AUTH_GATE_HTML, DEVTOOLS_AUTH_SESSION_HTML, DEVTOOLS_AUTH_STYLES, } from './devtools-auth-ui.js';
9
10
  import { DEVTOOLS_FAVICON_DATA_URI, DEVTOOLS_SHADER_SCRIPT, DEVTOOLS_WORDMARK, } from './devtools-brand.js';
10
11
  import { DEVTOOLS_DESIGN_CLIENT_JS, DEVTOOLS_DESIGN_HTML } from './devtools-design.js';
11
12
  import { DEVTOOLS_JSON_CLIENT_JS, DEVTOOLS_JSON_STYLES } from './devtools-json.js';
12
13
  import { CLAUDE_MARK, GEMINI_MARK, OPENAI_MARK } from './devtools-provider-logos.js';
13
14
  import { DEVTOOLS_STYLES } from './devtools-styles.js';
15
+ import { isAutoSafeTool, parseWidgetToolCallMessage } from './devtools-tool-safety.js';
14
16
  /** Convert a native range value to a clamped percentage using its actual, non-zero bounds. */
15
17
  export function calculateRangeProgress(value, min, max) {
16
18
  if (![value, min, max].every(Number.isFinite) || max <= min)
@@ -40,18 +42,35 @@ export function openAiShimScript(init) {
40
42
  toolResponseMetadata: init.toolResponseMetadata ?? null,
41
43
  theme: init.theme ?? 'light',
42
44
  };
45
+ const toolCallBridge = init.hostMediated
46
+ ? 'var __noodleToolCalls={}; var __noodleToolSequence=0;' +
47
+ 'window.addEventListener("message",function(ev){ var d=ev.data;' +
48
+ ' if(ev.source!==window.parent||!d||d.type!=="noodle:tool-result"||typeof d.requestId!=="string") return;' +
49
+ ' var pending=__noodleToolCalls[d.requestId]; if(!pending) return; delete __noodleToolCalls[d.requestId];' +
50
+ ' if(d.error) pending.reject(new Error(String(d.error))); else pending.resolve(d.result); });'
51
+ : '';
52
+ const callTool = init.hostMediated
53
+ ? ' callTool: function (name, args) {' +
54
+ ' return new Promise(function(resolve,reject){' +
55
+ ' var requestId="widget-"+Date.now()+"-"+(++__noodleToolSequence);' +
56
+ ' __noodleToolCalls[requestId]={resolve:resolve,reject:reject};' +
57
+ ' window.parent.postMessage({type:"noodle:tool-call",requestId:requestId,name:name,arguments:args||{}},"*");' +
58
+ ' });' +
59
+ ' },'
60
+ : ' callTool: function (name, args) {' +
61
+ ' return fetch("/rpc", { method: "POST", headers: { "content-type": "application/json" },' +
62
+ ' body: JSON.stringify({ jsonrpc: "2.0", id: Date.now(), method: "tools/call",' +
63
+ ' params: { name: name, arguments: args || {} } }) })' +
64
+ ' .then(function (r) { return r.json(); })' +
65
+ ' .then(function (j) { if (j && j.error) { throw new Error((j.error && j.error.message) || "tool error"); } return j.result; });' +
66
+ ' },';
43
67
  return ('<script>' +
68
+ toolCallBridge +
44
69
  'window.openai = Object.assign(' +
45
70
  jsonForScript(data) +
46
71
  ', {' +
47
72
  ' widgetState: null, displayMode: "inline", locale: "en",' +
48
- ' callTool: function (name, args) {' +
49
- ' return fetch("/rpc", { method: "POST", headers: { "content-type": "application/json" },' +
50
- ' body: JSON.stringify({ jsonrpc: "2.0", id: Date.now(), method: "tools/call",' +
51
- ' params: { name: name, arguments: args || {} } }) })' +
52
- ' .then(function (r) { return r.json(); })' +
53
- ' .then(function (j) { if (j && j.error) { throw new Error((j.error && j.error.message) || "tool error"); } return j.result; });' +
54
- ' },' +
73
+ callTool +
55
74
  ' setWidgetState: function (s) { window.openai.widgetState = s; return Promise.resolve(); },' +
56
75
  // Notify the harness so a widget calling requestDisplayMode("fullscreen") is actually presented fullscreen.
57
76
  ' requestDisplayMode: function (p) { var m = (p && p.mode) || "inline"; window.openai.displayMode = m; try { window.parent.postMessage({ type: "noodle:display-mode", mode: m }, "*"); } catch (e) {} return Promise.resolve({ mode: m }); },' +
@@ -89,14 +108,23 @@ function escapeHtml(value) {
89
108
  }
90
109
  /** The three-pane harness shell. */
91
110
  export function harnessHtml(options) {
92
- const client = HARNESS_CLIENT_JS.replace('__INITIAL_THEME__', options.theme === 'dark' ? 'dark' : 'light').replace('__INITIAL_DEVICE__', options.device === 'mobile' ? 'mobile' : 'desktop');
111
+ const client = HARNESS_CLIENT_JS.replace('__INITIAL_THEME__', options.theme === 'dark' ? 'dark' : 'light')
112
+ .replace('__INITIAL_DEVICE__', options.device === 'mobile' ? 'mobile' : 'desktop')
113
+ .replace('__RPC_CAPABILITY__', jsonForScript(options.rpcCapability ?? ''))
114
+ .replace('__SECURE_WIDGETS__', options.secureWidgets ? 'true' : 'false');
115
+ const designAttributes = options.secureWidgets
116
+ ? ' disabled aria-disabled="true" title="Design mode is unavailable for authenticated previews"'
117
+ : '';
118
+ const frameSandbox = options.secureWidgets ? ' sandbox="allow-scripts allow-popups"' : '';
119
+ const bodyClass = options.authRequired ? ' class="auth-required auth-locked"' : '';
93
120
  return ('<!doctype html><html lang="en"><head><meta charset="utf-8">' +
94
121
  '<meta name="viewport" content="width=device-width, initial-scale=1">' +
95
122
  `<link rel="icon" type="image/svg+xml" href="${DEVTOOLS_FAVICON_DATA_URI}">` +
96
123
  '<title>Noodle Seed Devtools</title><style>' +
97
124
  DEVTOOLS_STYLES +
98
125
  DEVTOOLS_JSON_STYLES +
99
- '</style></head><body>' +
126
+ (options.authRequired ? DEVTOOLS_AUTH_STYLES : '') +
127
+ `</style></head><body${bodyClass}>` +
100
128
  '<canvas id="ns-canvas" aria-hidden="true"></canvas>' +
101
129
  '<div class="ambient-fallback" aria-hidden="true"></div>' +
102
130
  '<div class="ambient-scrim" aria-hidden="true"></div>' +
@@ -116,11 +144,13 @@ export function harnessHtml(options) {
116
144
  '<div class="modes" role="tablist" aria-label="Devtools mode">' +
117
145
  '<button id="mode-preview" class="mode is-active" type="button" role="tab">Preview</button>' +
118
146
  '<button id="mode-chat" class="mode" type="button" role="tab">Chat</button>' +
119
- '<button id="mode-design" class="mode mode--design" type="button" role="tab" aria-controls="design-view" aria-selected="false">Design</button>' +
147
+ `<button id="mode-design" class="mode mode--design" type="button" role="tab" aria-controls="design-view" aria-selected="false"${designAttributes}>Design</button>` +
120
148
  '</div>' +
121
149
  `<span class="muted brand__url" title="${escapeHtml(options.mcpUrl)}">${escapeHtml(options.mcpUrl)}</span>` +
150
+ (options.authRequired ? DEVTOOLS_AUTH_SESSION_HTML : '') +
122
151
  '<button id="toggle-activity" class="rail-toggle rail-toggle--activity" type="button" aria-label="Open MCP calls" aria-controls="log" aria-expanded="false">' +
123
152
  '<span class="status-dot" aria-hidden="true"></span><span>Activity</span></button></header>' +
153
+ (options.authRequired ? DEVTOOLS_AUTH_GATE_HTML : '') +
124
154
  '<div id="preview-view">' +
125
155
  '<div id="controls" class="controls">' +
126
156
  '<span class="ctl"><span class="ctl__lbl">Theme</span><button id="theme-toggle" class="theme-switch" type="button" aria-label="Switch to dark theme" aria-pressed="false">' +
@@ -144,7 +174,7 @@ export function harnessHtml(options) {
144
174
  '<p>Nothing selected</p>' +
145
175
  '<span>Pick a tool on the left to preview a widget or inspect its JSON response here.</span>' +
146
176
  '</div>' +
147
- '<iframe id="frame" class="hidden" title="widget preview"></iframe>' +
177
+ `<iframe id="frame" class="hidden" title="widget preview"${frameSandbox}></iframe>` +
148
178
  '<div id="result" class="hidden"><div class="result__bar"><div class="result__label">response</div>' +
149
179
  '<button id="copy-result" class="copy-action" type="button" aria-label="Copy response">' +
150
180
  '<span class="copy-action__icons" aria-hidden="true">' +
@@ -196,6 +226,7 @@ export function harnessHtml(options) {
196
226
  DEVTOOLS_DESIGN_CLIENT_JS +
197
227
  '\n' +
198
228
  client +
229
+ (options.authRequired ? `\n${DEVTOOLS_AUTH_CLIENT_JS}` : '') +
199
230
  '</script><script>' +
200
231
  DEVTOOLS_SHADER_SCRIPT +
201
232
  '</script></body></html>');
@@ -203,6 +234,9 @@ export function harnessHtml(options) {
203
234
  // Plain ES5-ish client (no template literals / no ${...}) — spliced into the harness verbatim.
204
235
  const HARNESS_CLIENT_JS = [
205
236
  calculateRangeProgress.toString(),
237
+ isAutoSafeTool.toString(),
238
+ parseWidgetToolCallMessage.toString(),
239
+ 'var RPC_CAPABILITY=__RPC_CAPABILITY__; var SECURE_WIDGETS=__SECURE_WIDGETS__;',
206
240
  'var frame=document.getElementById("frame");',
207
241
  'var empty=document.getElementById("empty");',
208
242
  'var themeToggle=document.getElementById("theme-toggle");',
@@ -222,7 +256,8 @@ const HARNESS_CLIENT_JS = [
222
256
  'window.addEventListener("resize",function(){ if(window.innerWidth>=1180) closeRails(); });',
223
257
  'document.addEventListener("keydown",function(e){ if(e.key==="Escape") closeRails(); });',
224
258
  'var currentTheme="__INITIAL_THEME__"; var currentDevice="__INITIAL_DEVICE__";',
225
- 'function rpc(method,params){ return fetch("/rpc",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:Date.now(),method:method,params:params||{}})}).then(function(r){return r.json();}); }',
259
+ 'function hostHeaders(json){ var headers=json?{"content-type":"application/json"}:{}; if(SECURE_WIDGETS) headers["x-noodle-devtools-capability"]=RPC_CAPABILITY; return headers; }',
260
+ 'function rpc(method,params){ return fetch("/rpc",{method:"POST",headers:hostHeaders(true),body:JSON.stringify({jsonrpc:"2.0",id:Date.now(),method:method,params:params||{}})}).then(function(r){return r.json();}); }',
226
261
  'function syncThemeControl(){ var dark=currentTheme==="dark"; themeToggle.setAttribute("aria-pressed",dark?"true":"false"); themeToggle.setAttribute("aria-label",dark?"Switch to light theme":"Switch to dark theme"); themeToggle.dataset.theme=currentTheme; }',
227
262
  'function applyTheme(){ syncThemeControl(); try{ var w=frame.contentWindow; if(w&&w.openai){ w.openai.theme=currentTheme; w.dispatchEvent(new Event("openai:set_globals")); } }catch(e){} }',
228
263
  'function fitFrame(){ if(frame.classList.contains("nd-frame-full")) return; try{ var d=frame.contentDocument; if(d&&d.documentElement){ frame.style.height=Math.max(120, d.documentElement.scrollHeight)+"px"; } }catch(e){} }',
@@ -231,7 +266,8 @@ const HARNESS_CLIENT_JS = [
231
266
  'function setDevice(device){ currentDevice=device; widthInput.value=device==="mobile"?390:820; syncDeviceControl(); syncWidth(); }',
232
267
  'function syncWidth(){ var progress=calculateRangeProgress(Number(widthInput.value),Number(widthInput.min),Number(widthInput.max)); widthInput.style.setProperty("--width-progress",progress+"%"); frame.style.width=widthInput.value+"px"; widthVal.textContent=widthInput.value+" px"; }',
233
268
  'function setState(s){ empty.style.display=s==="empty"?"flex":"none"; frame.style.display=s==="widget"?"block":"none"; resultBox.style.display=s==="result"?"block":"none"; controlsBar.style.display=s==="widget"?"flex":"none"; }',
234
- 'function loadWidget(name,args,resourceUri){ current=name; currentArgs=args||{}; if(resourceUri!==undefined) currentResourceUri=resourceUri||null; setState("widget"); var q="/widget?name="+encodeURIComponent(name); if(Object.keys(currentArgs).length) q+="&args="+encodeURIComponent(JSON.stringify(currentArgs)); frame.src=q; if(modeDesign&&modeDesign.classList.contains("is-active")&&window.NoodleDesignUI) window.NoodleDesignUI.enter(); }',
269
+ 'function setWidgetDocument(target,q){ if(!SECURE_WIDGETS){ target.src=q; return; } fetch(q,{headers:hostHeaders(false)}).then(function(r){if(!r.ok) throw new Error("widget load failed"); return r.text();}).then(function(html){target.srcdoc=html;}).catch(function(){target.srcdoc="<!doctype html><p>Failed to load widget.</p>";}); }',
270
+ 'function loadWidget(name,args,resourceUri){ current=name; currentArgs=args||{}; if(resourceUri!==undefined) currentResourceUri=resourceUri||null; setState("widget"); var q="/widget?name="+encodeURIComponent(name); if(Object.keys(currentArgs).length) q+="&args="+encodeURIComponent(JSON.stringify(currentArgs)); setWidgetDocument(frame,q); if(!SECURE_WIDGETS&&modeDesign&&modeDesign.classList.contains("is-active")&&window.NoodleDesignUI) window.NoodleDesignUI.enter(); }',
235
271
  'function legacyCopy(value){ var textarea=document.createElement("textarea"); textarea.value=value; textarea.setAttribute("readonly",""); textarea.style.position="fixed"; textarea.style.left="-9999px"; document.body.appendChild(textarea); textarea.select(); var copied=false; try{ copied=document.execCommand("copy"); }catch(e){} textarea.remove(); return copied?Promise.resolve():Promise.reject(new Error("copy failed")); }',
236
272
  'function copyText(value,trigger,label){ var operation=navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(value).catch(function(){return legacyCopy(value);}):legacyCopy(value); return operation.then(function(){ var text=trigger.querySelector(".copy-action__label"); trigger.classList.add("is-copied"); if(text) text.textContent="Copied"; copyStatus.textContent="Copied "+label; setTimeout(function(){ trigger.classList.remove("is-copied"); if(text) text.textContent="Copy"; },1600); }).catch(function(){ copyStatus.textContent="Could not copy "+label; }); }',
237
273
  'copyResult.addEventListener("click",function(){ copyText(currentResultSource,copyResult,"response"); });',
@@ -251,23 +287,26 @@ const HARNESS_CLIENT_JS = [
251
287
  'document.getElementById("fullscreen").addEventListener("click", function(){ if(fsFrame) exitFullscreen(); else if(current) enterFullscreen(frame); });',
252
288
  'function findFrameBySource(src){ if(frame&&frame.contentWindow===src) return frame; var list=document.querySelectorAll("#chat-log iframe"); for(var i=0;i<list.length;i++){ if(list[i].contentWindow===src) return list[i]; } return null; }',
253
289
  'window.addEventListener("message", function(ev){ var d=ev.data; if(!d||d.type!=="noodle:display-mode") return; var f=findFrameBySource(ev.source); if(!f) return; if(d.mode==="fullscreen") enterFullscreen(f); else if(fsFrame===f) exitFullscreen(); });',
290
+ 'var currentToolsByName={};',
291
+ 'function replyToWidget(target,requestId,result,error){ try{ target.postMessage({type:"noodle:tool-result",requestId:requestId,result:result,error:error||null},"*"); }catch(e){} }',
292
+ 'window.addEventListener("message",function(ev){ if(!SECURE_WIDGETS||!findFrameBySource(ev.source)) return; var call=parseWidgetToolCallMessage(ev.data); if(!call) return; var tool=currentToolsByName[call.name]; if(!tool){ replyToWidget(ev.source,call.requestId,null,"Unknown tool"); return; } if(!isAutoSafeTool(tool)&&!window.confirm("This widget wants to run "+call.name+". Allow this call?")){ replyToWidget(ev.source,call.requestId,null,"Tool call denied"); return; } rpc("tools/call",{name:call.name,arguments:call.arguments}).then(function(j){ if(j&&j.error) replyToWidget(ev.source,call.requestId,null,(j.error&&j.error.message)||"tool error"); else replyToWidget(ev.source,call.requestId,j&&j.result,null); }).catch(function(){replyToWidget(ev.source,call.requestId,null,"Tool call failed");}); });',
254
293
  // Tool cards (expandable: description + schema fields + a single Run; widget tools render in the preview).
255
294
  'function makeControl(p){ if(Array.isArray(p.enum)){ var s=document.createElement("select"); p.enum.forEach(function(v){ var o=document.createElement("option"); o.value=String(v); o.textContent=String(v); s.appendChild(o); }); return s; } if(p.type==="boolean"){ var c=document.createElement("input"); c.type="checkbox"; return c; } var i=document.createElement("input"); i.type=(p.type==="number"||p.type==="integer")?"number":"text"; if(p.default!==undefined&&p.type!=="object"&&p.type!=="array") i.value=String(p.default); return i; }',
256
295
  'function collect(props,controls){ var args={}; Object.keys(controls).forEach(function(k){ var p=props[k]||{}; var el=controls[k]; if(el.type==="checkbox"){ args[k]=el.checked; return; } var v=el.value; if(v==="") return; if(p.type==="number"||p.type==="integer"){ args[k]=Number(v); return; } if(p.type==="object"||p.type==="array"){ try{ args[k]=JSON.parse(v); }catch(e){ args[k]=v; } return; } args[k]=v; }); return args; }',
257
296
  'function buildDetail(detail,t,hasWidget){ if(t.description){ var d=document.createElement("p"); d.className="tool__desc"; d.textContent=t.description; detail.appendChild(d); } var schema=t.inputSchema||{}; var props=schema.properties||{}; var req=schema.required||[]; var controls={}; Object.keys(props).forEach(function(k){ var p=props[k]||{}; var f=document.createElement("div"); f.className="field"; var lab=document.createElement("label"); lab.textContent=k+(req.indexOf(k)>=0?" *":"")+(p.type?" ("+p.type+")":""); var ctrl=makeControl(p); f.appendChild(lab); f.appendChild(ctrl); if(p.description){ var h=document.createElement("div"); h.className="field__hint"; h.textContent=p.description; f.appendChild(h); } controls[k]=ctrl; detail.appendChild(f); }); var actions=document.createElement("div"); actions.className="tool__actions"; var run=document.createElement("button"); run.className="btn primary-action"; run.textContent="Run"; run.addEventListener("click", function(){ if(hasWidget){ loadWidget(t.name, collect(props,controls), hasWidget); return; } var args=collect(props,controls); run.disabled=true; var o=run.textContent; run.textContent="Running…"; rpc("tools/call",{name:t.name,arguments:args}).then(function(j){ showResult(j&&j.result!==undefined?j.result:(j&&j.error!==undefined?j.error:j)); }).catch(function(){}).then(function(){ run.disabled=false; run.textContent=o; }); }); actions.appendChild(run); detail.appendChild(actions); }',
258
- 'function renderTools(tools){ var ul=document.getElementById("tool-list"); ul.innerHTML=""; tools.forEach(function(t){ var li=document.createElement("li"); li.className="tool"; var head=document.createElement("button"); head.type="button"; head.className="tool__head"; head.setAttribute("aria-expanded","false"); var nm=document.createElement("span"); nm.className="tool__name"; nm.textContent=t.name; head.appendChild(nm); var hasWidget=t._meta&&t._meta.ui&&t._meta.ui.resourceUri; if(hasWidget){ var b=document.createElement("span"); b.className="tag"; b.textContent="widget"; head.appendChild(b); } var chev=document.createElement("span"); chev.className="chev"; chev.textContent="▸"; head.appendChild(chev); var detail=document.createElement("div"); detail.className="tool__detail"; head.addEventListener("click", function(){ var open=li.classList.toggle("open"); head.setAttribute("aria-expanded",open?"true":"false"); chev.textContent=open?"▾":"▸"; if(open&&!detail.dataset.built){ buildDetail(detail,t,hasWidget); detail.dataset.built="1"; } }); li.appendChild(head); li.appendChild(detail); ul.appendChild(li); }); }',
297
+ 'function renderTools(tools){ var ul=document.getElementById("tool-list"); ul.innerHTML=""; currentToolsByName={}; tools.forEach(function(t){ currentToolsByName[t.name]=t; var li=document.createElement("li"); li.className="tool"; var head=document.createElement("button"); head.type="button"; head.className="tool__head"; head.setAttribute("aria-expanded","false"); var nm=document.createElement("span"); nm.className="tool__name"; nm.textContent=t.name; head.appendChild(nm); var hasWidget=t._meta&&t._meta.ui&&t._meta.ui.resourceUri; if(hasWidget){ var b=document.createElement("span"); b.className="tag"; b.textContent="widget"; head.appendChild(b); } var chev=document.createElement("span"); chev.className="chev"; chev.textContent="▸"; head.appendChild(chev); var detail=document.createElement("div"); detail.className="tool__detail"; head.addEventListener("click", function(){ var open=li.classList.toggle("open"); head.setAttribute("aria-expanded",open?"true":"false"); chev.textContent=open?"▾":"▸"; if(open&&!detail.dataset.built){ buildDetail(detail,t,hasWidget); detail.dataset.built="1"; } }); li.appendChild(head); li.appendChild(detail); ul.appendChild(li); }); }',
259
298
  'function refreshTools(){ return rpc("tools/list",{}).then(function(j){ renderTools((j.result&&j.result.tools)||[]); }); }',
260
299
  'refreshTools();',
261
300
  // MCP call log (expandable: input + output JSON).
262
301
  'function section(label,value){ var w=document.createElement("div"); var h=document.createElement("div"); h.className="log__label"; h.textContent=label; var pre=document.createElement("pre"); renderJson(pre,value); w.appendChild(h); w.appendChild(pre); return w; }',
263
302
  'function addLog(e){ var ol=document.getElementById("log-list"); var li=document.createElement("li"); li.className="log log--"+(e.status==="error"?"error":"ok"); var has=(e.request!==undefined||e.response!==undefined); var head=document.createElement(has?"button":"div"); if(has){ head.type="button"; head.setAttribute("aria-expanded","false"); } head.className="log__head"; var chev=document.createElement("span"); chev.className="chev"; chev.textContent=has?"▸":""; var m=document.createElement("span"); m.className="m "+e.status; m.textContent=e.method; var n=document.createElement("span"); n.className="log__sum"; n.textContent=(e.name?e.name+" ":"")+e.summary; var d=document.createElement("span"); d.className="d"; d.textContent=e.durationMs+"ms"; head.appendChild(chev); head.appendChild(m); head.appendChild(n); head.appendChild(d); var detail=document.createElement("div"); detail.className="log__detail"; if(has){ head.addEventListener("click", function(){ var open=li.classList.toggle("open"); head.setAttribute("aria-expanded",open?"true":"false"); chev.textContent=open?"▾":"▸"; if(open&&!detail.dataset.built){ if(e.request!==undefined) detail.appendChild(section("input",e.request)); if(e.response!==undefined) detail.appendChild(section("output",e.response)); detail.dataset.built="1"; } }); } li.appendChild(head); li.appendChild(detail); ol.insertBefore(li, ol.firstChild); }',
264
303
  'try{ var es=new EventSource("/rpc/log"); es.onmessage=function(ev){ try{ addLog(JSON.parse(ev.data)); }catch(e){} }; }catch(e){}',
265
- 'try{ var rs=new EventSource("/reload"); rs.onmessage=function(){ refreshTools(); if(current) loadWidget(current, currentArgs, currentResourceUri); }; }catch(e){}',
304
+ 'try{ var rs=new EventSource("/reload"); rs.onmessage=function(ev){ if(ev.data==="hard"){window.location.reload();return;} refreshTools(); if(current) loadWidget(current, currentArgs, currentResourceUri); }; }catch(e){}',
266
305
  // Preview | Chat | Design mode toggle.
267
306
  'var previewView=document.getElementById("preview-view"); var chatView=document.getElementById("chat-view"); var designView=document.getElementById("design-view");',
268
307
  'var modePreview=document.getElementById("mode-preview"); var modeChat=document.getElementById("mode-chat"); var modeDesign=document.getElementById("mode-design");',
269
- 'if(window.NoodleDesignUI) window.NoodleDesignUI.configure({frame:frame,getContext:function(){ if(!current) return null; var height=640; try{height=frame.contentWindow.innerHeight||frame.getBoundingClientRect().height||640;}catch(e){} return {toolName:current,resourceUri:currentResourceUri,width:Number(widthInput.value)||820,height:Math.round(height),device:currentDevice,theme:currentTheme}; }});',
270
- 'function setMode(m){ var p=m==="preview"; var c=m==="chat"; var d=m==="design"; var wasDesign=modeDesign.classList.contains("is-active"); document.body.classList.toggle("design-mode",d); if(d) document.body.classList.remove("activity-open"); modePreview.classList.toggle("is-active",p); modeChat.classList.toggle("is-active",c); modeDesign.classList.toggle("is-active",d); modePreview.setAttribute("aria-selected",p?"true":"false"); modeChat.setAttribute("aria-selected",c?"true":"false"); modeDesign.setAttribute("aria-selected",d?"true":"false"); previewView.style.display=p?"flex":"none"; chatView.style.display=c?"flex":"none"; designView.style.display=d?"flex":"none"; if(wasDesign&&!d&&window.NoodleDesignUI) window.NoodleDesignUI.leave(); if(d&&window.NoodleDesignUI) window.NoodleDesignUI.enter(); if(c) enterChat(); }',
308
+ 'if(!SECURE_WIDGETS&&window.NoodleDesignUI) window.NoodleDesignUI.configure({frame:frame,getContext:function(){ if(!current) return null; var height=640; try{height=frame.contentWindow.innerHeight||frame.getBoundingClientRect().height||640;}catch(e){} return {toolName:current,resourceUri:currentResourceUri,width:Number(widthInput.value)||820,height:Math.round(height),device:currentDevice,theme:currentTheme}; }});',
309
+ 'function setMode(m){ if(SECURE_WIDGETS&&m==="design") m="preview"; var p=m==="preview"; var c=m==="chat"; var d=m==="design"; var wasDesign=modeDesign.classList.contains("is-active"); document.body.classList.toggle("design-mode",d); if(d) document.body.classList.remove("activity-open"); modePreview.classList.toggle("is-active",p); modeChat.classList.toggle("is-active",c); modeDesign.classList.toggle("is-active",d); modePreview.setAttribute("aria-selected",p?"true":"false"); modeChat.setAttribute("aria-selected",c?"true":"false"); modeDesign.setAttribute("aria-selected",d?"true":"false"); previewView.style.display=p?"flex":"none"; chatView.style.display=c?"flex":"none"; designView.style.display=d?"flex":"none"; if(wasDesign&&!d&&window.NoodleDesignUI) window.NoodleDesignUI.leave(); if(d&&window.NoodleDesignUI) window.NoodleDesignUI.enter(); if(c) enterChat(); }',
271
310
  'modePreview.addEventListener("click", function(){ setMode("preview"); });',
272
311
  'modeChat.addEventListener("click", function(){ setMode("chat"); });',
273
312
  'modeDesign.addEventListener("click", function(){ setMode("design"); });',
@@ -280,11 +319,11 @@ const HARNESS_CLIENT_JS = [
280
319
  'var providerInfo={openai:{label:"OpenAI"},anthropic:{label:"Claude"},gemini:{label:"Gemini"}};',
281
320
  'function activeProvider(){ if(chatRequiresKey) return {hasKey:false,source:"none",model:""}; return chatProviders[chatProvider]||{hasKey:false,source:"none",model:""}; }',
282
321
  'function paintKeyGate(){ var s=activeProvider(); chatKeyInput.placeholder=s.hasKey?"Paste a different API key":"Paste your API key"; chatConnect.textContent=s.hasKey?"Use connected key":"Start chatting"; chatGateHint.className="chat-gate__hint"+(chatRequiresKey?" err":""); chatGateHint.textContent=chatRequiresKey?chatStatusMessage:(s.hasKey?"A "+providerInfo[chatProvider].label+" key is connected. Paste another key to switch models.":"Your key stays in this local process."); }',
283
- 'function refreshChatReady(cb){ fetch("/chat/status").then(function(r){return r.json();}).then(function(j){ chatProviders=(j&&j.providers)||{}; chatRequiresKey=Boolean(j&&j.requiresKey); chatStatusMessage=(j&&j.error&&j.error.message)||""; if(j&&j.activeProvider) chatProvider=j.activeProvider; paintKeyGate(); if(cb) cb(); }).catch(function(){ if(cb) cb(); }); }',
322
+ 'function refreshChatReady(cb){ fetch("/chat/status",{headers:hostHeaders(false)}).then(function(r){return r.json();}).then(function(j){ chatProviders=(j&&j.providers)||{}; chatRequiresKey=Boolean(j&&j.requiresKey); chatStatusMessage=(j&&j.error&&j.error.message)||""; if(j&&j.activeProvider) chatProvider=j.activeProvider; paintKeyGate(); if(cb) cb(); }).catch(function(){ if(cb) cb(); }); }',
284
323
  'function renderGate(){ var s=activeProvider(); if(s.hasKey){ chatGate.style.display="none"; chatBody.style.display="flex"; chatKeybar.className="on"; chatModelLabel.textContent=providerInfo[chatProvider].label; chatInput.focus(); } else { chatBody.style.display="none"; chatGate.style.display="flex"; paintKeyGate(); chatKeyInput.focus(); } }',
285
324
  'function enterChat(){ refreshChatReady(renderGate); }',
286
325
  'function showKeyError(msg){ chatGateHint.textContent=msg; chatGateHint.className="chat-gate__hint err"; chatBody.style.display="none"; chatGate.style.display="flex"; chatKeyInput.focus(); }',
287
- 'chatKeyForm.addEventListener("submit", function(e){ e.preventDefault(); var key=chatKeyInput.value.trim(); var s=activeProvider(); if(!key&&!s.hasKey) return; var payload=key?{key:key}:{provider:chatProvider}; fetch("/chat/key",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(payload)}).then(function(r){return r.json();}).then(function(j){ chatKeyInput.value=""; if(j&&j.ok){ var nextProvider=j.provider||chatProvider; if(nextProvider!==chatProvider) chatMessages=[]; chatProvider=nextProvider; chatRequiresKey=false; chatStatusMessage=""; chatProviders[chatProvider]=j; renderGate(); } else { showKeyError((j&&j.error&&j.error.message)||"Could not connect this key. Check it and try again."); } }).catch(function(){ showKeyError("Could not reach the devtools server."); }); });',
326
+ 'chatKeyForm.addEventListener("submit", function(e){ e.preventDefault(); var key=chatKeyInput.value.trim(); var s=activeProvider(); if(!key&&!s.hasKey) return; var payload=key?{key:key}:{provider:chatProvider}; fetch("/chat/key",{method:"POST",headers:hostHeaders(true),body:JSON.stringify(payload)}).then(function(r){return r.json();}).then(function(j){ chatKeyInput.value=""; if(j&&j.ok){ var nextProvider=j.provider||chatProvider; if(nextProvider!==chatProvider) chatMessages=[]; chatProvider=nextProvider; chatRequiresKey=false; chatStatusMessage=""; chatProviders[chatProvider]=j; renderGate(); } else { showKeyError((j&&j.error&&j.error.message)||"Could not connect this key. Check it and try again."); } }).catch(function(){ showKeyError("Could not reach the devtools server."); }); });',
288
327
  'chatReset.addEventListener("click", function(){ chatBody.style.display="none"; chatGate.style.display="flex"; paintKeyGate(); chatKeyInput.focus(); });',
289
328
  'function scrollChat(){ chatLog.scrollTop=chatLog.scrollHeight; }',
290
329
  'function clearChatEmpty(){ if(chatEmpty){ chatEmpty.remove(); chatEmpty=null; } }',
@@ -296,8 +335,8 @@ const HARNESS_CLIENT_JS = [
296
335
  // Tool call: a minimal card, collapsed by default; its I/O is separate from the widget below it.
297
336
  'function renderToolCall(tc){ clearChatEmpty(); var card=document.createElement("div"); card.className="toolcall"; var head=document.createElement("button"); head.type="button"; head.className="toolcall__head"; head.setAttribute("aria-expanded","false"); var ico=document.createElement("span"); ico.className="toolcall__ico"; ico.innerHTML=TOOL_ICO; var nm=document.createElement("span"); nm.className="toolcall__name"+(tc.isError?" error":""); nm.textContent=tc.name; head.appendChild(ico); head.appendChild(nm); if(tc.resourceUri){ var tag=document.createElement("span"); tag.className="tag"; tag.textContent="widget"; head.appendChild(tag); } var chev=document.createElement("span"); chev.className="toolcall__chev"; chev.textContent="▸"; head.appendChild(chev); var detail=document.createElement("div"); detail.className="toolcall__detail"; detail.appendChild(section("input",tc.arguments)); detail.appendChild(section("output",tc.result)); head.addEventListener("click", function(){ var open=card.classList.toggle("open"); head.setAttribute("aria-expanded",open?"true":"false"); chev.textContent=open?"▾":"▸"; if(open) setTimeout(function(){ try{ card.scrollIntoView({block:"nearest"}); }catch(e){} },0); }); card.appendChild(head); card.appendChild(detail); chatLog.appendChild(card); scrollChat(); }',
298
337
  // Widget: rendered inline in the conversation, unboxed.
299
- 'function renderWidget(tc){ if(!tc.resourceUri) return; clearChatEmpty(); var wrap=document.createElement("div"); wrap.className="chat-widget"; var sk=document.createElement("div"); sk.className="chat-skeleton"; wrap.appendChild(sk); var f=document.createElement("iframe"); f.title="widget"; wireChatFrame(f, function(){ if(sk&&sk.parentNode) sk.remove(); }); var q="/widget?name="+encodeURIComponent(tc.name); if(tc.arguments&&Object.keys(tc.arguments).length) q+="&args="+encodeURIComponent(JSON.stringify(tc.arguments)); f.src=q; wrap.appendChild(f); chatLog.appendChild(wrap); scrollChat(); }',
300
- 'function sendChat(){ var text=chatInput.value.trim(); if(!text||chatBusy) return; chatBubble("msg--user",text); chatInput.value=""; chatInput.style.height="auto"; chatBusy=true; chatSend.disabled=true; var pending=chatBubble("msg--pending","Thinking..."); var outgoing=chatMessages.concat([{role:"user",content:text}]); fetch("/chat",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({provider:chatProvider,messages:outgoing})}).then(function(r){return r.json();}).then(function(j){ pending.remove(); if(j&&j.error){ if(j.error.code==="no_api_key"||j.error.code==="ambiguous_provider"){ showKeyError(j.error.message||"Connect an API key to start chatting."); return; } chatBubble("msg--error","Chat failed: "+(j.error.message||"unknown error")); return; } chatMessages=(j&&j.messages)||outgoing; (j&&j.toolCalls||[]).forEach(function(tc){ renderToolCall(tc); renderWidget(tc); }); if(j&&j.text) chatBubble("msg--assistant",j.text); }).catch(function(e){ pending.remove(); chatBubble("msg--error","Chat failed: "+(e&&e.message||e)); }).then(function(){ chatBusy=false; chatSend.disabled=false; scrollChat(); }); }',
338
+ 'function renderWidget(tc){ if(!tc.resourceUri) return; clearChatEmpty(); var wrap=document.createElement("div"); wrap.className="chat-widget"; var sk=document.createElement("div"); sk.className="chat-skeleton"; wrap.appendChild(sk); var f=document.createElement("iframe"); f.title="widget"; if(SECURE_WIDGETS) f.setAttribute("sandbox","allow-scripts allow-popups"); wireChatFrame(f, function(){ if(sk&&sk.parentNode) sk.remove(); }); var q="/widget?name="+encodeURIComponent(tc.name); if(tc.arguments&&Object.keys(tc.arguments).length) q+="&args="+encodeURIComponent(JSON.stringify(tc.arguments)); setWidgetDocument(f,q); wrap.appendChild(f); chatLog.appendChild(wrap); scrollChat(); }',
339
+ 'function sendChat(){ var text=chatInput.value.trim(); if(!text||chatBusy) return; chatBubble("msg--user",text); chatInput.value=""; chatInput.style.height="auto"; chatBusy=true; chatSend.disabled=true; var pending=chatBubble("msg--pending","Thinking..."); var outgoing=chatMessages.concat([{role:"user",content:text}]); fetch("/chat",{method:"POST",headers:hostHeaders(true),body:JSON.stringify({provider:chatProvider,messages:outgoing})}).then(function(r){return r.json();}).then(function(j){ pending.remove(); if(j&&j.error){ if(j.error.code==="no_api_key"||j.error.code==="ambiguous_provider"){ showKeyError(j.error.message||"Connect an API key to start chatting."); return; } chatBubble("msg--error","Chat failed: "+(j.error.message||"unknown error")); return; } chatMessages=(j&&j.messages)||outgoing; (j&&j.toolCalls||[]).forEach(function(tc){ renderToolCall(tc); renderWidget(tc); }); if(j&&j.text) chatBubble("msg--assistant",j.text); }).catch(function(e){ pending.remove(); chatBubble("msg--error","Chat failed: "+(e&&e.message||e)); }).then(function(){ chatBusy=false; chatSend.disabled=false; scrollChat(); }); }',
301
340
  'chatForm.addEventListener("submit", function(e){ e.preventDefault(); sendChat(); });',
302
341
  'chatInput.addEventListener("keydown", function(e){ if(e.key==="Enter"&&!e.shiftKey){ e.preventDefault(); sendChat(); } });',
303
342
  'chatInput.addEventListener("input", function(){ chatInput.style.height="auto"; chatInput.style.height=Math.min(160, chatInput.scrollHeight)+"px"; });',
@@ -1 +1 @@
1
- {"version":3,"file":"devtools-harness.js","sourceRoot":"","sources":["../src/devtools-harness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devtools-harness.js","sourceRoot":"","sources":["../src/devtools-harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type McpOAuthClientRegistration, type McpOAuthDiscovery, type McpOAuthPendingAuthorization, type McpOAuthTokens } from '@noodle-borg/auth';
2
+ export { MicrosoftDevtoolsAuthError } from './devtools-microsoft-errors.js';
3
+ export interface DevtoolsMicrosoftAuthConfig {
4
+ readonly kind: 'microsoft';
5
+ readonly tenantId: string;
6
+ readonly clientId: string;
7
+ /** Resolved only inside the loopback Node host; never serialized to the browser. */
8
+ readonly clientSecret: string;
9
+ readonly authorizeUrl?: string;
10
+ readonly tokenUrl?: string;
11
+ readonly scopes?: readonly string[];
12
+ readonly authMethod?: 'client_secret_basic' | 'client_secret_post';
13
+ /** Opaque local-only revision used to clear credentials when auth configuration changes. */
14
+ readonly configurationKey?: string;
15
+ /** Test/self-host seam. Production authorization endpoints must use HTTPS. */
16
+ readonly allowInsecureLocalhost?: boolean;
17
+ }
18
+ /**
19
+ * Confidential Microsoft authorization-code client for the loopback Devtools host. The Graph access
20
+ * token and client secret never cross into the browser; the ID token is retained as the local MCP bearer
21
+ * and is independently signature/issuer/audience verified by the loopback service before tool access.
22
+ */
23
+ export declare class MicrosoftDevtoolsAuthDriver {
24
+ #private;
25
+ constructor(options: {
26
+ readonly auth: DevtoolsMicrosoftAuthConfig;
27
+ readonly resource: string;
28
+ readonly redirectUri: string;
29
+ readonly fetchFn?: typeof fetch;
30
+ readonly now?: () => number;
31
+ readonly stateFactory?: () => string;
32
+ readonly codeVerifierFactory?: () => string;
33
+ readonly nonceFactory?: () => string;
34
+ });
35
+ discover(): Promise<McpOAuthDiscovery>;
36
+ register(discovery: McpOAuthDiscovery, _scopes?: readonly string[]): Promise<McpOAuthClientRegistration>;
37
+ beginAuthorization(discovery: McpOAuthDiscovery, registration: McpOAuthClientRegistration, scopes?: readonly string[]): McpOAuthPendingAuthorization;
38
+ exchangeCallback(discovery: McpOAuthDiscovery, registration: McpOAuthClientRegistration, pending: McpOAuthPendingAuthorization, callbackUrl: string): Promise<McpOAuthTokens>;
39
+ refresh(discoveryOrCurrent: McpOAuthDiscovery | McpOAuthTokens, registration?: McpOAuthClientRegistration, currentMaybe?: McpOAuthTokens): Promise<McpOAuthTokens>;
40
+ }
41
+ export declare function microsoftIssuer(tenantId: string): string;
42
+ //# sourceMappingURL=devtools-microsoft-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtools-microsoft-auth.d.ts","sourceRoot":"","sources":["../src/devtools-microsoft-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,4BAA4B,EACjC,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAO5E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAAC;IACnE,4FAA4F;IAC5F,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,8EAA8E;IAC9E,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC3C;AAMD;;;;GAIG;AACH,qBAAa,2BAA2B;;gBAc1B,OAAO,EAAE;QACnB,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;QAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;QAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;QAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;QACrC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,MAAM,CAAC;QAC5C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;KACtC;IAuBK,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAatC,QAAQ,CACZ,SAAS,EAAE,iBAAiB,EAC5B,OAAO,GAAE,SAAS,MAAM,EAAqB,GAC5C,OAAO,CAAC,0BAA0B,CAAC;IAOtC,kBAAkB,CAChB,SAAS,EAAE,iBAAiB,EAC5B,YAAY,EAAE,0BAA0B,EACxC,MAAM,GAAE,SAAS,MAAM,EAAqB,GAC3C,4BAA4B;IAiCzB,gBAAgB,CACpB,SAAS,EAAE,iBAAiB,EAC5B,YAAY,EAAE,0BAA0B,EACxC,OAAO,EAAE,4BAA4B,EACrC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC;IA6BpB,OAAO,CACX,kBAAkB,EAAE,iBAAiB,GAAG,cAAc,EACtD,YAAY,CAAC,EAAE,0BAA0B,EACzC,YAAY,CAAC,EAAE,cAAc,GAC5B,OAAO,CAAC,cAAc,CAAC;CAsH3B;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD"}