@aceshooting/lyra-ui 18.4.0 → 19.0.1
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.
- package/CHANGELOG.md +26 -0
- package/custom-elements.json +1 -1
- package/dist/cli/migration-contract.json +1 -1
- package/dist/components/agent-tools/mcp-app/mcp-app.class.d.ts +6 -2
- package/dist/components/agent-tools/mcp-app/mcp-app.class.js +1 -1
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +1 -1
- package/dist/components/charts/chart/chart.class.d.ts +12 -3
- package/dist/components/charts/chart/chart.class.js +2 -2
- package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +2 -2
- package/dist/components/conversation/agent-workspace/agent-workspace.class.js +3 -3
- package/dist/components/conversation/checkpoint/checkpoint.class.js +1 -1
- package/dist/components/data/table/table.class.d.ts +2 -1
- package/dist/components/data/table/table.class.js +1 -1
- package/dist/components/forms/combobox/combobox.class.d.ts +2 -2
- package/dist/components/forms/combobox/combobox.class.js +3 -2
- package/dist/components/forms/combobox/combobox.styles.js +1 -1
- package/dist/components/forms/date-picker/calendar-core.js +1 -1
- package/dist/components/forms/icon-button/icon-button.class.js +1 -1
- package/dist/components/forms/select/select.class.d.ts +2 -2
- package/dist/components/forms/select/select.class.js +4 -2
- package/dist/components/forms/select/select.styles.js +1 -1
- package/dist/components/media/drop-zone/drop-zone.class.js +2 -2
- package/dist/components/media/file-input/file-input.class.d.ts +6 -5
- package/dist/components/media/file-input/file-input.class.js +1 -1
- package/dist/components/media/image-viewer/image-viewer.class.d.ts +2 -2
- package/dist/components/media/lightbox/lightbox.class.d.ts +1 -1
- package/dist/components/media/pan-zoom/pan-zoom.class.d.ts +1 -1
- package/dist/components/media/pan-zoom/pan-zoom.d.ts +1 -1
- package/dist/components/overlays/dialog/dialog.class.d.ts +12 -6
- package/dist/components/overlays/dialog/dialog.class.js +3 -6
- package/dist/components/retrieval/retrieval-search/retrieval-search.class.d.ts +3 -4
- package/dist/components/retrieval/retrieval-search/retrieval-search.class.js +2 -2
- package/dist/components/utility/copy-button/copy-button.class.d.ts +9 -6
- package/dist/components/utility/copy-button/copy-button.class.js +1 -1
- package/dist/components/utility/icon/icon.class.d.ts +3 -2
- package/dist/components/utility/icon/icon.class.js +1 -1
- package/dist/internal/accessibility-visibility.js +1 -1
- package/dist/internal/overlay-stack.js +1 -1
- package/dist/internal/package-metadata.d.ts +1 -1
- package/dist/internal/package-metadata.js +1 -1
- package/dist/internal/safe-svg.d.ts +15 -11
- package/dist/internal/safe-svg.js +1 -1
- package/llms/components/lr-agent-workspace.md +2 -2
- package/llms/components/lr-chart.md +13 -6
- package/llms/components/lr-copy-button.md +6 -6
- package/llms/components/lr-dialog.md +5 -3
- package/llms/components/lr-file-input.md +3 -2
- package/llms/components/lr-mcp-app.md +5 -0
- package/llms/components/lr-retrieval-search.md +2 -2
- package/llms-full.txt +37 -21
- package/package.json +2 -2
- package/vscode-html-data.json +1 -1
- package/web-types.json +1 -1
|
@@ -16,7 +16,9 @@ frameGeneration:number;}export type McpAppToolResultOptions={frameGeneration:num
|
|
|
16
16
|
* comments or script strings cannot redirect policy insertion away from the parsed document head.
|
|
17
17
|
* Remote resources accept only relative and HTTP(S) document URLs and never send a referrer.
|
|
18
18
|
* The frame can request tools, messages, links, logs, and resizing only through typed events;
|
|
19
|
-
* the component never performs those external actions itself.
|
|
19
|
+
* the component never performs those external actions itself. The initial host context transfers
|
|
20
|
+
* a document-bound message port and nonce; later host messages stay on that port, and a navigation
|
|
21
|
+
* invalidates both before the iframe is remounted.
|
|
20
22
|
* Resource records and nested CSP/metadata collections are bounded clone-owned readonly
|
|
21
23
|
* snapshots. Create and reassign a new resource record after changes.
|
|
22
24
|
*
|
|
@@ -45,7 +47,9 @@ resource:McpAppResource|null;height:number;maxHeight:number;
|
|
|
45
47
|
label:string;
|
|
46
48
|
/** Programmatic iframe title when no authored host `aria-label` attribute is present. An empty
|
|
47
49
|
* value cannot leave the executable frame unnamed. */
|
|
48
|
-
accessibleLabel:string|null;private loaded;private frameHeight;private frameGeneration;private frame?;private loadingAnnouncementSink?;private errorAnnouncementSink?;private suppressNextResourceAnnouncement;private messageWindow?;
|
|
50
|
+
accessibleLabel:string|null;private loaded;private frameHeight;private frameGeneration;private frame?;private loadingAnnouncementSink?;private errorAnnouncementSink?;private suppressNextResourceAnnouncement;private messageWindow?;
|
|
51
|
+
/** Secret bound to the currently loaded document. It never crosses a navigation. */
|
|
52
|
+
private frameNonce?;private framePort?;private bootstrapPort?;private resourceAvailable;private invalidateFrame;private closeFramePort;private syncAnnouncementSinks;connectedCallback():void;disconnectedCallback():void;adoptedCallback():void;private bindMessageWindow;private unbindMessageWindow;protected willUpdate(changed:PropertyValues):void;protected updated(_changed:PropertyValues<this>):void;private expectedOrigin;private createFrameNonce;private onLoad;private onMessage;private onPortMessage;private handleMessage;private post;postHostContext(context:unknown):void;
|
|
49
53
|
/** Resolves a prior `lr-mcp-tool-call`. The required frame generation binds the asynchronous
|
|
50
54
|
* reply to the frame that requested it; stale, uncorrelated, and ambiguous replies fail closed. */
|
|
51
55
|
postToolResult(requestId:string,options:McpAppToolResultOptions):void;render():TemplateResult;}declare global{interface HTMLElementTagNameMap{'lr-mcp-app':LyraMcpApp;}}export{};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{keyed}from"lit/directives/keyed.js";import{finiteRange}from"../../../internal/numbers.js";import{LyraElement}from"../../../internal/lyra-element.js";import{safeFrameSrc,safeLinkHref}from"../../../internal/safe-url.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{styles}from"./mcp-app.styles.js";import{purposeAccessibleLabel}from"../semantic-owner.js";import{LYRA_DEFAULT_mcpAppLabel,LYRA_DEFAULT_mcpAppLoading,LYRA_DEFAULT_mcpAppUnavailable}from"../../../internal/default-strings.generated.js";function record(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:null}function resolveResource(resource){const value=record(resource);if(!value||typeof value.uri!="string")return null;const uri=value.uri.trim();if(!uri)return null;const ownsHtml=Object.prototype.hasOwnProperty.call(value,"html"),ownsSrc=Object.prototype.hasOwnProperty.call(value,"src");if(ownsHtml===ownsSrc)return null;if(ownsHtml)return typeof value.html!="string"||value.html.length===0?null:{resource,uri,html:value.html};const src=safeFrameSrc(value.src);return src?{resource,uri,src}:null}function cspSources(values){return(values??[]).flatMap(value=>{try{const url=new URL(value);return url.protocol==="https:"||url.protocol==="http:"?[url.origin]:[]}catch{return[]}})}function buildCsp(csp){const resources=cspSources(csp?.resourceDomains),connections=cspSources(csp?.connectDomains),frames=cspSources(csp?.frameDomains);return["default-src 'none'","script-src 'unsafe-inline'","style-src 'unsafe-inline'",`img-src data: blob: ${resources.join(" ")}`.trim(),`font-src data: ${resources.join(" ")}`.trim(),`media-src data: blob: ${resources.join(" ")}`.trim(),`connect-src ${connections.length?connections.join(" "):"'none'"}`,`frame-src ${frames.length?frames.join(" "):"'none'"}`,"base-uri 'none'","form-action 'none'"].join("; ")}function withCsp(htmlSource,csp){return`${`<meta http-equiv="Content-Security-Policy" content="${buildCsp(csp)}">`}${htmlSource}`}function permissionPolicy(permissions){return[permissions?.camera?"camera":"",permissions?.microphone?"microphone":"",permissions?.geolocation?"geolocation":"",permissions?.clipboardRead?"clipboard-read":"",permissions?.clipboardWrite?"clipboard-write":""].filter(Boolean).map(permission=>`${permission} *`).join("; ")}class LyraMcpApp extends LyraElement{constructor(){super(...arguments),this.resource=null,this.height=320,this.maxHeight=800,this.label="",this.accessibleLabel=null,this.loaded=!1,this.frameHeight=320,this.frameGeneration=0,this.suppressNextResourceAnnouncement=!0,this.onMessage=event=>{if(event.currentTarget!==this.messageWindow||!this.frame?.contentWindow||event.source!==this.frame.contentWindow)return;const expectedOrigin=this.expectedOrigin();if(expectedOrigin&&event.origin!==expectedOrigin)return;const message=record(event.data);if(!(message?.channel!=="lyra-mcp-app"||message.version!==1||typeof message.type!="string"))switch(message.type){case"resize":{const requested=typeof message.height=="number"?message.height:this.height,height=finiteRange(requested,this.height,120,finiteRange(this.maxHeight,800,120,1e4));this.frameHeight=height,this.emit("lr-mcp-resize",{height});break}case"tool-call":typeof message.name=="string"&&this.emit("lr-mcp-tool-call",{requestId:typeof message.requestId=="string"?message.requestId:void 0,name:message.name,args:message.args,frameGeneration:this.frameGeneration});break;case"send-message":this.emit("lr-mcp-send-message",{message:message.message});break;case"open-link":{const href=safeLinkHref(message.href);href&&this.emit("lr-mcp-open-link",{href})}break;case"log":this.emit("lr-mcp-log",{level:typeof message.level=="string"?message.level:"info",value:message.value});break}}}static{this.defaultStrings={...super.defaultStrings,mcpAppLabel:LYRA_DEFAULT_mcpAppLabel,mcpAppLoading:LYRA_DEFAULT_mcpAppLoading,mcpAppUnavailable:LYRA_DEFAULT_mcpAppUnavailable}}static{this.ownedCollectionProperties=Object.freeze(["resource"])}static{this.styles=[LyraElement.styles,styles]}resourceAvailable(resource){return resolveResource(resource)!==null}invalidateFrame(){this.loaded=!1,this.frameGeneration++,this.requestUpdate()}syncAnnouncementSinks(){!this.isConnected||this.loadingAnnouncementSink?.element.ownerDocument===this.ownerDocument&&this.errorAnnouncementSink?.element.ownerDocument===this.ownerDocument||(this.loadingAnnouncementSink?.release(),this.errorAnnouncementSink?.release(),this.loadingAnnouncementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}),this.errorAnnouncementSink=acquireAnnouncementSink("assertive",{document:this.ownerDocument,source:this}))}connectedCallback(){super.connectedCallback(),this.syncAnnouncementSinks(),this.hasUpdated&&(this.suppressNextResourceAnnouncement=!0,this.requestUpdate()),this.bindMessageWindow()}disconnectedCallback(){this.unbindMessageWindow(),this.invalidateFrame(),this.loadingAnnouncementSink?.release(),this.errorAnnouncementSink?.release(),this.loadingAnnouncementSink=void 0,this.errorAnnouncementSink=void 0,this.suppressNextResourceAnnouncement=!0,super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.invalidateFrame(),this.syncAnnouncementSinks(),this.bindMessageWindow()}bindMessageWindow(){const nextWindow=this.isConnected?this.ownerDocument.defaultView:null;this.messageWindow!==nextWindow&&(this.unbindMessageWindow(),this.messageWindow=nextWindow??void 0,this.messageWindow?.addEventListener("message",this.onMessage))}unbindMessageWindow(){this.messageWindow?.removeEventListener("message",this.onMessage),this.messageWindow=void 0}willUpdate(changed){if(super.willUpdate(changed),changed.has("resource")){if(this.hasUpdated&&!this.suppressNextResourceAnnouncement){const wasAvailable=this.resourceAvailable(changed.get("resource"));this.resourceAvailable(this.resource)?this.loadingAnnouncementSink?.announce(this.localize("mcpAppLoading")):wasAvailable&&this.errorAnnouncementSink?.announce(this.localize("mcpAppUnavailable"))}this.loaded=!1,this.frameGeneration++}(changed.has("resource")||changed.has("height")||changed.has("maxHeight"))&&(this.frameHeight=finiteRange(this.height,320,120,finiteRange(this.maxHeight,800,120,1e4)))}updated(_changed){super.updated(_changed),this.suppressNextResourceAnnouncement=!1}expectedOrigin(){return resolveResource(this.resource)?"null":null}onLoad(event,frameGeneration,resource){if(!this.isConnected||frameGeneration!==this.frameGeneration||event.currentTarget!==this.frame)return;const currentResource=resolveResource(this.resource);!currentResource||currentResource.resource!==resource.resource||(this.loaded=!0,this.emit("lr-mcp-ready",{uri:resource.uri}),this.postHostContext({resource:{uri:resource.uri,metadata:resource.resource.metadata},locale:this.effectiveLocale,direction:this.effectiveDirection}))}post(message){const target=this.frame?.contentWindow;target&&target.postMessage(message,"*")}postHostContext(context){this.post({channel:"lyra-mcp-app",version:1,type:"host-context",context})}postToolResult(requestId,options){const value=record(options);if(typeof requestId!="string"||!requestId.trim()||!value)return;const frameGeneration=value.frameGeneration;if(typeof frameGeneration!="number"||!Number.isSafeInteger(frameGeneration)||frameGeneration!==this.frameGeneration)return;const hasResult=Object.prototype.hasOwnProperty.call(value,"result"),hasError=Object.prototype.hasOwnProperty.call(value,"error");hasResult!==hasError&&(hasError&&(typeof value.error!="string"||!value.error.trim())||this.post({channel:"lyra-mcp-app",version:1,type:"tool-result",requestId,...hasResult?{result:value.result}:{},...hasError?{error:value.error}:{}}))}render(){const resource=resolveResource(this.resource);if(!resource)return html`<div part="base"><p part="error">${this.localize("mcpAppUnavailable")}</p></div>`;const fallbackLabel=(!this.hasAttribute("aria-label")&&typeof this.accessibleLabel=="string"?this.accessibleLabel:"")||this.label||resource.resource.title||this.localize("mcpAppLabel"),label=purposeAccessibleLabel(this,fallbackLabel),frameGeneration=this.frameGeneration;return html`<div part="base">
|
|
1
|
+
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,query,state}from"lit/decorators.js";import{styleMap}from"lit/directives/style-map.js";import{keyed}from"lit/directives/keyed.js";import{finiteRange}from"../../../internal/numbers.js";import{LyraElement}from"../../../internal/lyra-element.js";import{safeFrameSrc,safeLinkHref}from"../../../internal/safe-url.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{styles}from"./mcp-app.styles.js";import{purposeAccessibleLabel}from"../semantic-owner.js";import{LYRA_DEFAULT_mcpAppLabel,LYRA_DEFAULT_mcpAppLoading,LYRA_DEFAULT_mcpAppUnavailable}from"../../../internal/default-strings.generated.js";function record(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:null}function resolveResource(resource){const value=record(resource);if(!value||typeof value.uri!="string")return null;const uri=value.uri.trim();if(!uri)return null;const ownsHtml=Object.prototype.hasOwnProperty.call(value,"html"),ownsSrc=Object.prototype.hasOwnProperty.call(value,"src");if(ownsHtml===ownsSrc)return null;if(ownsHtml)return typeof value.html!="string"||value.html.length===0?null:{resource,uri,html:value.html};const src=safeFrameSrc(value.src);return src?{resource,uri,src}:null}function cspSources(values){return(values??[]).flatMap(value=>{try{const url=new URL(value);return url.protocol==="https:"||url.protocol==="http:"?[url.origin]:[]}catch{return[]}})}function buildCsp(csp){const resources=cspSources(csp?.resourceDomains),connections=cspSources(csp?.connectDomains),frames=cspSources(csp?.frameDomains);return["default-src 'none'","script-src 'unsafe-inline'","style-src 'unsafe-inline'",`img-src data: blob: ${resources.join(" ")}`.trim(),`font-src data: ${resources.join(" ")}`.trim(),`media-src data: blob: ${resources.join(" ")}`.trim(),`connect-src ${connections.length?connections.join(" "):"'none'"}`,`frame-src ${frames.length?frames.join(" "):"'none'"}`,"base-uri 'none'","form-action 'none'"].join("; ")}function withCsp(htmlSource,csp){return`${`<meta http-equiv="Content-Security-Policy" content="${buildCsp(csp)}">`}${htmlSource}`}function permissionPolicy(permissions){return[permissions?.camera?"camera":"",permissions?.microphone?"microphone":"",permissions?.geolocation?"geolocation":"",permissions?.clipboardRead?"clipboard-read":"",permissions?.clipboardWrite?"clipboard-write":""].filter(Boolean).map(permission=>`${permission} *`).join("; ")}class LyraMcpApp extends LyraElement{constructor(){super(...arguments),this.resource=null,this.height=320,this.maxHeight=800,this.label="",this.accessibleLabel=null,this.loaded=!1,this.frameHeight=320,this.frameGeneration=0,this.suppressNextResourceAnnouncement=!0,this.onMessage=event=>{if(this.framePort||event.currentTarget!==this.messageWindow||!this.frame?.contentWindow||event.source!==this.frame.contentWindow)return;const expectedOrigin=this.expectedOrigin();expectedOrigin&&event.origin!==expectedOrigin||this.handleMessage(event.data)},this.onPortMessage=event=>{this.handleMessage(event.data)}}static{this.defaultStrings={...super.defaultStrings,mcpAppLabel:LYRA_DEFAULT_mcpAppLabel,mcpAppLoading:LYRA_DEFAULT_mcpAppLoading,mcpAppUnavailable:LYRA_DEFAULT_mcpAppUnavailable}}static{this.ownedCollectionProperties=Object.freeze(["resource"])}static{this.styles=[LyraElement.styles,styles]}resourceAvailable(resource){return resolveResource(resource)!==null}invalidateFrame(){this.closeFramePort(),this.bootstrapPort?.port.close(),this.bootstrapPort=void 0,this.frameNonce=this.resourceAvailable(this.resource)?this.createFrameNonce():void 0,this.loaded=!1,this.frameGeneration++,this.requestUpdate()}closeFramePort(){this.framePort?.removeEventListener("message",this.onPortMessage),this.framePort?.close(),this.framePort=void 0}syncAnnouncementSinks(){!this.isConnected||this.loadingAnnouncementSink?.element.ownerDocument===this.ownerDocument&&this.errorAnnouncementSink?.element.ownerDocument===this.ownerDocument||(this.loadingAnnouncementSink?.release(),this.errorAnnouncementSink?.release(),this.loadingAnnouncementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}),this.errorAnnouncementSink=acquireAnnouncementSink("assertive",{document:this.ownerDocument,source:this}))}connectedCallback(){super.connectedCallback(),this.syncAnnouncementSinks(),this.hasUpdated&&(this.suppressNextResourceAnnouncement=!0,this.requestUpdate()),this.bindMessageWindow()}disconnectedCallback(){this.unbindMessageWindow(),this.invalidateFrame(),this.loadingAnnouncementSink?.release(),this.errorAnnouncementSink?.release(),this.loadingAnnouncementSink=void 0,this.errorAnnouncementSink=void 0,this.suppressNextResourceAnnouncement=!0,super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.invalidateFrame(),this.syncAnnouncementSinks(),this.bindMessageWindow()}bindMessageWindow(){const nextWindow=this.isConnected?this.ownerDocument.defaultView:null;this.messageWindow!==nextWindow&&(this.unbindMessageWindow(),this.messageWindow=nextWindow??void 0,this.messageWindow?.addEventListener("message",this.onMessage))}unbindMessageWindow(){this.messageWindow?.removeEventListener("message",this.onMessage),this.messageWindow=void 0}willUpdate(changed){if(super.willUpdate(changed),changed.has("resource")){if(this.hasUpdated&&!this.suppressNextResourceAnnouncement){const wasAvailable=this.resourceAvailable(changed.get("resource"));this.resourceAvailable(this.resource)?this.loadingAnnouncementSink?.announce(this.localize("mcpAppLoading")):wasAvailable&&this.errorAnnouncementSink?.announce(this.localize("mcpAppUnavailable"))}this.loaded=!1,this.closeFramePort(),this.bootstrapPort?.port.close(),this.bootstrapPort=void 0,this.frameNonce=this.resourceAvailable(this.resource)?this.createFrameNonce():void 0,this.frameGeneration++}(changed.has("resource")||changed.has("height")||changed.has("maxHeight"))&&(this.frameHeight=finiteRange(this.height,320,120,finiteRange(this.maxHeight,800,120,1e4)))}updated(_changed){super.updated(_changed),this.suppressNextResourceAnnouncement=!1}expectedOrigin(){return resolveResource(this.resource)?"null":null}createFrameNonce(){return crypto.randomUUID()}onLoad(event,frameGeneration,resource){if(!this.isConnected||frameGeneration!==this.frameGeneration||event.currentTarget!==this.frame)return;const currentResource=resolveResource(this.resource);if(!currentResource||currentResource.resource!==resource.resource)return;if(this.loaded){this.invalidateFrame();return}this.frameNonce??=this.createFrameNonce();const frame=event.currentTarget,port=new MessageChannel;this.framePort=port.port1,this.framePort.addEventListener("message",this.onPortMessage),this.framePort.start(),this.loaded=!0,this.bootstrapPort={frame,port:port.port2},this.postHostContext({resource:{uri:resource.uri,metadata:resource.resource.metadata},locale:this.effectiveLocale,direction:this.effectiveDirection}),this.bootstrapPort?.port.close(),this.bootstrapPort=void 0,this.emit("lr-mcp-ready",{uri:resource.uri})}handleMessage(data){const message=record(data);if(!(typeof this.frameNonce!="string"||message?.nonce!==this.frameNonce)&&!(message?.channel!=="lyra-mcp-app"||message.version!==1||typeof message.type!="string"))switch(message.type){case"resize":{const requested=typeof message.height=="number"?message.height:this.height,height=finiteRange(requested,this.height,120,finiteRange(this.maxHeight,800,120,1e4));this.frameHeight=height,this.emit("lr-mcp-resize",{height});break}case"tool-call":typeof message.name=="string"&&this.emit("lr-mcp-tool-call",{requestId:typeof message.requestId=="string"?message.requestId:void 0,name:message.name,args:message.args,frameGeneration:this.frameGeneration});break;case"send-message":this.emit("lr-mcp-send-message",{message:message.message});break;case"open-link":{const href=safeLinkHref(message.href);href&&this.emit("lr-mcp-open-link",{href})}break;case"log":this.emit("lr-mcp-log",{level:typeof message.level=="string"?message.level:"info",value:message.value});break}}post(message,frame=this.frame,transferPort){const nonce=this.frameNonce;if(typeof nonce=="string"){if(transferPort){const target=frame?.contentWindow;if(!target)return;target.postMessage({...message,nonce},"*",[transferPort]);return}this.framePort?.postMessage({...message,nonce})}}postHostContext(context){const bootstrap=this.bootstrapPort;this.bootstrapPort=void 0,this.post({channel:"lyra-mcp-app",version:1,type:"host-context",context},bootstrap?.frame,bootstrap?.port)}postToolResult(requestId,options){const value=record(options);if(typeof requestId!="string"||!requestId.trim()||!value)return;const frameGeneration=value.frameGeneration;if(typeof frameGeneration!="number"||!Number.isSafeInteger(frameGeneration)||frameGeneration!==this.frameGeneration)return;const hasResult=Object.prototype.hasOwnProperty.call(value,"result"),hasError=Object.prototype.hasOwnProperty.call(value,"error");hasResult!==hasError&&(hasError&&(typeof value.error!="string"||!value.error.trim())||this.post({channel:"lyra-mcp-app",version:1,type:"tool-result",requestId,...hasResult?{result:value.result}:{},...hasError?{error:value.error}:{}}))}render(){const resource=resolveResource(this.resource);if(!resource)return html`<div part="base"><p part="error">${this.localize("mcpAppUnavailable")}</p></div>`;const fallbackLabel=(!this.hasAttribute("aria-label")&&typeof this.accessibleLabel=="string"?this.accessibleLabel:"")||this.label||resource.resource.title||this.localize("mcpAppLabel"),label=purposeAccessibleLabel(this,fallbackLabel),frameGeneration=this.frameGeneration;return html`<div part="base">
|
|
2
2
|
${this.loaded?nothing:html`<p part="loading">${this.localize("mcpAppLoading")}</p>`}
|
|
3
3
|
${keyed(frameGeneration,html`<iframe
|
|
4
4
|
part="frame"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{finiteCount}from"../../../internal/numbers.js";import{eyeOffIcon}from"../../../internal/icons.js";import{srOnly}from"../../../internal/a11y.js";import{styles}from"./tool-timeline.styles.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.js";import{overallSemanticLabel}from"../semantic-owner.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{LYRA_DEFAULT_confirmApproved,LYRA_DEFAULT_confirmDenied,LYRA_DEFAULT_envListValueHidden,LYRA_DEFAULT_noData,LYRA_DEFAULT_retry,LYRA_DEFAULT_toolTimelineDetailsFor,LYRA_DEFAULT_toolTimelineLimit}from"../../../internal/default-strings.generated.js";const MAX_RENDERED_ENTRIES=500,MAX_REDACTION_PATHS=100,MAX_REDACTION_DEPTH=64,MAX_REDACTION_NODES=1e4,TOOL_STATUSES=new Set(["pending","running","success","error","denied"]),EMPTY_REDACTION_PATHS=Object.freeze([]),TOO_MANY_REDACTION_PATHS=Object.freeze(new Array(MAX_REDACTION_PATHS+1));function descriptorValue(value,property2){return getOwnDataDescriptor(value,property2)}function projectedRedactionFields(value){try{if(!Array.isArray(value))return EMPTY_REDACTION_PATHS;const lengthDescriptor=descriptorValue(value,"length");if(lengthDescriptor===MISSING_OWN_DATA_DESCRIPTOR||lengthDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||typeof lengthDescriptor.value!="number"||!Number.isSafeInteger(lengthDescriptor.value)||lengthDescriptor.value<0)return;if(lengthDescriptor.value>MAX_REDACTION_PATHS)return TOO_MANY_REDACTION_PATHS;const fields=[];for(let index=0;index<lengthDescriptor.value;index+=1){const field=descriptorValue(value,String(index));if(field===UNSAFE_OWN_DATA_DESCRIPTOR)return;fields.push(field===MISSING_OWN_DATA_DESCRIPTOR?void 0:field.value)}return Object.freeze(fields)}catch{return}}function projectToolTimelineEntry(value){try{if(value===null||typeof value!="object"||Array.isArray(value))return;const idDescriptor=descriptorValue(value,"id"),nameDescriptor=descriptorValue(value,"name"),argsDescriptor=descriptorValue(value,"args"),statusDescriptor=descriptorValue(value,"status"),resultDescriptor=descriptorValue(value,"result"),errorDescriptor=descriptorValue(value,"error"),sourceKeyDescriptor=descriptorValue(value,"sourceKey"),iconDescriptor=descriptorValue(value,"icon"),startedAtDescriptor=descriptorValue(value,"startedAt"),endedAtDescriptor=descriptorValue(value,"endedAt"),retryCountDescriptor=descriptorValue(value,"retryCount"),redactedFieldsDescriptor=descriptorValue(value,"redactedFields"),needsApprovalDescriptor=descriptorValue(value,"needsApproval"),approvedDescriptor=descriptorValue(value,"approved");if([idDescriptor,nameDescriptor,argsDescriptor,statusDescriptor,resultDescriptor,errorDescriptor,sourceKeyDescriptor,iconDescriptor,startedAtDescriptor,endedAtDescriptor,retryCountDescriptor,redactedFieldsDescriptor,needsApprovalDescriptor,approvedDescriptor].some(descriptor=>descriptor===UNSAFE_OWN_DATA_DESCRIPTOR))return;const valueOf=descriptor=>{if(!(descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR))return descriptor.value},id=valueOf(idDescriptor);if(typeof id!="string"||id.trim().length===0)return;const redactedFieldsValue=valueOf(redactedFieldsDescriptor),redactedFields=redactedFieldsValue===void 0?EMPTY_REDACTION_PATHS:projectedRedactionFields(redactedFieldsValue);if(redactedFields===void 0)return;const name=valueOf(nameDescriptor),status=valueOf(statusDescriptor),result=valueOf(resultDescriptor),error=valueOf(errorDescriptor),sourceKey=valueOf(sourceKeyDescriptor),icon=valueOf(iconDescriptor),startedAt=valueOf(startedAtDescriptor),endedAt=valueOf(endedAtDescriptor),retryCount=valueOf(retryCountDescriptor),needsApproval=valueOf(needsApprovalDescriptor),approved=valueOf(approvedDescriptor);return Object.freeze({source:value,id,name:typeof name=="string"?name:"",args:valueOf(argsDescriptor),status:TOOL_STATUSES.has(status)?status:"pending",...result===void 0?{}:{result},...typeof error=="string"?{error}:{},...typeof sourceKey=="string"?{sourceKey}:{},...typeof icon=="string"?{icon}:{},...typeof startedAt=="number"?{startedAt}:{},...typeof endedAt=="number"?{endedAt}:{},...typeof retryCount=="number"?{retryCount}:{},redactedFields,...typeof needsApproval=="boolean"?{needsApproval}:{},...typeof approved=="boolean"?{approved}:{}})}catch{return}}function entrySourceKey(entry){return entry.sourceKey?.trim()?entry.sourceKey:void 0}function entryIdentity(entry){return JSON.stringify([entrySourceKey(entry)??null,entry.id])}function entryCorrelation(entry){const sourceKey=entrySourceKey(entry);return sourceKey===void 0?{invocationId:entry.id}:{invocationId:entry.id,sourceKey}}function defaultFormatTimestamp(date,locale){return getDateTimeFormat(locale||"en",{hour:"numeric",minute:"2-digit"}).format(date)}function redactBranch(value,currentPath,paths,placeholder,budget,depth){if(paths.includes(currentPath)||depth>=MAX_REDACTION_DEPTH||budget.nodes>=MAX_REDACTION_NODES)return placeholder;if(budget.nodes++,!paths.some(p=>p.startsWith(`${currentPath}.`)))return value;if(Array.isArray(value))try{const result=[];for(let index=0;index<value.length;index++){if(budget.nodes>=MAX_REDACTION_NODES)return placeholder;result.push(redactBranch(value[index],`${currentPath}.${index}`,paths,placeholder,budget,depth+1))}return result}catch{return placeholder}if(value!==null&&typeof value=="object"){const result=Object.create(null);try{for(const key in value)if(Object.prototype.propertyIsEnumerable.call(value,key)){if(budget.nodes>=MAX_REDACTION_NODES)return placeholder;result[key]=redactBranch(value[key],`${currentPath}.${key}`,paths,placeholder,budget,depth+1)}}catch{return placeholder}return result}return value}function redactField(value,root,paths,placeholder){if(paths.length===0)return value;if(paths.length>MAX_REDACTION_PATHS)return placeholder;const relevant=[];for(const path of paths){if(typeof path!="string"||path.length>4096)return placeholder;if(!(path!==root&&!path.startsWith(`${root}.`))){if(path.split(".").length-1>MAX_REDACTION_DEPTH)return placeholder;relevant.push(path)}}return relevant.length===0?value:redactBranch(value,root,relevant,placeholder,{nodes:0},0)}class LyraToolTimeline extends LyraElement{constructor(){super(...arguments),this.entries=[],this.approvalEditable=!0,this.approvalPending=null,this.openedEntryIds=new Set,this.projectedEntriesCache=[],this.projectionTruncated=!1,this.redactionCache=new WeakMap,this.limitAnnouncementInitialized=!1,this.previouslyTruncated=!1,this.onDialogApprove=event=>{event.stopPropagation();const entry=this.reviewingEntry;if(entry===void 0)return;const key=entryIdentity(entry);if(this.emit("lr-tool-approval-decide",{...entryCorrelation(entry),approved:!0,args:event.detail.args},{cancelable:!0}).defaultPrevented&&this.entryStillNeedsApproval(key)){this.approvalPending="approve",event.preventDefault();return}this.approvalPending=null,this.reviewingEntryKey=void 0},this.onDialogDeny=event=>{event.stopPropagation();const entry=this.reviewingEntry;if(entry===void 0)return;const key=entryIdentity(entry);if(this.emit("lr-tool-approval-decide",{...entryCorrelation(entry),approved:!1},{cancelable:!0}).defaultPrevented&&this.entryStillNeedsApproval(key)){this.approvalPending="deny",event.preventDefault();return}this.approvalPending=null,this.reviewingEntryKey=void 0},this.onDialogClose=event=>{event.stopPropagation(),this.approvalPending=null,this.reviewingEntryKey=void 0}}static{this.defaultStrings={...super.defaultStrings,confirmApproved:LYRA_DEFAULT_confirmApproved,confirmDenied:LYRA_DEFAULT_confirmDenied,envListValueHidden:LYRA_DEFAULT_envListValueHidden,noData:LYRA_DEFAULT_noData,retry:LYRA_DEFAULT_retry,toolTimelineDetailsFor:LYRA_DEFAULT_toolTimelineDetailsFor,toolTimelineLimit:LYRA_DEFAULT_toolTimelineLimit}}static{this.ownedCollectionProperties=Object.freeze(["entries"])}static{this.identityCollectionProperties=Object.freeze(["entries"])}static{this.styles=[LyraElement.styles,styles,srOnly]}connectedCallback(){super.connectedCallback(),this.syncLimitAnnouncementSink(),this.limitAnnouncementInitialized=this.hasUpdated,this.previouslyTruncated=this.projectionTruncated}disconnectedCallback(){this.limitAnnouncementSink?.release(),this.limitAnnouncementSink=void 0,super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.limitAnnouncementSink?.release(),this.limitAnnouncementSink=void 0,this.syncLimitAnnouncementSink()}syncLimitAnnouncementSink(){!this.isConnected||this.limitAnnouncementSink?.element.ownerDocument===this.ownerDocument||(this.limitAnnouncementSink?.release(),this.limitAnnouncementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}))}get pendingApproval(){return this.approvalPending}willUpdate(changed){if(super.willUpdate(changed),!changed.has("entries"))return;this.rebuildProjection();const projected=this.projectedEntriesCache,identities=new Set(projected.map(entryIdentity));if(this.reviewingEntryKey!==void 0){const still=projected.find(entry=>entryIdentity(entry)===this.reviewingEntryKey);(!still||!(still.needsApproval&&still.approved===void 0))&&(this.reviewingEntryKey=void 0,this.approvalPending=null)}const opened=new Set([...this.openedEntryIds].filter(key=>identities.has(key)));opened.size!==this.openedEntryIds.size&&(this.openedEntryIds=opened)}updated(changed){super.updated(changed),this.limitAnnouncementInitialized&&this.projectionTruncated&&!this.previouslyTruncated&&this.limitAnnouncementSink?.announce(this.localize("toolTimelineLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(MAX_RENDERED_ENTRIES)})),this.limitAnnouncementInitialized=!0,this.previouslyTruncated=this.projectionTruncated}rebuildProjection(){const entries=Array.isArray(this.entries)?this.entries:[],projected=[],projectedIndex=new Map,reservedKeys=new Set(this.openedEntryIds);this.reviewingEntryKey!==void 0&&reservedKeys.add(this.reviewingEntryKey);const displacedReserved=new Map,seen=new Set;for(const sourceEntry of entries){const entry=projectToolTimelineEntry(sourceEntry);if(!entry)continue;const key=entryIdentity(entry);seen.has(key)||(seen.add(key),projected.length<MAX_RENDERED_ENTRIES?(projectedIndex.set(key,projected.length),projected.push(entry)):reservedKeys.has(key)&&displacedReserved.set(key,entry))}for(const[key,entry]of displacedReserved){if(projectedIndex.has(key))continue;let replacement=projected.length-1;for(;replacement>=0&&reservedKeys.has(entryIdentity(projected[replacement]));)replacement--;if(replacement<0)break;projectedIndex.delete(entryIdentity(projected[replacement])),projected[replacement]=entry,projectedIndex.set(key,replacement)}this.projectedEntriesCache=projected,this.projectionTruncated=seen.size>projected.length}get sortedEntries(){return this.projectedEntriesCache.map((entry,index)=>({entry,index})).sort((a,b)=>{const ak=Number.isFinite(a.entry.startedAt)?a.entry.startedAt:Number.POSITIVE_INFINITY,bk=Number.isFinite(b.entry.startedAt)?b.entry.startedAt:Number.POSITIVE_INFINITY;return ak!==bk?ak-bk:a.index-b.index}).map(({entry})=>entry)}get reviewingEntry(){return this.reviewingEntryKey===void 0?void 0:this.projectedEntriesCache.find(entry=>entryIdentity(entry)===this.reviewingEntryKey)}durationFor(entry){if(entry.startedAt==null||entry.endedAt==null)return;const diff=entry.endedAt-entry.startedAt;return Number.isFinite(diff)?diff:void 0}normalizedDate(ms){if(ms==null||!Number.isFinite(ms))return;const date=new Date(ms);return Number.isNaN(date.getTime())?void 0:date}onChipSelect(entry,event){if(event.stopPropagation(),entry.needsApproval&&entry.approved===void 0){this.reviewingEntryKey=entryIdentity(entry);return}this.emit("lr-tool-activate",entryCorrelation(entry))}entryStillNeedsApproval(key){const entries=Array.isArray(this.entries)?this.entries:[];for(const sourceEntry of entries){const projected=projectToolTimelineEntry(sourceEntry);if(projected!==void 0&&entryIdentity(projected)===key)return projected.needsApproval===!0&&projected.approved===void 0}return!1}finalizePendingApproval(){this.approvalPending!==null&&(this.approvalPending=null,this.reviewingEntryKey=void 0)}revertPendingApproval(){this.approvalPending!==null&&(this.approvalPending=null)}onDetailsToggle(entry,event){event.stopPropagation();const key=entryIdentity(entry),next=new Set(this.openedEntryIds);event.detail.open?next.add(key):next.delete(key),this.openedEntryIds=next}stopOwnedEvent(event){event.stopPropagation()}onRenderError(entry,event){event.stopPropagation(),this.emit("lr-tool-render-error",{...entryCorrelation(entry),...event.detail})}redactedEntry(entry,placeholder){const paths=entry.redactedFields,cached=this.redactionCache.get(entry);if(cached&&cached.sourceArgs===entry.args&&cached.sourceResult===entry.result&&cached.sourceError===entry.error&&cached.sourcePaths===paths&&cached.placeholder===placeholder)return cached;const redacted={sourceArgs:entry.args,sourceResult:entry.result,sourceError:entry.error,sourcePaths:paths,placeholder,args:redactField(entry.args,"args",paths,placeholder),result:entry.result===void 0?void 0:redactField(entry.result,"result",paths,placeholder),error:entry.error===void 0?void 0:redactField(entry.error,"error",paths,placeholder)};return this.redactionCache.set(entry,redacted),redacted}openedDetailsTemplate(entry,placeholder){const redacted=this.redactedEntry(entry,placeholder);return html`
|
|
1
|
+
var __decorate=function(decorators,target,key,desc){var c=arguments.length,r=c<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r};import{html,nothing}from"lit";import{property,state}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{LyraElement}from"../../../internal/lyra-element.js";import{getDateTimeFormat,getNumberFormat}from"../../../internal/intl-cache.js";import{finiteCount}from"../../../internal/numbers.js";import{eyeOffIcon}from"../../../internal/icons.js";import{srOnly}from"../../../internal/a11y.js";import{styles}from"./tool-timeline.styles.js";import{trueDefaultBooleanConverter}from"../../../internal/converters.js";import{overallSemanticLabel}from"../semantic-owner.js";import{acquireAnnouncementSink}from"../../../internal/announcer.js";import{getOwnDataDescriptor,MISSING_OWN_DATA_DESCRIPTOR,UNSAFE_OWN_DATA_DESCRIPTOR}from"../../../internal/data-descriptors.js";import{LYRA_DEFAULT_confirmApproved,LYRA_DEFAULT_confirmDenied,LYRA_DEFAULT_envListValueHidden,LYRA_DEFAULT_noData,LYRA_DEFAULT_retry,LYRA_DEFAULT_toolTimelineDetailsFor,LYRA_DEFAULT_toolTimelineLimit}from"../../../internal/default-strings.generated.js";const MAX_RENDERED_ENTRIES=500,MAX_REDACTION_PATHS=100,MAX_REDACTION_DEPTH=64,MAX_REDACTION_NODES=1e4,TOOL_STATUSES=new Set(["pending","running","success","error","denied"]),EMPTY_REDACTION_PATHS=Object.freeze([]),TOO_MANY_REDACTION_PATHS=Object.freeze(new Array(MAX_REDACTION_PATHS+1));function descriptorValue(value,property2){return getOwnDataDescriptor(value,property2)}function projectedRedactionFields(value){try{if(!Array.isArray(value))return EMPTY_REDACTION_PATHS;const lengthDescriptor=descriptorValue(value,"length");if(lengthDescriptor===MISSING_OWN_DATA_DESCRIPTOR||lengthDescriptor===UNSAFE_OWN_DATA_DESCRIPTOR||typeof lengthDescriptor.value!="number"||!Number.isSafeInteger(lengthDescriptor.value)||lengthDescriptor.value<0)return;if(lengthDescriptor.value>MAX_REDACTION_PATHS)return TOO_MANY_REDACTION_PATHS;const fields=[];for(let index=0;index<lengthDescriptor.value;index+=1){const field=descriptorValue(value,String(index));if(field===UNSAFE_OWN_DATA_DESCRIPTOR)return;fields.push(field===MISSING_OWN_DATA_DESCRIPTOR?void 0:field.value)}return Object.freeze(fields)}catch{return}}function projectToolTimelineEntry(value){try{if(value===null||typeof value!="object"||Array.isArray(value))return;const idDescriptor=descriptorValue(value,"id"),nameDescriptor=descriptorValue(value,"name"),argsDescriptor=descriptorValue(value,"args"),statusDescriptor=descriptorValue(value,"status"),resultDescriptor=descriptorValue(value,"result"),errorDescriptor=descriptorValue(value,"error"),sourceKeyDescriptor=descriptorValue(value,"sourceKey"),iconDescriptor=descriptorValue(value,"icon"),startedAtDescriptor=descriptorValue(value,"startedAt"),endedAtDescriptor=descriptorValue(value,"endedAt"),retryCountDescriptor=descriptorValue(value,"retryCount"),redactedFieldsDescriptor=descriptorValue(value,"redactedFields"),needsApprovalDescriptor=descriptorValue(value,"needsApproval"),approvedDescriptor=descriptorValue(value,"approved");if([idDescriptor,nameDescriptor,argsDescriptor,statusDescriptor,resultDescriptor,errorDescriptor,sourceKeyDescriptor,iconDescriptor,startedAtDescriptor,endedAtDescriptor,retryCountDescriptor,redactedFieldsDescriptor,needsApprovalDescriptor,approvedDescriptor].some(descriptor=>descriptor===UNSAFE_OWN_DATA_DESCRIPTOR))return;const valueOf=descriptor=>{if(!(descriptor===MISSING_OWN_DATA_DESCRIPTOR||descriptor===UNSAFE_OWN_DATA_DESCRIPTOR))return descriptor.value},id=valueOf(idDescriptor);if(typeof id!="string"||id.trim().length===0)return;const redactedFieldsValue=valueOf(redactedFieldsDescriptor),redactedFields=redactedFieldsValue===void 0?EMPTY_REDACTION_PATHS:projectedRedactionFields(redactedFieldsValue);if(redactedFields===void 0)return;const name=valueOf(nameDescriptor),status=valueOf(statusDescriptor),result=valueOf(resultDescriptor),error=valueOf(errorDescriptor),sourceKey=valueOf(sourceKeyDescriptor),icon=valueOf(iconDescriptor),startedAt=valueOf(startedAtDescriptor),endedAt=valueOf(endedAtDescriptor),retryCount=valueOf(retryCountDescriptor),needsApproval=valueOf(needsApprovalDescriptor),approved=valueOf(approvedDescriptor);return Object.freeze({source:value,id,name:typeof name=="string"?name:"",args:valueOf(argsDescriptor),status:TOOL_STATUSES.has(status)?status:"pending",...result===void 0?{}:{result},...typeof error=="string"?{error}:{},...typeof sourceKey=="string"?{sourceKey}:{},...typeof icon=="string"?{icon}:{},...typeof startedAt=="number"?{startedAt}:{},...typeof endedAt=="number"?{endedAt}:{},...typeof retryCount=="number"?{retryCount}:{},redactedFields,...typeof needsApproval=="boolean"?{needsApproval}:{},...typeof approved=="boolean"?{approved}:{}})}catch{return}}function entrySourceKey(entry){return entry.sourceKey?.trim()?entry.sourceKey:void 0}function entryIdentity(entry){return JSON.stringify([entrySourceKey(entry)??null,entry.id])}function entryCorrelation(entry){const sourceKey=entrySourceKey(entry);return sourceKey===void 0?{invocationId:entry.id}:{invocationId:entry.id,sourceKey}}function defaultFormatTimestamp(date,locale){return getDateTimeFormat(locale,{hour:"numeric",minute:"2-digit"}).format(date)}function redactBranch(value,currentPath,paths,placeholder,budget,depth){if(paths.includes(currentPath)||depth>=MAX_REDACTION_DEPTH||budget.nodes>=MAX_REDACTION_NODES)return placeholder;if(budget.nodes++,!paths.some(p=>p.startsWith(`${currentPath}.`)))return value;if(Array.isArray(value))try{const result=[];for(let index=0;index<value.length;index++){if(budget.nodes>=MAX_REDACTION_NODES)return placeholder;result.push(redactBranch(value[index],`${currentPath}.${index}`,paths,placeholder,budget,depth+1))}return result}catch{return placeholder}if(value!==null&&typeof value=="object"){const result=Object.create(null);try{for(const key in value)if(Object.prototype.propertyIsEnumerable.call(value,key)){if(budget.nodes>=MAX_REDACTION_NODES)return placeholder;result[key]=redactBranch(value[key],`${currentPath}.${key}`,paths,placeholder,budget,depth+1)}}catch{return placeholder}return result}return value}function redactField(value,root,paths,placeholder){if(paths.length===0)return value;if(paths.length>MAX_REDACTION_PATHS)return placeholder;const relevant=[];for(const path of paths){if(typeof path!="string"||path.length>4096)return placeholder;if(!(path!==root&&!path.startsWith(`${root}.`))){if(path.split(".").length-1>MAX_REDACTION_DEPTH)return placeholder;relevant.push(path)}}return relevant.length===0?value:redactBranch(value,root,relevant,placeholder,{nodes:0},0)}class LyraToolTimeline extends LyraElement{constructor(){super(...arguments),this.entries=[],this.approvalEditable=!0,this.approvalPending=null,this.openedEntryIds=new Set,this.projectedEntriesCache=[],this.projectionTruncated=!1,this.redactionCache=new WeakMap,this.limitAnnouncementInitialized=!1,this.previouslyTruncated=!1,this.onDialogApprove=event=>{event.stopPropagation();const entry=this.reviewingEntry;if(entry===void 0)return;const key=entryIdentity(entry);if(this.emit("lr-tool-approval-decide",{...entryCorrelation(entry),approved:!0,args:event.detail.args},{cancelable:!0}).defaultPrevented&&this.entryStillNeedsApproval(key)){this.approvalPending="approve",event.preventDefault();return}this.approvalPending=null,this.reviewingEntryKey=void 0},this.onDialogDeny=event=>{event.stopPropagation();const entry=this.reviewingEntry;if(entry===void 0)return;const key=entryIdentity(entry);if(this.emit("lr-tool-approval-decide",{...entryCorrelation(entry),approved:!1},{cancelable:!0}).defaultPrevented&&this.entryStillNeedsApproval(key)){this.approvalPending="deny",event.preventDefault();return}this.approvalPending=null,this.reviewingEntryKey=void 0},this.onDialogClose=event=>{event.stopPropagation(),this.approvalPending=null,this.reviewingEntryKey=void 0}}static{this.defaultStrings={...super.defaultStrings,confirmApproved:LYRA_DEFAULT_confirmApproved,confirmDenied:LYRA_DEFAULT_confirmDenied,envListValueHidden:LYRA_DEFAULT_envListValueHidden,noData:LYRA_DEFAULT_noData,retry:LYRA_DEFAULT_retry,toolTimelineDetailsFor:LYRA_DEFAULT_toolTimelineDetailsFor,toolTimelineLimit:LYRA_DEFAULT_toolTimelineLimit}}static{this.ownedCollectionProperties=Object.freeze(["entries"])}static{this.identityCollectionProperties=Object.freeze(["entries"])}static{this.styles=[LyraElement.styles,styles,srOnly]}connectedCallback(){super.connectedCallback(),this.syncLimitAnnouncementSink(),this.limitAnnouncementInitialized=this.hasUpdated,this.previouslyTruncated=this.projectionTruncated}disconnectedCallback(){this.limitAnnouncementSink?.release(),this.limitAnnouncementSink=void 0,super.disconnectedCallback()}adoptedCallback(){super.adoptedCallback(),this.limitAnnouncementSink?.release(),this.limitAnnouncementSink=void 0,this.syncLimitAnnouncementSink()}syncLimitAnnouncementSink(){!this.isConnected||this.limitAnnouncementSink?.element.ownerDocument===this.ownerDocument||(this.limitAnnouncementSink?.release(),this.limitAnnouncementSink=acquireAnnouncementSink("polite",{document:this.ownerDocument,source:this}))}get pendingApproval(){return this.approvalPending}willUpdate(changed){if(super.willUpdate(changed),!changed.has("entries"))return;this.rebuildProjection();const projected=this.projectedEntriesCache,identities=new Set(projected.map(entryIdentity));if(this.reviewingEntryKey!==void 0){const still=projected.find(entry=>entryIdentity(entry)===this.reviewingEntryKey);(!still||!(still.needsApproval&&still.approved===void 0))&&(this.reviewingEntryKey=void 0,this.approvalPending=null)}const opened=new Set([...this.openedEntryIds].filter(key=>identities.has(key)));opened.size!==this.openedEntryIds.size&&(this.openedEntryIds=opened)}updated(changed){super.updated(changed),this.limitAnnouncementInitialized&&this.projectionTruncated&&!this.previouslyTruncated&&this.limitAnnouncementSink?.announce(this.localize("toolTimelineLimit",void 0,{count:getNumberFormat(this.effectiveLocale).format(MAX_RENDERED_ENTRIES)})),this.limitAnnouncementInitialized=!0,this.previouslyTruncated=this.projectionTruncated}rebuildProjection(){const entries=Array.isArray(this.entries)?this.entries:[],projected=[],projectedIndex=new Map,reservedKeys=new Set(this.openedEntryIds);this.reviewingEntryKey!==void 0&&reservedKeys.add(this.reviewingEntryKey);const displacedReserved=new Map,seen=new Set;for(const sourceEntry of entries){const entry=projectToolTimelineEntry(sourceEntry);if(!entry)continue;const key=entryIdentity(entry);seen.has(key)||(seen.add(key),projected.length<MAX_RENDERED_ENTRIES?(projectedIndex.set(key,projected.length),projected.push(entry)):reservedKeys.has(key)&&displacedReserved.set(key,entry))}for(const[key,entry]of displacedReserved){if(projectedIndex.has(key))continue;let replacement=projected.length-1;for(;replacement>=0&&reservedKeys.has(entryIdentity(projected[replacement]));)replacement--;if(replacement<0)break;projectedIndex.delete(entryIdentity(projected[replacement])),projected[replacement]=entry,projectedIndex.set(key,replacement)}this.projectedEntriesCache=projected,this.projectionTruncated=seen.size>projected.length}get sortedEntries(){return this.projectedEntriesCache.map((entry,index)=>({entry,index})).sort((a,b)=>{const ak=Number.isFinite(a.entry.startedAt)?a.entry.startedAt:Number.POSITIVE_INFINITY,bk=Number.isFinite(b.entry.startedAt)?b.entry.startedAt:Number.POSITIVE_INFINITY;return ak!==bk?ak-bk:a.index-b.index}).map(({entry})=>entry)}get reviewingEntry(){return this.reviewingEntryKey===void 0?void 0:this.projectedEntriesCache.find(entry=>entryIdentity(entry)===this.reviewingEntryKey)}durationFor(entry){if(entry.startedAt==null||entry.endedAt==null)return;const diff=entry.endedAt-entry.startedAt;return Number.isFinite(diff)?diff:void 0}normalizedDate(ms){if(ms==null||!Number.isFinite(ms))return;const date=new Date(ms);return Number.isNaN(date.getTime())?void 0:date}onChipSelect(entry,event){if(event.stopPropagation(),entry.needsApproval&&entry.approved===void 0){this.reviewingEntryKey=entryIdentity(entry);return}this.emit("lr-tool-activate",entryCorrelation(entry))}entryStillNeedsApproval(key){const entries=Array.isArray(this.entries)?this.entries:[];for(const sourceEntry of entries){const projected=projectToolTimelineEntry(sourceEntry);if(projected!==void 0&&entryIdentity(projected)===key)return projected.needsApproval===!0&&projected.approved===void 0}return!1}finalizePendingApproval(){this.approvalPending!==null&&(this.approvalPending=null,this.reviewingEntryKey=void 0)}revertPendingApproval(){this.approvalPending!==null&&(this.approvalPending=null)}onDetailsToggle(entry,event){event.stopPropagation();const key=entryIdentity(entry),next=new Set(this.openedEntryIds);event.detail.open?next.add(key):next.delete(key),this.openedEntryIds=next}stopOwnedEvent(event){event.stopPropagation()}onRenderError(entry,event){event.stopPropagation(),this.emit("lr-tool-render-error",{...entryCorrelation(entry),...event.detail})}redactedEntry(entry,placeholder){const paths=entry.redactedFields,cached=this.redactionCache.get(entry);if(cached&&cached.sourceArgs===entry.args&&cached.sourceResult===entry.result&&cached.sourceError===entry.error&&cached.sourcePaths===paths&&cached.placeholder===placeholder)return cached;const redacted={sourceArgs:entry.args,sourceResult:entry.result,sourceError:entry.error,sourcePaths:paths,placeholder,args:redactField(entry.args,"args",paths,placeholder),result:entry.result===void 0?void 0:redactField(entry.result,"result",paths,placeholder),error:entry.error===void 0?void 0:redactField(entry.error,"error",paths,placeholder)};return this.redactionCache.set(entry,redacted),redacted}openedDetailsTemplate(entry,placeholder){const redacted=this.redactedEntry(entry,placeholder);return html`
|
|
2
2
|
<lr-tool-result-view
|
|
3
3
|
part="entry-result"
|
|
4
4
|
tool-name=${entry.name}
|
|
@@ -2,6 +2,11 @@ import{type TemplateResult,type PropertyValues}from'lit';import{LyraElement}from
|
|
|
2
2
|
/** Bubble radius. Ignored by chart types that do not consume a radius. */
|
|
3
3
|
readonly r?:number;
|
|
4
4
|
/**
|
|
5
|
+
* Optional caller-owned primitive identity retained by activation events. Objects, symbols,
|
|
6
|
+
* and non-finite numbers are ignored so event payloads remain bounded and descriptor-safe.
|
|
7
|
+
*/
|
|
8
|
+
readonly id?:string|number;
|
|
9
|
+
/**
|
|
5
10
|
* Caller-owned per-point label retained verbatim by events/export and interpolated into the
|
|
6
11
|
* localized whole-point message used by descriptions, tables, and keyboard announcements.
|
|
7
12
|
*/
|
|
@@ -146,9 +151,13 @@ export interface LyraChartDatumActivateDetail<TKind extends LyraChartDatumKind=L
|
|
|
146
151
|
* data-table value is activated, or when Enter/Space activates the keyboard-current canvas datum.
|
|
147
152
|
* `detail: { datasetIndex: number, index: number, label: string |
|
|
148
153
|
* undefined, value: unknown }`. For scatter/bubble data, `label` prefers the per-point label and
|
|
149
|
-
* `value`
|
|
154
|
+
* `value` contains the complete `LyraChartPoint` (`x`, `y`, optional `r`, optional `id`, optional
|
|
155
|
+
* `label`). A primitive `id` is retained for application navigation and selection; unsafe or
|
|
156
|
+
* non-finite values are omitted. The heterogeneous event value is typed `unknown`; consumers
|
|
157
|
+
* must narrow the value itself before reading point fields.
|
|
150
158
|
* @event lr-datum-activate - Family-normalized activation event. Its detail adds `kind`
|
|
151
|
-
* (`bar`, `point`, `segment`, or `slice`) to the `lr-point-click` detail.
|
|
159
|
+
* (`bar`, `point`, `segment`, or `slice`) to the `lr-point-click` detail. For scatter/bubble
|
|
160
|
+
* points its `value` is the same `LyraChartPoint`, including a safe primitive `id` when present.
|
|
152
161
|
* @event lr-before-legend-visibility-change - Cancelable proposal emitted before a DOM legend
|
|
153
162
|
* toggle changes state. `detail` contains the target `datasetIndex`, its proposed `visible`
|
|
154
163
|
* value, and the complete canonical proposed `hiddenDatasets` snapshot.
|
|
@@ -516,7 +525,7 @@ private loading;
|
|
|
516
525
|
*/
|
|
517
526
|
private loadFailed;private loadLibrary;private loadZoomFeature;private loadDataLabelsFeature;private loadAnnotationFeature;private loadGeneration;private zoomLoadGeneration;private dataLabelsLoadGeneration;private annotationLoadGeneration;private zoomFeatureState;private dataLabelsFeatureState;private annotationFeatureState;private dataLabelsPlugin?;private annotationPlugin?;private stopAnnotationRegistrationWatch?;private zoomed;private visible;private intersectionObserver?;private intersectionGeneration;private reducedMotionQuery?;private reducedMotionWindow?;private canvasEl?;private configSlotEl?;
|
|
518
527
|
/** The current Chart.js instance. Read it only while the element is connected and loaded. */
|
|
519
|
-
chart?:LyraChartInstance;private scaledSliceDatasets;private chartJsModule?;private resizeObserver?;private resizeDrawFrame?;private resizeDrawFrameOwner?;private lastObservedInlineSize?;private autoLegendPosition;private resolvedChartArea?;private chartAreaUpdateQueued;private builtType?;private builtPlugins;private visualDatasetSourceIndexes?;private visualRowSourceIndexes?;private suppressZoomComplete;private descriptionId;private keyboardDatumIndex;private keyboardDatumAnnouncement;
|
|
528
|
+
chart?:LyraChartInstance;private scaledSliceDatasets;private chartJsModule?;private resizeObserver?;private resizeDrawFrame?;private resizeDrawFrameOwner?;private lastObservedInlineSize?;private autoLegendPosition;private resolvedChartArea?;private chartAreaUpdateQueued;private readonly chartAreaPlugin;private builtType?;private builtPlugins;private visualDatasetSourceIndexes?;private visualRowSourceIndexes?;private suppressZoomComplete;private descriptionId;private keyboardDatumIndex;private keyboardDatumAnnouncement;
|
|
520
529
|
/** Shared document-level regions that carry announcements. The visually hidden datum copy is an
|
|
521
530
|
* inspection mirror only because shadow-root live regions are not consistently spoken. */
|
|
522
531
|
private politeAnnouncementSink?;private assertiveAnnouncementSink?;private lastDataTruncationAnnouncement;
|